From 8bf5126a758c7759948ed4db4c245079bd1ba407 Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 7 Sep 2017 11:00:01 -0500 Subject: [PATCH 01/65] changed formatting to show distance and heading: Former-commit-id: ba72b7524a53cb5d66ee28a55b7116d447329c90 --- dump1090/anet.o | Bin 21540 -> 17960 bytes dump1090/dump1090.REMOVED.git-id | 2 +- dump1090/dump1090.o | Bin 0 -> 37100 bytes dump1090/dump1090.o.REMOVED.git-id | 1 - dump1090/interactive.c | 140 +++++++++++++++++++---------- dump1090/interactive.o | Bin 25828 -> 23896 bytes dump1090/mode_ac.o | Bin 29920 -> 14044 bytes dump1090/mode_s.o.REMOVED.git-id | 2 +- dump1090/net_io.o | Bin 44176 -> 40816 bytes dump1090/view1090.REMOVED.git-id | 2 +- dump1090/view1090.o | Bin 28860 -> 19276 bytes 11 files changed, 97 insertions(+), 50 deletions(-) create mode 100644 dump1090/dump1090.o delete mode 100644 dump1090/dump1090.o.REMOVED.git-id diff --git a/dump1090/anet.o b/dump1090/anet.o index dd11760b73635039c805f6e8d716d251defe3a32..78e8fd76107e659002a738be646d7f642ec72bdb 100644 GIT binary patch literal 17960 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 diff --git a/dump1090/dump1090.REMOVED.git-id b/dump1090/dump1090.REMOVED.git-id index 5370a05..902ead9 100644 --- a/dump1090/dump1090.REMOVED.git-id +++ b/dump1090/dump1090.REMOVED.git-id @@ -1 +1 @@ -7b970ac76b375322e10d18752db2799393e60c0a \ No newline at end of file +a12e9b1c39fb3432f7175cecd1ca3d8fc490e2f5 \ No newline at end of file diff --git a/dump1090/dump1090.o b/dump1090/dump1090.o new file mode 100644 index 0000000000000000000000000000000000000000..d4608b9696f38fcb7f05f1271830b0f344972cc3 GIT binary patch literal 37100 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 SaAeK5bw~BGt03Rw`Tqet(C&-? literal 0 HcmV?d00001 diff --git a/dump1090/dump1090.o.REMOVED.git-id b/dump1090/dump1090.o.REMOVED.git-id deleted file mode 100644 index 4e48925..0000000 --- a/dump1090/dump1090.o.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -508f7b0c68cbd5c325be54851803e4b182bc5122 \ No newline at end of file diff --git a/dump1090/interactive.c b/dump1090/interactive.c index a7fa148..1ee1d28 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -29,6 +29,8 @@ // #include "dump1090.h" +#include + // // ============================= Utility functions ========================== // @@ -437,8 +439,9 @@ void interactiveShowData(void) { //\xiB[30;47m if (Modes.interactive_rtl1090 == 0) { printf ( -//"Hex Mode Sqwk Flight Alt Spd Hdg Lat Long Sig Msgs Ti%c\n", progress); -"\x1B[30;47m\e[1mFlight Alt Spd Lat Long \n", progress); +// original version "Hex Mode Sqwk Flight Alt Spd Hdg Lat Long Sig Msgs Ti%c\n", progress); +// pitft version "\x1B[30;47m\e[1mFlight Alt Spd Lat Long \n", progress); + "\x1B[30;47m\e[1mFlight Alt Spd Dist Dir", progress); } else { printf ( "Hex Flight Alt V/S GS TT SSR G*456^ Msgs Seen %c\n", progress); @@ -446,9 +449,8 @@ void interactiveShowData(void) { // printf( //"---------------------------------------"); printf("\x1B[37;40m"); - + int numNoDir = 0; while(a && (count < Modes.interactive_rows)) { - if ((now - a->seen) < Modes.interactive_display_ttl) { int msgs = a->messages; @@ -465,10 +467,10 @@ void interactiveShowData(void) { char strGs[5] = " "; // Convert units to metric if --metric was specified - if (Modes.metric) { + //if (Modes.metric) { altitude = (int) (altitude / 3.2828); speed = (int) (speed * 1.852); - } + //} if (a->bFlags & MODES_ACFLAGS_SQUAWK_VALID) { snprintf(strSquawk,5,"%04x", a->modeA);} @@ -482,54 +484,100 @@ void interactiveShowData(void) { if (msgs > 99999) { msgs = 99999;} - if (Modes.interactive_rtl1090) { // RTL1090 display mode + // Dump1090 display mode + char strMode[5] = " "; + char strLat[8] = " "; + char strLon[9] = " "; - if (a->bFlags & MODES_ACFLAGS_ALTITUDE_VALID) { - snprintf(strFl,6,"F%03d",(altitude/100)); - } - printf("%06x %-8s %-4s %-3s %-3s %4s %-6d %-2d\n", - a->addr, a->flight, strFl, strGs, strTt, strSquawk, msgs, (int)(now - a->seen)); + char strD[8] = " "; + char cLat = ' '; + char cLon = ' '; - } else { // Dump1090 display mode - char strMode[5] = " "; - char strLat[8] = " "; - char strLon[9] = " "; - unsigned char * pSig = a->signalLevel; - unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] + - pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 3; + unsigned char * pSig = a->signalLevel; + unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] + + pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 3; - if ((flags & MODEAC_MSG_FLAG) == 0) { - strMode[0] = 'S'; - } else if (flags & MODEAC_MSG_MODEA_ONLY) { - strMode[0] = 'A'; - } - if (flags & MODEAC_MSG_MODEA_HIT) {strMode[2] = 'a';} - if (flags & MODEAC_MSG_MODEC_HIT) {strMode[3] = 'c';} - - if (a->bFlags & MODES_ACFLAGS_LATLON_VALID) { - snprintf(strLat, 8,"%7.03f", a->lat); - snprintf(strLon, 9,"%8.03f", a->lon); - } - - if (a->bFlags & MODES_ACFLAGS_AOG) { - snprintf(strFl, 6," grnd"); - } else if (a->bFlags & MODES_ACFLAGS_ALTITUDE_VALID) { - snprintf(strFl, 6, "%5d", altitude); - } - - //printf("%06X %-4s %-4s %-8s %5s %3s %3s %7s %8s %3d %5d %2d\n", - //a->addr, strMode, strSquawk, a->flight, strFl, strGs, strTt, - //strLat, strLon, signalAverage, msgs, (int)(now - a->seen)); - - printf("\n\x1B[%d;%dm%-8s %5s %3s %7s %8s",a->addr % 12 > 6, 31 + a->addr % 6, - a->flight, strFl, strGs, - strLat, strLon); + if (a->bFlags & MODES_ACFLAGS_AOG) { + snprintf(strFl, 6," grnd"); + } else if (a->bFlags & MODES_ACFLAGS_ALTITUDE_VALID) { + snprintf(strFl, 6, "%5d", altitude); } - count++; + + + if ((flags & MODEAC_MSG_FLAG) == 0) { + strMode[0] = 'S'; + } else if (flags & MODEAC_MSG_MODEA_ONLY) { + strMode[0] = 'A'; + } + if (flags & MODEAC_MSG_MODEA_HIT) {strMode[2] = 'a';} + if (flags & MODEAC_MSG_MODEC_HIT) {strMode[3] = 'c';} + + if (a->bFlags & MODES_ACFLAGS_LATLON_VALID) { + + float dLon = a->lon+87.6651033; + float dLat = a->lat-***REMOVED***; + + snprintf(strLat, 8,"%7.03f", dLat); + snprintf(strLon, 9,"%8.03f", dLon); + + float x = dLon * cos(((a->lat+***REMOVED***)/2.0f) * M_PI / 180.0f); + float y = dLat; + float d = sqrt(x*x + y*y) * 6371.0f; + + if(fabsf(dLon) < .01 && fabsf(dLat) > fabsf(dLon)) { + cLon = ' '; + } else { + if(a->lon < 0) { + cLon = 'W'; + } else { + cLon = 'E'; + } + } + + + if(fabsf(dLat) < .01 && fabsf(dLon) > fabsf(dLat)) { + cLat = ' '; + } else { + if(a->lat < 0) { + cLat = 'S'; + } else { + cLat = 'N'; + } + } + + snprintf(strD, 8,"%7.03f", d); + + printf("\n\x1B[%d;31m%-8s \x1B[%d;32m%5s \x1B[%d;33m%3s \x1B[%d;34m%8s \x1B[%d;36m%c%c", + count%2, a->flight, + count%2, strFl, + count%2, strGs, + count%2, strD, + count%2, cLat, cLon); + + count++; + } else { + numNoDir++; + } + + //printf("%06X %-4s %-4s %-8s %5s %3s %3s %7s %8s %3d %5d %2d\n", + //a->addr, strMode, strSquawk, a->flight, strFl, strGs, strTt, + //strLat, strLon, signalAverage, msgs, (int)(now - a->seen)); + + // printf("\n\x1B[%d;%dm%-8s %5s %3s %7s %8s",a->addr % 12 > 6, 31 + a->addr % 6, + // a->flight, strFl, strGs, + // strLat, strLon); } } a = a->next; } + + while(count < 14) { + printf("\n"); + count++; + } + + printf("\x1B[30;47m\e[1m\n%+3d %c \x1B[37;40m",numNoDir,progress); + fflush(stdout); } // //========================================================================= diff --git a/dump1090/interactive.o b/dump1090/interactive.o index 4feddcfce407b1cb5978604c1a5123f338b2b6e5..a151a6eac88edb2382ccd1675d1ae207a1e64866 100644 GIT binary patch literal 23896 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 X81Y3guSEB}7OKmF4*I(0?^ga7_xlt= literal 25828 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 N^=%E*@?YIB_P;7Fkk|kK literal 29920 zcmeHw3wTu3x%S$#CzCys5C($mfDuP7ib|3RAfjRkauF~fHx(;&GRaJmsgukwGXYd8 z5wPAsv9;CH;>mclEj{(`vFh)!J$epkZN0U{YX90+&q;`>*50tSVyiXheb@eWGF*zZ z|2ehK)9i;m?|Rqz*0;X(t#7Tp_GYqY)BO4chG8i8Fw|r<$dpR2)g?vKHB45cRk^x9 zytn6p-FtgV)ykevDfQ3$FRc1m<=!Rx9t!R4dANITPnlZLW2zN*8+G{?R9*gw%}V{) z16kFOf5B+TKjCfoBEp79;Ghs-J;akvhbE}&+cvAckb)z+p?^_yG&iw(}{Xd zr1L$+#zj4!Q0g1d)#EWXcb5jY_bDUaQyR?oyx-sd^VX?decn*M=h^Rd?)&ttJ>AdE z&iCx8ZR*~F@~?G2(DOj>`#lEQOTt#Oc1!m|o!{>*^Z??#t(U zybas?{IKJMVCTL|e$~0}IHlfDYd`;*QkV96cih!ysJeZ{=^J~z>Fs^Kn}bHWa-XLmKjP>8{bMb4 zSD(T-KZiO$={r3w5PT2}1@{$)^5r3LGc!kwzfcI~(W$o=ENw_6{eO278N{ z4>ZY3pp&S|dl}QdP~*s9;ko-fYD>4{zpg&wn=keEuL*bcf*0O(|;s>At<%>|!WB5vSX3^D9>9LCHicslmC^64$ zMJ4Y(s@!rN>wAknh9K`ySJlbt@Y7{*mcY>kgK_&vei_wFK#Yrbqd|P79Sm zQsF)>1z2Y~=a8kARhMJZW|*2ZXsCO`ZEsZtf|nWIl=>aCx!vZU!&9;2-hny$mM# zCapxW_(eL)H?0SP){V&UoxvoPJ_Yp7gbltKOb+w<7K{KZ+XUiUNVCeGK|g(qUSoyg z2tF%(=QcpZvZ#MHMU-_hW$GC2UaK3QzB#%_*6~cwW4hEj03&?!DH9z28|WFOhE@2^ zxrwdqpx6bv;TNd2Ug!P+5$9XN_;&jJIf!a+*vfkqTc-qjwbkN$vmZD5oSm#i_k+Bf6Ex!T&6R){**E`+GIwnll!Bh%MPE4@ELOU1SI$nb7OL&ejyk=G%B zi_fMl9kZ~l zWZF{REzsZ}_YCTe*oovwUn#uq4g7lrh-H8T{)0(X-W*eb-BXbATJJ(ZU=P!l^;sAa zc%13d^2Uy46?kGC#DfT%??I=I#TsOc(h=%a#arOrI|JYDL^W$N>ppckCn=;Qa9kTw7>F+Q-(W-!C;JZvuws;i?e2)&8Vm(Ef zy-bI#rObamfwpE^pP|n0GhJsr1cwD)xDIs}TK7@rMe3=ySS#=Yrk7c1%Ktygtg_CB zBLhEVdbRZ)^}j@!HC7}0@)M>TEM9K{FEbsp9>=H!USYb`dWSmylj)>29IXfbi#DXK zA2Z#}^oH_eG^YYRS0mk7o=mk%`UWe^cK5OF4rf?;cc8`F9S<|9<7hbiPInjo1RvqR zPYCsjY(y_%k=9^d#%$rj6Y*t%W>Nq>~yI$9d!dgr#V4qh{{# z%z9&W*>fIyK0`R9%l3NgT^!kyblHm@`vKM)uh~l;`&^by(ClT{8C|ae6E*Ah*kMkJ zNt(Utv3aQsoUGaF9{WtzJ4Lf!cq-cCm=2RQ+wZY!DS4`9Z=pRzVBj>(-tpMmXy@sg zz2~uCWeZa@Q>OiGMpTt%Uei9EeW=#VGVN}b)o4~~+Ie~+tXa^sz3fq~W}{5InUYgA zt1xX|3Io$Lt2FJ)XxVh_myl`m;v6_bmrXS7MbtS%v&p7i!jV2xvngngT4rh%HtjFa z>a#SPZrbIHg0nT7Y1%hZ%Q>3OGVKT0!Ys||O#66RcCKdgOuL9WKcd+})2^XkW@}b& z+N0Teoo35S`wmLZHMrWWHtpZAY@TKfragfXGG9x!n)Xt*u+ZRQku>f9q+b>pdi65x zn^|wM!Np^PX?tk(5?ybjX>Vr>OASu`PO~CCZ-EM2XmI(t)3j5px5D7XZKr8BuzxEx z%bWJoWUDm0*R+2^c9CYgOnW`q#hTrR_GsB9n%!^O57UFIHG9akx&8z$)$9?|ZlYx$ zGY(*mJ!;xNWAsFH**8sl7+Hg6Pnq^zWKqqYGwoZbvr)6Xru`+h*QD8tru{ObHKy51 zru`;aT(g%=+sAs%nssB0$XYae)wG|ZWUFScoAz{$Q9`p{n0AKV{kUfP5v{bkOx}t;S!0``DsY1?s2iI|;0kb~CiDES(3#sb zS?GV5{@Sidz5g0|ntj`$$!h;{wt1T~fBYlZ(NAg8>eri_PaE9b zr2WHL=XPDE)Bi1+_8CpK`t?5MvzpxC_fWwdnrs`}jFtRzI=#cMcPXFO{nUX#2td=F!2^za$#_#H69xPA&+=V2k@jGZmmw^X(vn~}kzvW<+{ z^xz2}SH_L3@kyNH7Nai?y`R*khMQQrpL8`#Zzkof@VK>bt+9=C7w8F%iJZ_i7}{|j z3U6oWUefE~V27So4myK%b!h_hgto9UZlUZ~G^-W%Yt5z#n>LD)(}b-78+Q^7)D^e0 zupMe{rJ9E|gBs1gj7Kadv_p+%_l_om8qFRD8+R!J)7Zg^uaef$R!u!N=t|mp8%rmW zzQ$5bpCDbw(oeCpkF18OF4#9Iswxv^}b z*4d&%$XKo>t$}FCF5Z$(dJ>CL$(NZtImb2qSKJL2p31%!G%uvP%V^UdpiCK1h*$88#F9?5mCaRK>k01*VG$e^y z-qFe|JG>b)EYJ*I}>7lp+$?zNdvAX^vp08m9s|a zNorAf4GM?Z#-N_EK|M+h9|jTD50)2*j3`G_v&P_lN}EvRnoy3amSZmKjMDls6^}#Z z0in@@`e&ldF0d1{LR8Rf&@lsjETY9@3rf+z@zuucF^+>y8MCOIzO1YG?0I7-T3Iw; z3xoHB=?BqqpyF7To;aYWXi(7|j-n70Q4|(Y^dzY%bbMh=#{j7}K@6ZELKN4D0X3kL z1`U`!hORt$(7@SaSmBhxhMbJag;gk_k4}6VY8j!9lSHi|H0b0q0-pkT)o+buT}6j~K&=Y=Wy|`G5)vxe8WcswHuHRBacLl?}CKu(dURN^%1y zsk-zbz;s>dQdZjOBp(Gh)?Vt?Cps;KbxRvj(NwoRx`~OMgUV=u&S!!h@ThPXA3RY# z({3|bi0$pd2}|5Ib^f1fl}Ziu(WB{h?B>HbeeA^N{Wy!&Mm6vF2}T#mqk|cqE|TX4 zGt4fMy*MqEzR!m`W*6D31vy^rf=AHnVzt&$OY%)8qe-_zLOTZ}*l~7pAj9o3GMp-C zK_B$U!Kj^>Q{!*<1n^%KSylPLq8}h} zl;ShSO`W(_RZlk5=<*33r^%y;i)kMqag^f1_Ks0($OFgdsPRXU`!iyyaEQ9xxrcyl zI%2>!9VuWxQ1k=X*K|n0{*~H0Mza{Oe}Jm+@z8NZh-mqbobg=BIE+^EbN1 z8`|U^Y1=LlV-x9Y5%o8{_81r+E54}=w;rQzWk zp%W)`$g_w-9d6d34$AAJ5}$0zP%BufAIqy1gf+TPmpfugg^*~#iEj#1aG_I5pdi}y ziS3Zl#}0hPw2PM!SP730Hv$}IE*CldB+RP?FDFdL=~o%I-=y_8Pve6x-bk17`=tja z4L(l^f{v>29r~bb6qY+wIejq1ywM+>ZZQmE5j>6N#5`;#=c{ z2JMA`aC9GP7O4#4sq0lpa4;c^ls;nkq}7V{y6b)ngfpV~*6pb_&g_giS^28g_umR-Bl1 zuEZ)(r%x*g3|c&Wujin=E@|Q~aMBAiPwry!Eu2_72%LTvYWOB>LSdm=>Vgne@v2_1 z)UZ)$sgA|efmZ7dt&O~e1?3Cfa?0m%;%P78UYySVK`^z;DIoCw=bVDVnyZk@$MnS8 zal$YHHQg4p`qOIaSe{|$;g+@Ol*97Us&?YENv^=`!v#LDQd;>B463;BFVJB9|2GRG z-X1jKFVXiuV8q`<-{Fbh4SM3t4`(?3COk0|1@62?OuRc76Vrxb;_q@*99kLN`7pFH zxSlw8WdQrb;5tz|v`!4I6XioYh`-N0^ubq)gV%|n9mG&fj2>DU{!Z_%kG3)#yn_Jy z{osD0%YDER9BK9AYnD^T>JRtX!zOGu4$DQxq0c7{lhIEo4$D2bCfK1*DGsY~EPC`) zg1@NdAr_Dx^2FjVQu{w<5O3K(Tni3y3F#qEGCo}U{^mTy+n6Dj95jy(2^!Kvo_q{B z>>!5?#n9+-MoGb1d`JxO252Z~4)V}Y(0owPFop^i9@0aetPF+JP)IQ>3jXhmbZ8wq zXvcqa4-KtDf95*G2RB0t&q1?nD26^LhK4pkhk0lyXby7;SL%Y>b<#h*0b*(4lOcZD zh2L=DcUcO*-!fV9h?K#X@!Vp5KM&ux!Qs`P{BYm1$MjSbdek(0J;!6bi$B%I%Sw@k z24&QAWHU9%L}N`$Q&UYe(^i#Cw0CT%YH9C?M;jBZ%{9}j&#FnZHzhk_aixWY98nl= zF~}Yybr3mXmF$&LBbjQ7CI^~QZK+s15^bt(Vh6IhSS;RL-Aa>lSEl1xB+)0>ok$@G zZ{!kfaVM3|wPxbcSb-R7;~j&8a*asBQJGw_DjUmy;BUrb9c}5_@L6Fnr#)9Oz96Mt zYhG^{=6IvtT(j6bW${w$V`k~%C8yUetZnbAsoK)I{IsdpOiTVq=Pa$NsR>W1Io}*s zZBD5+&#yMSHdR-dzf{%ch|S?CTf=5xv$?LirmDvDSDWjr@$xc{`SI$l*HzV2g%^gG zBp20~qpRyty4hU6*xa$H`QzqQ&E__v+I;JpYQe=CuULG6+4ha4r9Zl2f-MTW20 zcXv(I1+6!Y-m>I^3zj67UQmAl|1AkmsW)Sb%@e9GGy}%eDl=Pc2H1LS&9vI7r=L+{ zrmIhN(;f>kl1*F{kK`1A&Qz&bEYg(D@C{s%$Q6n9m=aegjstBx#Z%~n@)@Y&~8BGYoB{=6Sftk^kI7&J) z=y0;5jc!;Uy&~R`j%4F&RU2PZru&g@g=sOqyoG@n&qSPvgsG6o#M@H2xPlj3LVWXO zO>3$xUen$d&1E}c(Hb`nRYyDC2ogG>OcyMwpYM!(M=ssLg7uDl+62{{NXFZvZE-!8@J?GA zZg2u(z?8O*Tzo?$i!L)@+-4$?Y&y~IbS10snxu%9Q_bjRhMv?th&JUC>*6}%=IGD4 zN*k#MqB*ev9$~O0+G(41loJ*-oiT&(;?mKmng*f{*0sBVK3JFi(gCIWbsiVGwq>o1 zz-(^imDyapZ58yaSXE!(W9?c7FdAbhpvM@3G~P(2mn29wW>Sb044)1mH+meqBhHv* z)rIZxg&pmfC^57dZ9!mgF?L5?r5C`*3ovdh+V%Ujd(DR(CL9V^d-1+7385M<*p=0H$Z^3XCOZXSOj5wd{oq2vRgO!S!dsp6HBXzfs9hzKi~?=D)9rzI?oQ>b z(^X7=r>}a^bf!*0c*as4@Fp)&xI#s^E@6tsb66IgX*F2jEIBDecd9v()&a?Ib5=-q ztwpgrH?;$@d_zq^%kHGb3ebV!iA16ZopzOLO=MSM%EA)u3OJE#L_5q#q%bv`lPSzY z?Fij63f-lfHsIZt&KfO4cu6#iP}>eUw)#(^j(h_$eaZ@_g<`=lUy+QD9rCoze& z(+kFq3!yW1&Mp=ErKQ|5r}ehrP>mAQ1#L_n-2UjxS$bIpuW8l0ZpXoce&=wi^XJYz zJ2ZJkG@EWrMB5#|R@H`2byB>8D#h84!%&`$Wu?PZ;me~e+^;Pzo4D0~o%PA$>wPyA z-RQl^yxDV$ab8&+Zn4VLH=q30x1W0YnPHu>Y2V31#CZ4Ru`kGVKT(nemBkp9XnW@)6Y&x4$DB^k;i8eOU zrNXeH779i)(e{@3L3ME(9(SeDoT_e0wY4GARdqXVAF2`0RTx%m@(S8(&Tyk$J!i#| z>Szwz_C_rJSvup8gZKXK;Z<+qR|f_UlegFfhsm4kg2Tj}GhU)ra2N`&pHuHS&mWL7 zbUDYvIh^wQ3OMU?dx9-t^6sqhlNfrGWj38PO&!at{hyYWhXCb%1~ zTp&^B@j zmt6NY@d!7&x_sbDui3z!gDk7Kk=%xMEAf^)FZ$=fiT55V58s1Igfr+5B3>k^5ihR8 z?>gYEctkj8vgFSY1(i>jdis`3Jo$*MFT1d{Fqm3qCFQ z13~?lgphkzxR2uxK2mU;;Aw(01kV#(Dwq(=32qYnyx>;_zajW7!S4(5)yr)64MDyW zpWK7_L9_+O3swm(5?m!15&XE|dckW1w+QlQKdATff?pDRP;j^4vx0jCUlDvukV_f$ zgau~_E)-lP*dUk`+#tABaEBm&tbqD<2|gsaTktu-mjquG+%Nc^poIxcJ);Cef>Q)% z3eFR370e0VA$X7AzX<-D;I{=|5d1Ge8%sIcogi2v$X}UY{`rC{1seq01g{djUhsCo zy9K{0__W{;1^WblD`;SGWqZQ~PZvB(kiU1p@{0udB5Cq33;wI%lY%b@_6Yu3@Q;Ee zxJ0r37{N0H=L#+tY!lSKeFOO$h2J5_SEWf+q@|BgmJ>v-}dl zxL{WBTESZd?-Klq;MWDeE%*b$Ucom7`vv)P32g6p!BYj#6r3-(QZOo*68wbV&4T|R z_$5KSgjeeyFIXcuOYmaBCc(7eCj@U2yhHF_!Dj@2DEO-2n}Y8PmS6+N{#6K05}YbH zTd-d6Qo)SiCc$lj{~-9Uf_sR#M!ZDC`BTB)3cf=``<~%Wc`*@ugz(YAL&7HsuMz$c z!MT#ZMEDBfYlKIIUm^TT!RrM-BY2PCE+XuBK=^LK?+U&w_=e!GiID%j@b`uD$4}Vr zVMLVM!YhTJEc|rgX9z!A_&ni@gs&97T6m-IcHvhN;qM!Se_G1#6n>BJUBVv}{&nHI ziKzdw@Sh95EjSE)@L*Frl8Ey};t6<7g77*bZp7vbUrsz;_JxRfsL}fCxL-j#qsZ}5 zA^Az+Y2h1%cM1m_({UoC(1hNPvchznh5s#z%dkFRn!Zb@b0~hC&ashpu|DOnRI5qC zvAxj8G8F8VG{Mz(I?|MP<$}1b79P~egZ8*-a>`u{U%7`{7Dfh^YE>r%LD*M;wUYKx zwQC>C-8x9BX1tD_?_O~aw`?gg+%(I+3dg^|O}89w8TZ+4nnl;HQYyrR9Bvt3wOnZ5 z!2$J4Dt6?a45j3d~`@h{Xj6Z+^+_7_X?fIh|r_0c~(eux`{v4}7CU>VQr z1zou}8xQXX<#vc1Kp!KT+?0cq;c+icH%&eYa(6NzhZ_fZ@WOu7p&zt?{RrZ8{qi-W z5i4ncKJJ6QT9*LbwniWgxq;&q$n6&Oeo4jr2$rE-n;s&2k*NoTEsy_l+WYeuJ$4*b7_N^d>NM)JS9_JqmbG|RQ2q4u zZ~JUL=KUhpKQD^1qz8MoSJznGMB-R`6?61RDT8&|F6uu0c14+@vwF4HQrTGJ@t$sP zd7U1qRm8fBr>gVBXRr1eD&5@0SpT|~>#?X0&^1`EHXZ1nG4?8(o9jKU#>xhA@3j0L z6ZUQpv4;GY_L`Pm&MP?9zg3O86QbED4@R1*^zqF8HCMW0?cE(?@0I`3p6|-$Uh}(K z*n3)x1IPbMdl(eB$yooc^7qW|Ls!dehG|TG-AxV1r_beYTv^vx<#IWT!mcmWn0NdRjCZGE7mNA@W8k z4GwU0Z1jO&8obzI53WqMAGjcuoPpkF&;vUi8mn{-n>~2pD94_ow$R3t;DmNqOp1aS zIeLttyLk*(fum#dY97Ni5iyFOQLJldf94t&IvgGCtz6^6a(nRN3TP}A8u#cLOQEq| z*Qm7zuWg2gPiSn=HC92RnQPqC3WrOA8)(k6AJ}jM2v%hs0#bD^yxHa z6R)K3tFC10u=NyH?4gyTN&^Sd+fG<-+il&x+aA0iRg|J{tRu9MCOv2Hha;pL+#C3* z+vj!$zX*QF8Kt2MEWz}ybE>QJq`ecZok-f|8&DcLw{W+kW7+^X&6TUI!-`R^-7k~| zeqq;a*hLL%CwDin&vL1Kv3-gCGP`TZQA%lcM{xrxj<-EWD2-T-(B#nkJ;|jZt9^%_ z8D7#B5eiXdIf9nrV6){w5${BfV1Ss{hx#Dq(^RW( zegc!l!4twv2_k$HvN%FdQcG|Izjf^S(l+TEzomP_XNVHAOnRNdM|gP3P1Gp;=I#y0 zfbHF{o!FpPQeR#}*AJy^>Xt?6*t-wd1Knopx?g_n?iNMk2=P|s2<%Ib)Ye`qUzwTE zTAq`(-M(RtNhf_a>#!oYw#U)-qA$r2Qo-{dcZA{`K~=A19_Dd$O!{OG{W$nj=xPhk zYiKqKORuKTM#?O5mKtiOT*7Wq_lrRu?wY_$fXgV?kY$mK!d-)=wDS_^7iy;xfXqTN z3d{D|H{`XTwca))+?Ec^uyo@>el3?S+1qP-DlZM5um@!UIYSRp{>$3FvaY`q4Z-RD zq*yRkJ<3Mf#-QB)INARR$&k9B7pYLtVng;D(}oOiwO zQMLt+Nr!wxr9Yy42lMhh@czk=g8u)RLKiSc}dw-ES$Pw6W=vbK071yyap2F7c zu5s<@fu9EX`$%#3^Ib-0Lo)V^k}+qL6rNF1a7M}0-X(!kmetc7?pF&>^e8Xu_95r$ z5z?Yu?t{T@J(>WzX7_GK_kPEuS69DfH}b-?2X!*#_QNRC)uZj9oqW#F%b2$S`+@7I z*y%#>hzMS4zibKbZ{hil#mLZCPf zJkPsAu;gIjZfCHplY0q$BdLxnJRuZlIMFhWEf0PK7e2wtLw6xma?lYf!zjI2)$9SieEM{m_Z!c4bniu}7%|LQR?jGN zf9?!69CUU}`van4f(+N+1=j7Ryq*a-gQs-kfxQMyXJwNEiQ-ouFiuHugfO0> zvjnIvkodul`3_@n6QL=ac$J?OdWKdWj?iDJnz*e4T$|z@2*~=58EN(Tv*&!a_Sh=) zxzgazqQ91fCOCusgZ5ByR;nX#GR?Xn4G+Ec9W)%ETt)&o+@`e-wX^%MeFr@ccdfDS zpe1sbzZ8)i9ggn6DU*E%&7&>LIvhU*P8nBb*iWp_+6s<+_Aqg7yx;yPVsO<$#s@4rxfmsrA zW{rYp;|Gv~&mF{c!&}_bw2%>#x?{7m;}J$8N5?(eh=_qQOhW~Z&?<|V1<@f&_k3-0 zgesCtgCCXd`In7yR^Y(UX|V@ZXH8UmmCoSr9^^Ay8@Ctg*ul+qbaK+R8zgw#5o}vU zfrALNQ{W^5tq2qczi|X_+l-Js_^u=P+*X82NczM^gpM9Y21VGZ55%RRb{kd|rJ-%3 zKp@l8>7aD%=d`91v##@-fh!o+n4_#uwvk-ztPb)(aL?M0Pj)NH+EZVkxvan(!qXNB zi>$EppA|(!KtYmaM>o$%*N|Q#2qn=?P=MRiLQKN5t&1Q^uwW zuyBh5ds>tos*78s#|c>cF(oz|Qq8g1q3)FiP26B7l%onoYIcn%K_4uKwMYItYbv+4 z@eJ0^`PObtF3ws?#FCO)QQfujT?Le z)zw?Bxxrg?g9o6~vo)M%@IGkTc(t#Ea+i(T#YXS~yMGOwG_0id&_;qd1S)$^(&?u5 zD(gfyHjd)tk}+~+n&MX!U(z%M8wS3(X$tn*c#`Kx%W*v|%XS@UJ`p$H!&7^dn}^}1 zi5vTn1mxz^2=r1i!cEccPwY$Pu|gCp?ZiFjNEH2J(mG@Op5b zW9_j{h{ejo5gP0WE;(+!c(-+Q3EkUpZ^gY4cdK=DTQmFtS*nwAofPS$0K{>iu-_0kHOOHtIUYDw=lu1>kiCaO4}R$!Pf0B@&!fU)EHmVjwEmc zr^Z^_`lECYwAI2Y0%Wnh!$V1QER3@IE$3IAf$u&8f7u!Mm1p2netS!oKN9uyC%C)t zMSZ7BvOC3|C@-{gLnXcu@&4L?R=^-*$AZs?Q-59qDrf6_Y8a%`0H=(c1Kw3Th} z9(C*hqB`E+=0vEwr0}znwr-yv8z|kKeDL_r{+v>TMM{tSIjlRUING{b4Uny>c*oS@ z;YYgqiv5?J6onT6)^Ew!yV!5UGu6v5?cdjxUK0GdE2W3M((e8C?pI2!JI^Dl!^PIb z4ziM2{M6L0fjs$0c}3gzKVRzJH{H6uxS%_5a*DOB4cW0nKdk2*z(y+qxaeLtBA=VB5LK*K!E>e<2l4ci(2^R{q-N}~2M<7Rb%q-4U&?7}!99rI?W+u&>h>+R z@A<-19Dgc!XwQ*h>Y>+9IySdE+4BxOBRMB^t#0QoQdfCi?<#wFSD_Zf)8Ji&x2F#O z^PGdO5|&1_-YF#q{i%^o6WPV!k*YT~V~l?bR-^B$df`RO|8HR#KM-Sw((3s<7C5%b z5nQvQP|p;)+HT>xGqkN7Bls@bPSvv)+>1fF)7inE!iM=y;upU06em4b8qhjuf0hLH z(fhjM%0kobWu+{Z-$VN=%q53De$1klls zs<6J1fGC5bKcM{S0o%IWj+IA_KViT9*91rRi}vn)&X9kHBlxltX_UIZhaY`W%Gj~h zeT*#T)V;-{f3gQNoOpZ->{}JJ4iMu{&-z_^>?A$O2EXHv+|wxAWufz(!8HfvY<}Xp zPV_#TFQv4@hiCAPX?LLj#DnZk8}#KY??3}+`-gS?J+wCI-rG|~y>~qX`>BG3#o;hk zNybjd=i-iOHQcyEY{!R98F5%k4jpJC zD|8_*$Dt8zune=spl}3gKfgMH`d9!LR&dn={Lsn1lT7SvrP2&NN6rX4Xe#%FVQ3=f zmIn7A^P4T`WE4TqE`=hEAjsXa@4A)x6FRxI?MBFt-i!}XQdm4%WHNlC--Kn4kcI05 z+xN*X%=&R`BT$ouuk2Prbu zt7wS`749w(du+kI&QLD0fo{;IcdRrtoq=Qt>v_Z!eZd}DjhzJy7dqD=7WvpJ7YBam zrj8JA9R9O(<=}_T;J3P;laBlQ%0jVsw;jeX)D>QiJEyEU=+EUlVpytC|Bo6a^rm>U z8J>us2SIMNxBa@nv5BR@cQ9UTD-C|{40;}<&8m)>shBCSX*VSFxbQ_9tAl0FVmVbBe7`jKfpz_CSc_UOl)B&9IS8?^ zAH$QyHdS7N=gYmtj+haY6l?%6nw?Bg%??bl~h5{|~f0?0-{qX9w?cT`8r(yR&N1 zaCo$%zlR9(??;Z%Fb58P+jg%SL3_IPDeJT7nA|^~A87s9wHgH&K2IveGd`K1?boyD zRPf=Rx&jg7`lRE{`_*A z*VD4X)1pkT^m@F$N?%=5V|0{~mX@X#TT`>A5pROoe6=21eVx~*qvoa-pDnw}HY(dY zda^Cso1kQSZJb%>wN=%5E0@)KsuGkLEuKoBr^?poS!r|E*LfN#64>=kUa}d*$}SjF zp_I+LASb&jr?9Y)ZhU4JOsLRz_&v*x9R;oZLc1OHeLNP_7

sd8o@(3inYDA80g!c-6<;vxpF^)5; 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 WZt)XvWW$$LI_JXTk_qFeYyBT;gTVO! diff --git a/dump1090/view1090.REMOVED.git-id b/dump1090/view1090.REMOVED.git-id index 7304f82..d074ade 100644 --- a/dump1090/view1090.REMOVED.git-id +++ b/dump1090/view1090.REMOVED.git-id @@ -1 +1 @@ -8e54cfa965ac942c81c1742f1abe3a82b9a8412a \ No newline at end of file +e8e8d968d4f4aec851cfe3bae4e8ad926f7f7b65 \ No newline at end of file diff --git a/dump1090/view1090.o b/dump1090/view1090.o index a9231fc001b09429d43ac3e03493b9f8bdb459f1..06feb0410da2d12dfeac26c0d8415fd9fde77071 100644 GIT binary patch literal 28868 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 DqQW{@ literal 19276 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 F{|BT8g&Y6? From f556fbce1bef09581d591c892bec23ca92e026fb Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 5 Sep 2017 00:13:08 +0000 Subject: [PATCH 03/65] added gitignore Former-commit-id: 127ceffd42c88807559a977b242cd8f107ca23e2 --- dump1090/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 dump1090/.gitignore diff --git a/dump1090/.gitignore b/dump1090/.gitignore new file mode 100644 index 0000000..b04dcba --- /dev/null +++ b/dump1090/.gitignore @@ -0,0 +1,2 @@ +*.o +dump1090 From 2d6fca9812e65fc035363c18e5b58df7cfdfda43 Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 7 Sep 2017 16:36:18 -0500 Subject: [PATCH 04/65] fixed distance calculation Former-commit-id: f7b76dd49db3daa4875348b62a43aad917fc90a9 --- dump1090/anet.o | Bin 21544 -> 17960 bytes dump1090/dump1090.REMOVED.git-id | 2 +- dump1090/dump1090.o | Bin 0 -> 37100 bytes dump1090/dump1090.o.REMOVED.git-id | 1 - dump1090/interactive.c | 31 ++++++++++++++++------------- dump1090/interactive.o | Bin 27652 -> 24392 bytes dump1090/mode_ac.o | Bin 29924 -> 14044 bytes dump1090/mode_s.o.REMOVED.git-id | 2 +- dump1090/net_io.o | Bin 44180 -> 40816 bytes dump1090/view1090.REMOVED.git-id | 2 +- dump1090/view1090.o | Bin 28868 -> 19276 bytes 11 files changed, 20 insertions(+), 18 deletions(-) create mode 100644 dump1090/dump1090.o delete mode 100644 dump1090/dump1090.o.REMOVED.git-id diff --git a/dump1090/anet.o b/dump1090/anet.o index 7756edfb56c4489a2be4e6642f61945dc1acf1ae..78e8fd76107e659002a738be646d7f642ec72bdb 100644 GIT binary patch literal 17960 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 diff --git a/dump1090/dump1090.REMOVED.git-id b/dump1090/dump1090.REMOVED.git-id index 5433ad4..546c373 100644 --- a/dump1090/dump1090.REMOVED.git-id +++ b/dump1090/dump1090.REMOVED.git-id @@ -1 +1 @@ -e328571ee755d40455f14ff797c85de516b3cf0c \ No newline at end of file +991767a65daecf769ad18d4cff2b6ccf858da843 \ No newline at end of file diff --git a/dump1090/dump1090.o b/dump1090/dump1090.o new file mode 100644 index 0000000000000000000000000000000000000000..d4608b9696f38fcb7f05f1271830b0f344972cc3 GIT binary patch literal 37100 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 SaAeK5bw~BGt03Rw`Tqet(C&-? literal 0 HcmV?d00001 diff --git a/dump1090/dump1090.o.REMOVED.git-id b/dump1090/dump1090.o.REMOVED.git-id deleted file mode 100644 index 55d3868..0000000 --- a/dump1090/dump1090.o.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -f9454b21fbaa395742eefee887a437a2bcf85b60 \ No newline at end of file diff --git a/dump1090/interactive.c b/dump1090/interactive.c index 06a064d..84d7e66 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -30,6 +30,8 @@ #include "dump1090.h" #include +#include +#include // // ============================= Utility functions ========================== @@ -435,13 +437,14 @@ void interactiveShowData(void) { #else cls(); #endif + setlocale(LC_ALL,""); //\xiB[30;47m if (Modes.interactive_rtl1090 == 0) { printf ( // original version "Hex Mode Sqwk Flight Alt Spd Hdg Lat Long Sig Msgs Ti%c\n", progress); // pitft version "\x1B[30;47m\e[1mFlight Alt Spd Lat Long \n", progress); - "\x1B[30;47m\e[1mFlight Alt(m) m/s Dst(km) H ", progress); + "\x1B[30;47m\e[1mFlight Zm m/s D(km) %lc S",0x25cb); } else { printf ( "Hex Flight Alt V/S GS TT SSR G*456^ Msgs Seen %c\n", progress); @@ -489,13 +492,13 @@ void interactiveShowData(void) { char strLat[8] = " "; char strLon[9] = " "; - char strD[8] = " "; + char strD[6] = " "; char cLat = ' '; char cLon = ' '; unsigned char * pSig = a->signalLevel; unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] + - pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 3; + pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 9; //up to 4 bars if (a->bFlags & MODES_ACFLAGS_AOG) { snprintf(strFl, 6," grnd"); @@ -514,17 +517,17 @@ void interactiveShowData(void) { if (a->bFlags & MODES_ACFLAGS_LATLON_VALID) { - float dLon = a->lon+87.6651033; - float dLat = a->lat-***REMOVED***; + double dLon = a->lon+87.6651033; + double dLat = a->lat-***REMOVED***; snprintf(strLat, 8,"%7.03f", dLat); snprintf(strLon, 9,"%8.03f", dLon); - float x = dLon * cos(((a->lat+***REMOVED***)/2.0f) * M_PI / 180.0f); - float y = dLat; - float d = sqrt(x*x + y*y) * 6371.0f; + double x = dLon * M_PI / 180.0f * cos(((a->lat+***REMOVED***)/2.0f) * M_PI / 180.0f); + double y = dLat * M_PI / 180.0f; + double d = sqrt(x*x + y*y) * 6371.0; - if(fabsf(dLon) < .01 && fabsf(dLat) > fabsf(dLon)) { + if(fabs(dLon) < .01 && fabs(dLat) > fabs(dLon)) { cLon = ' '; } else { if(dLon < 0) { @@ -535,7 +538,7 @@ void interactiveShowData(void) { } - if(fabsf(dLat) < .01 && fabsf(dLon) > fabsf(dLat)) { + if(fabs(dLat) < .01 && fabs(dLon) > fabs(dLat)) { cLat = ' '; } else { if(dLat < 0) { @@ -545,16 +548,16 @@ void interactiveShowData(void) { } } - snprintf(strD, 8,"%7.03f", d); + snprintf(strD, 6,"%5.01f", d); //formatted for terminusBold 10x16 - printf("\n\x1B[%d;31m%-8s \x1B[%d;32m%5s \x1B[%d;33m%3s \x1B[%d;34m%8s \x1B[%d;36m%c%c", + printf("\n\x1B[%d;31m%-8s\x1B[%d;32m%5s \x1B[%d;33m%3s \x1B[%d;34m%6s \x1B[%d;36m%c%c \x1B[%d;37m%lc", count%2, a->flight, count%2, strFl, count%2, strGs, count%2, strD, - count%2, cLat, cLon); - + count%2, cLat, cLon, + count%2, 0x2581 + (wint_t) (2*signalAverage)); count++; } else { numNoDir++; diff --git a/dump1090/interactive.o b/dump1090/interactive.o index eabfd72a0a2d52f2adc727ed5e06e6aa55c87ac1..9f80f679860d6ffd556210cc7058b5b3c7a9e637 100644 GIT binary patch literal 24392 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 ILiD!(1txrzi~s-t literal 27652 zcmb_^3w%`7wf8=AX2O}g97vD>qK-Tx|ULkh(9jbb<$L`wQXLxq^J=6Bb9(&i8V`-gx z`V8-uqp2mk`%=1FkJ`Ih`^f*FZqc=+&)C%37vI_1cglaD$6eCeH%$EGc%JC!+u!zk zvwu<2YX~tW&C}600sK8V_x1@<+AF-!pTA|~o_U-5PAz)&IBb32E;@Ux@+RFJy(=GM z%J1xnpsgGa^tm=Y>#psFt`{DGuJYbQA!75AQ1*28#6w5Cx2@0at?Jf9X-}*W?+7o) zUEZ@N=Wd7aZXPM}+mx=dqo1EWJH`#&u6)x5fwt5G8;_nq-5Jg?U)!FVcgH{s4V=Q-88yDwR^9?f(85%UT@{QGI`fu2*i*)AFN9{3$` z6wAIpMIY_pwILpKu}R8k@KZV3#fzrifT#1jo!;G#-3x<;dpmz&^KSX>9;6 zyY(?kM;gW+%Hh~c<=7n$>e| zJo=>XHP7awHnFUS?Jc{GVIJ(K9zIqM+sdG?z|{tyZSF1iZ0Re9F2ZM_9uZLk-7w57bg`?lUPtcUXMO?_{lJ^Ri|=+(f758jD^ ze7S2=-?OD@x$?yBYrfI)QdK;iQX6F9MS)r zS4-|=jEU{2^VFR5_l!eJj^>tj^c~6G4f{%I2jY;nmiDekIW!OaO^oxh-c*d4aeE8r zPW8J6G6MbTYVHb9&hxz8H_WRa)xE9VjMHS#3vwNGdiNlw9PBCZwD;x1PWrsSgZQgD z(32)w`&L1>4gBHIxe_va#2(nOyqEKn0-Et5T%Aefp7xO|U9BSx&+{m^j$AvUqc6*| z>1Yac?6N)A{d{I;&vWA{yGx+k1AWLVvBj?TzIM-^KF%?0N-B4?k1P|dBkiu|P;MPr z3|Tv5OFVlNo}ape16VJxy*EM4hu!mV-+|#B7}LXj&(H4c*)`(%?$0ji?43Kl zs$0^Y-tJSA5A<|GPaFN~-Q1&J0iVW|_EM*9tnDc0)|O^FYUR5O@af|=j5QhUbnk6F z9{8^febcV>IhafDeMhl=lP&=t`R)bI^9=Z%x{O0RkDj{i+2fvk&VO0&M#Rdeh(ANw z9Af+Y&YpJfroNEAwQmdSJe@sFT|bBK?(H*N_hKF1i~XRr&k)EDuGT&m#!j2ILzeNG z>d}wVCXe?8UGsG6$P*64fa7ndKZG3gwt+E2{#5nB9?iR@x6`}5@6(urJujoa7P>+h zOSBI+x&CJ#ehMG{7;WYFT;^Jc9_w1z)Fj&bCg*KA>cYO33w^q`LhcEVojrT!`TTqs z>x=X9F!XXAU9$CqWp6F1ba|FyOeiI~;dZzuGpVeV#*e*ou^s%{(h&5zEW{UKwlz-8va3m{_`%X&v3 z=3Jh+M@M8f_Izg??DkOC^4?+SV;uXVPOOQIkcI!=(p>uU0%gQxEZ3d~K1G{e=8`nm z&c6A$b8+Y4_Ih6Lduqb#Ju`v%xKlbIzrVe2FLX19+%4BuQtwuv)B#<#_@v%qv@OS7 zhP%YGv#$bo0PR--e}#3&Josz&|HEPZkFM%C3I808LECrNJ=OozxQ@PCP zwppY4>2um?`EEbjc|LDHIc{D1Nds+mKz{M(v-{)M&FC+No;N;!vj3&e&-A}>%ai?L z-OiJ2|BpML>~}&o09nS5xXa{wpu-tAqdzXr(;tgFA#RiG?}A$z`$b%8f7e}4_8Yep z^uHVXWPjJXpY<zP9;z(?H1VqIH&#^-0)$1yiO!;lNp(1!j@&EopMPnM(C zXV+)Hl;bMJn3iHpZ$R$^%v~;QbHMh~9%)#r)@~dd~l0$i%>>=gxls z^2KPEreya=>7xDgC4K0DuOB^owy*;{+M2&^fB$_b@3^%gVb}XB@*kTp?W?=LoS%=> zhO2wFJAHoH=a)M3CAq2E#NMa!Lu+q&ENxzF{<`F!Eb6(Xb#~*3EnTmC`^(vsV?JD; znO@E^_Fpj*H_j6xO%noZLv-TahkHNn)3|xH<8H&f9XHP=%%3|dkU!_$Fa5YS=YIIK zvcW(@GDb_Xe@`~Pe_<}j0-MdxFwdZ61LJr|siMb@Y&Yj|-k!dG_zC9W>g*YNeZko4vkS%8>vOzUo4=vXNEnV`Qb?FDiEFm4_g)l*FwM(ElS$sxhAvJv#8YL zDJ%1MN=uh}Jd38}PMdy%XGypQTEGhi8$1)MVxa?l&bT7iTTguxy}4^8<^)j22YJ&_ zo{{0rsYZFGiLqm^pBT6zC#!y9`pmG$B(m!#PJ?cf$f=*0V^!qVPlS-Fm|j1zYGM`j zMvpai;?$e~?4fC2a}Aj3scCMYVGoQI!cIlPu5FGNLfeng{3A|s#QX#kZN{+s5Hz~o zQP&U=HpBkk4k2vzVFqT_X1BMXoz!7FJPQqMnz0Srpv^Yy7=jC8zd)r;i^-Hs$M?{I z&2T&k74{^2=rdNc_gC1#miyS=?pTM0_I|{L-g>L#3`0-CUP8`Yl(9bzhQ5o5A$5!S&MP^VQCcmCh0aIVsax9*ZHt^g1Iv-3b%7{w-b!r~wFki~ac-br zGPLJGtaNTAktvCC=MEBHNmMxRBatPEfb&5T*;)bG)H*%zwFYVQ0;d(e7kWo9rHbo-VibNFnBR` z`c&%VFr-d$*@5J8_9b^RWkDpc|JYJ|d}vh-6ZV~;V~QTf=djDri81WrO9=-N>%%-` z3u8JQH0;tRQM3#Diy(}Ne#)PL;dUcu0p*z-jcF{>h%}(RjQr^=CfbdKEx-%f(Xmm$ zVO;QY_{msY1g;ns0o!d{d4LTHsed*_gpos;d@drp@evtw$TtiuQen(zIo`lgL>LPw z<8oaC1<4}OZCugM-X5Y@k?eRHCc-F|+#rI~Si+@Z`spi(N)-WZQ);^AUX>F#kj|0=FrIm8RU$Uw&tIwfl zXV!HPuxG@hm?Mo|1z$O5(Y9fUG(UDm0@1e;Vpt69jE}pdkU}R> z5qBvg2OfgijN?Gpa*S7?}N6vm_cCd>K8H5}qw zjJ5*fIkr7aJ;laLEdP<^5@QVI|3sNGV*%Wm@Mo4+8duStw<%L@e95u=h2;vvh0lZ| zEC-A%gjK>{S*|rMq&+6E{no=nC0Uv+l`O$neZOl z8m8Ocr>o+PAJLo-XpYOAq7$4VcXEBWMkJiP8}cdWW-?GFt4C0fohOJ3UG{_z7orQp zk7-W$h?zuLIFE@QjlqFX=aBJmhO+VTm-ON{w+&6#qP+eUqt{eQ}#mT03EFxLJ_ zqD&ig7VQ!~Be7B&^%%SOoJ6@c>NjlvB`32&8}%a+Uy%rCqy7VsaF(N~)!e`3YzU33 zs!1Eokk;f*uwHYYVI!Lsg7_xQokAOQjXGL2cQSR@rQ~+aZD+^BB(+0xzY`D2kW`!I z-c1Xgl4{pR2ZF0bLaf$|=6f`E6D8wh-CoW884OP_H_T4W{VNXh0&OiMAJyEolyqra zc#qoLnY3lNY`4!gy16kd5=KbsaZq)jk|ed?HoB5^$&z{k6zfJx>M5K18Crdzq@J<4 zJ89=AxvO{C+;6Zyx2!v0bN`Z_7%l4#+T1^7yD_rvHJiJV^XHLuhivXAIJ1|^y2H@I zcH<=Vw#|J7>&8p!2<-H)5eX9{)opWEb1_bo)G?bopPrZ`spB^HG`5>8sS~!*4M8l2 zR7st(x$&e)BwQw`(>C{w2)u+TlKRxD0b-C|85`sk+l3q``!8q?1n-F*$)E!Vj7?S)Q`uT)ZQu}rHME1T?Qcvjazp(dfCH0i2*fv z(Nk0i>RZ*T-{l33|%WS_gt_2WFk$+%Y%wN81sxliNirpejBHtn*_Cg&lVwp$Xd zPI->GUlQA$2dUs&lGrh}8kzh-S#ER6Q_4ec>DP5Odb>%$SDO=gW4e=(IX;fTYywY^0+ zEKPut9H|7X3H9}$$X)TNX50jFQZhbX7>#o(>L+U@Hp43>@vF^$f;YwFIrL4i zM5K1%<72Sr3}IjP8rX4T@DXEY{7#`)Xvz-U+TOzuo>~glZ$YNrfPzS?<7YZ<(Ph9|al!JC#jBWFJGLi%=WI%o)YWXyh0x&?Ev0ZSRud z_*O0b+(!>`iX-V0%G9>dq6 z(RW+X^h#)skz#b!RsNQ>7CoB-OG8^P^l1s&8Ea&xAecdBCWn^@&4@mxu&0yoh2{Hb zp_R*J&2R2=xE|Lcqev}&Z3SfJTJ($`qSCgjBJ&Ag0Mgm5klZR=yiD_QG<;lTD(Qk> zIAATP?WPio9-`zgRB{lKrV`bD(qX9m5!C(w4V90w^WgedWmlL;=$*C}%{(Z)&0$Cf zZ<51UjuDATYw`I3#6K`qXjs=X(SXa~tkQ~yl-UAWnOzt;YpuS-ystPN4{PP9Er2cB z-XoaC`SATC()U`~l`_e7$U{mqy2}4Hlxt>sYy-VuBqQb9+AFX{`^JKIu@`9H(fA}z z-}Ux}{MS*?4oGu9f%I&8J%kpu6n{*6855tuvUHZdYsW_E@)H4GV6kf$wWyNL@QNF34wJCscjw#{4TtpOiE31#HQG zmb&^SJrh;=LC(o3?K+rHL;5<7>&{ z^p#kGagypFb+gdoCG{$)0G6Vp&VZVfjIfHq!>kAK;?rbpxkK-SPK2IJPx`LY8zy4` zIX=E&&Y2uBDNPB#XbJCA!k1%7aMmfTe_WCyyz?PC8G0w3Qf*FIZK6A{t%F1^Mx6&y zA4WD=E48<5%o+nzY!N%`P!zV8{p`zjYl`g_g4@39wGA;SB%2bpTU}5FI^LoUeb+Hs zkEh{ONXvGe*dV+vIJFeriAjgy0FHg1*|GZ;aVG6d&gmS(`q^genH+FTzwA{*oi2w8 zMUx(d-E970`Cw@A`=fj0ACfsLoV zGoU9ug~oJ56`EpZn0F6>#Z%E5lf@BxKLsxiV&0j^2rP(28{i=OK0f|lv<|iQAFx;u z;a9wVJ{&R~xOgwP2`w6*5}BMrzC4xqrhGQf<4aKiw28tIaKi--Jq_i5kjoF8(fG}= z@Kxlh3tX~}eVcW~%-e~*8c$P2&r2P64Mkj_NjV-vOu546vHlZ&B9k7EA4Rh$yX0C} z!B#wR$mT`ty67=hE@h=_E~}ZkqpGE?OEpx-E~0z~tL4XID8XJHcw_9xVMt*qMwIX? z+3%|qpwV8{Zc;Bjp^b{34})xKcJd);VnplcJqr5^GMMFR7pP; z@mGbbMM)K&1Pz~^12&_thy_vjH_q6NvO}(MCA+j4b;I{kgu!ddE=xp+j}SLv2sD=Q zDNPqk_aOl6ACY-Knf!oNf54~EhHDcOlj8Kmv5CXA5iu?-ecJ>P7k3p{*aTD&itQH) zJ#kjt6>*EPwL30=2y_rg4@=VY#JD(CYaoq;0oj=lb1KrYIEiGerY%mQSlp#zaZ)BY z@s@5lcM^Drkx|;9x(f!?VTuzVKsCdYqC`d{p~pOgUy`)MVOfHwfVyE?%{C)tkC=!H z(Re^;)S&*EsB=e|3lfhmqzYOOa?HR`9UQ~hs9JQ8lA+BWZTe~QXpeNpMUDXz@VzQG zins*CfJ;5mEf*)5Z7)UJ0f})La5Bd-d9+nOKDrU-FW>#Gxua>2{Q8VCCfG#S#(RENk)qQ(r$Ac^zlMex;f zxL{@6wK7ujm6b|(4(qAhs-J5PNQimS1`O$b{$K|j(1Iw9AQujj$nT24@|-=I3!^}_ zl?=9CJSaYUG#Q1_{Vq<*lW|n!kn6EHy3VXwVzTI?T=c++SUMmjW7K3`4b`GV*2tB} z24>B&LGgyfK{nHpKpqvEC?Px}iz^9Txb5PW(5iZ7fgb{GD3kY zt{_;l%Q`^FD;b}uxX~dYPZmoFX5VE5K3%}{??FQDLh&GOO_UK{mBkW#%8UBDaYGv+ zl}A}oM&Q#0(@K^q%nFFe>jXakUD?x+m0z3jD;Bhv%}V&9%}i4%^%uxu3Bl~D)a=N7 z`-bgo!rMWdU`p~S$iLN|>Oy840v|+ZVuhuhwVQBLJMn<5E+bHqY)h1Mx2!H9@R>oB zqEEs4+^i*-wPjY@dBOCYmniU+ zU}EfX{mjIRJILCHJ9!AZS&EG7V9n#Wy+dkumB&y+Jm3F<4#RV1;>0tvrcVO@>PacA z8aFuMFzFcXbGjw#1n%>9%Nma5|GnGwXuTab=AF=nd&p$B!#jKA?3ECBI**!2*6uJ& z{}H{|<`AX?e$~@O%f=2Cc)|dmkdK@0CKi}%0>5oYaTd&82A2&qNB8n5XiZ$R573RX zD~i#I+o0f6++bUw@F>jW`z;B0>>4$tWIcmBc?jE@Qr2|i&Kgp?Yx_nyr!7)Z)Rclh zFsE#G40n#e7iB4K2GPIOm<`{>osCfXzin#`_!QcIf%}{RlVyk3&Ocz*#Nqyb7_imv zF*Khbr(_v{ztbR^4vHg~55CtXiD=l5g4Y1n6V9u@e$b zYNc0K?VWrP&mn9+8Pg)~V(hy^ch2oYvj{5%x+K5EqVYW2fh&W_ID#)*Ky zt{^$s;|i-saIO9zJJ{O_t2c1jDf^4+>i`t;tq#-@OiR9DjW`7boM&+1w4g4ESl0;@ z@^DJZ$6bNjx_IO{gqz2nPjOopf5w=J+d5uY{0i*v-MD#};HK+BHZ8|(U3`SzgnJY2 zR^0q)i?4BVljIJx4>vaz>k46&wBojM$PtuhVn#W`k7AhCb*@|**2DiKcMSF1bgf9S zqR-OD7c6aJCp=-(K2O98MCPB(g4Qxy!p)hXy2{L&s;W$XbA5WKuAyaZdQC%1&|g_s zTb-Gkad~E4Lsh6H5EN2a5$6@Itc!$)NDU#*+a!FmY7uIz@`nbx5_t7F*zB*0)U6I? zRB<5TNFWfb#?KTmJ92YVFpMIC0PMO(6fvC`hEOzt9x`wN$0bikH5bN1mMrL}Zw|LpqEdA!{tf@I({pJi~?$pdouQ$zGlRc%zn|qlz zYifPQv@Jy)tq{%4Ow*l(-n6NDQ=vZUk&LV@MXN3=swrApTvMNsxn!w+b75ANH;`GB ztH)LAs|&XjWo4$PW#RwqWl6=gX+<~cW2%#i7iHIV>hYV4x76sd)p|vS?ymMu%`D1X zoQ3Z6P+@vzCYpIOh0U(TWW>}3^)Z{1(7o=g*4JbdWiBZ$2I|8%FO?FTWAsNhRu}8X zM25b1V@7dWk^Z@;-jbe~GbJ-?>f-dAoTAM1qNNz?lEsgGqMVePn%J_3O#BBOU8w$4L=D zLMYU4EJWkwC!m&vVEtmhb!qD+0qtr_}9wv5coEd6#A z|7pw6?*M)Vyd^`w6HU|g&p~XH%t!PGv`6$0)>YS{k1uVH>N(afByi}fy1 zotaasKeaJK_ZI4joAvYzy);A5%FuUh%=q)S)3b{HTTlE*Z^?j__=I0EyO~q;_`<9u z%M}lg5^w9>!Dp)tFUZwZ7mHef6J~At0tfV%kH}2|0h-tIxC*YguWaHa9mm3%mvC zgN4Dh!dF%6ufxczTADH5P)j|%u*SbC*wW++2XBhbS@V!;BEdOz%~j3*>WHZ4d$ECH ze8{0S)xz2UUm0RX3O4)9)Fi4Y(HyLAj06RIT;t&%fV4E!MTFndB*zoVwF7<}^bE+|(>q2b-0BobZK< zix-$-(GqEDVZ|EL`0Bb)u)$v+6fNj#daj&btMmGnNN}w$3=b&Vq+*{h+*H?Kjw~$j zf{jngiE50xnGTHFI%ELOk)QKKLreYA#`$&4LaLDyQC+tdo}y3d8fcbupcyK(n!yB% z>RV{*Ra3A)CXhKU9f*?4s?#(%h zG~aA4yrv)*>S`ZiqsnytJT*FVWk#u6jyPW(ERFa>1M4JgB^YU~ud%v197I%eVi!su zRW}EN0`XEALRzW8^6{@hxMQtU`6G3W4Zg-z=DHb(81y$_DsqOjC7aDKn26~v_648T zH{tKh1}8x#1-Y`8V@{AQS{UzvY)r>ZEtn*%X@5-!eIo-ju0lL80fZ~Vm^K6`@+D@k zxhx{ASdk-w>tUgTx)W1jB1!FQ&9c z9=D{8iyK5JRAvpt^ua&^v2sV)95?ccIdF!3qq!WT;y%#W0`KzZgOiVs$qy-MfH3nH zT44abrdpYDu~5tmY$bH1lwMYzz^|%Ny|IFs3z?(^^W*dR5rGY+YPgUIrU5A*6B>?= zzZEj_teh$n8x|!sNdH8I*1t-Y4n%<&uq_QTUgZeTpS8ts(c{lR%)P|g?6ACt##3`+ zjohoEdNlJrhH0&BwJyv-Nn7U$XhyO#S@c2lIEUtS%P~#Bp8w6rn9y4U3sR{-C4cJ-b%7LO%th+U8eaqM$GATY^HFpbiFE=Vb{E6*b?kZW+ z;Q{RH)z!d2IKm{Lb_+NIxn*@-6_+da(@I7~7*;h_VK_)-HNgn`Z>$dZZN^D>Kn*nIlb0Q4>J+4zwVN1_R#nF|*Fc%swA8$K0^Y(P8Z|i^%@5 zvzOt}8Fd02GMK6$z8lKj%{;-NGJ3T5))*zuX&MM?bEXuqAd;7g_}bDn|+Z;Xu!MJ7<}03K@T21=7zBI_!`#uaaP8$jj<$8 z8`9l4Q1Q^4S=(42%xu8d)^JO}pNVr;pgGg}-fL>NR5PgOsO*cBAP*iq!sTRhvB^_i zBeyK9H@ScZA_!@Lv21=Ln1fRylSWmjF4%zFh5h{|oJSgE>cCDE5sQ|t@XYhzDMUuL zCmm;?({)y747Elx?d+-PF^k@G`{u#P|gH zGcftQ4&$Di=xH^!4%-%UyJNfk4*gEs-I}dD_V=&6eDI~;y?7u|%#E8rNI;%X?0B*5 z4%~ASjaIaY#Qt6i3;r(7i%;t!z`2R8E%sJ@D`W=SqOMccxwpi$I=0%k>9@1qdT?gF zWt|KeUe^26g^6}Z@i!3jvfiDZZ`vSVJ!TDm<>ZUda}(XIFRNp&vulW3<>r z_uM#JL;_?VH&w}}fqY|kZsLSi=T>9eu-jv{JMOUGsoy1A1{@`$9n0K~<)a*>7dpyD zI#wh*u1RuyV}xVnaL2VS$8{Gtu1|E7Cpf+t@3$E=LGHs+d`Z^V?vtcY12QyNnevn+AK+&KL;m<3UglFe$0QJl@#9BL?P`JYc2 zJ7N1dV-$0|VEXyUPiT`+bW9g9F^1;UVr?Vr$=XP5lYh!F<^%U)58~$P-BYbl` z(idgCBD{YG&ho25?{Qk8zIR()90_OWVA-r za&w9z{muRcE*vFqQG?p>_%dkKqA!tA)mUGT)FLt(@TEEf*(4n+1K)k3lvX$M`)9_S zsJn_HR}hTW~=t+)bk~R==S@}$K+s{?YSnR>-P_sY1VUXMAzG~CM=rvbB$Ou z?Jpj9x^1=}d^&F0=e8E7>VNPlw^^S*@YH_5aH(Dw4(T7&832nc>e2-s$46cG?JJ7n zeBhCI)TIkN9*??o{7@Qw=>l)~MP0gZMN!l@LfSLPO_K99_^ZRY_VY!X!AlqTLx8AD z7bEeXd2!B1z(1Eo)w3TiN$Vm#&mw@N2VSmF^f!U@f(vsrTzqu43T5ivft&i*1Fehg z@5NmKvm-#(KMG|0bSnBcKf?Jl)_H*c6=g_;)p&vene)Jsr2j|fHL0kEh{T~8N z|9f%M|IsG`97ge1ViN+I{CKljTsB`pzn!fh^%yu4rvT5BEbGT2E)9j*aST zOBCnaCzj?H6!tUl_%KR($ay-7|F7S?=R{liuhpf|)yso}hkAJ$8}jw*Ur){hoMPNa zWiTBfxR>}W@ zh=agPtgn>I%{g^>qJ%IiERpEOIKUSzAPFbIzaJ0gS3bPbmrLah$Tpwr`RCKe#jS6=t zd_dv%6#hbCm%`T-@^2Mr$GZwoE7Z7Nz)w^-Rw4fl0`jLRoU8C^h4l)#|50v}!W|0t zDEvs_mkOO+myjQ+kbh)GI$h!A3X2u`6yB(CwZhE`?^gJr!tW{kxx&{K@{I@f!+#){ zcvj&E<^|9fE1aTGzA*s)TtzQcc%8y(h3gbS4x->q<>!fb`J6<(*XR^e)eeEWs% z?^W2T@EL`#D12Mt-xZ!#I1Bp++ZQOjMj>CiBfnYUCWZW`;K<*r@P`V2r;vXo$oiuS zzfu^FeTe)q3b{{_p01F80ZDqf!U}~A3i+e*!N1^=J_`rWc(a$U7n|+l3n?mk` zq(4(=V1FZhp~49YvlZqmT&l2KA^!l1?ba&fzivXhUEy~W?pOGlLjE&-lsm5Q6NPqc zSmcjT=uyaj1dRMVh5RR~NUu~_tx)d2;BQv6+*d(AqUgsJKCSSe!apfIrjY+84fXSD z91$-yN#wg`q^Bt4pZk%1K;bVGb}4*a;kyb?E7b6HQ0i4UR$;2bX$r4bSgWu_;bw*R zDBP>?2MYf~;R^~6Dg3L#_Z8~+(oH*D3NKPPMPY%$8x^irxJ}_h3ZGN>5)pgR--!6r zw-X9KSI7e{>ys5uBu>SjXe&BT(Q_4jjlw!2^xZ2{yg+~;AqR=_Q)OR5f?Nf-bZ?2*X6kSP#ziJf!CL-)ut?IWc z{(XvmT-86V@D0U(iwHfviho?uA1eA&Me{F{Xiq#5{fs2Su89g~DgJClU#IX!g&S3U ztD^5$_(O%iR(Ozze%>OYpZ`?+6AJk-mi>+*LhfQk&nH5DvEr90`dUTTC|sj(v#P&~ z2z~bu;fIG5{#e!jT-E^l%)&*?tTWc1nzh|qVx!XFdo3Gs79|CWe+bwJVYDEvfW zJia5c{lyA%6&5P2QMgUv;|gC>ctYVY*i1cFDlAi2r?64sW`z&)`y1@Su~XP!3(~C| z=Y#y-gz;jz2-|qfi{h6ldZnTxie9VeHbu89dcUHdP;{4~4=DO=MITZ0DMg=F^aR?0 z{`pLi_VBqS>9-XPv487=OYr2*948yh#9e?hfOX;6DKEH1K2gp$NfEgQa_ASKCfnm{ zjC}StQPH}R+Z3gXEcV3@NsGX_LMj!6jk?4l%xAC zuQA8Ze#y7`ZHj7xqWJ7`Av`Ro%jzoxI$B=<`dr{qAG^2oZA95>gQ6HS3vy8mtGMeN zxhYrRkD|{r-kp$(?l%%O4!CikU#=hO=KS#r!0~^KiUrp3-lx!#yL`#Nj+b&jQ*r=# zT?@JBi!!`k#BG&HmqYGU6vGIqXX2S9ObcW2Cj+{#3GDxgEI*??Q`L#ZPEHV%gi+nw!Ex<{}0cQgq8pR diff --git a/dump1090/mode_ac.o b/dump1090/mode_ac.o index cd90dd693d21d001afebabe564e43a084ad8a9df..b5745f4adb45ceea8bda12779e2a3c708cb667a1 100644 GIT binary patch literal 14044 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 N^=%E*@?YIB_P;7Fkk|kK literal 29924 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

sd8o@(3inYDA80g!c-6<;vxpF^)5; z>+5Q2eZ=sRyuK3Q>}m=%HHy%R%KEyhX5^3x6uc@(E9-rAK7W-*hqe(YcAu*SWy2XG zd@Yr3q{3Bs^ax{wx7p*V5;D9F<*mdkTY&Xs*6Z=`6xQS|a)2=XP-f5y~;Ys?t}P zce%HzQJKeEkIkbu6Sv#n;;B-4HX6tLGN-M&uAY+hD)f?KKG~Y$uB~kGdVJITzUthG zif)cx`KojCR+vxrW0l-qVF7_y+2vlPNA$`Sm0ovCU9&Gnk@B5im{&+mS4+?{Fxgh@ zZ)h$om{g!8%xG#v1NY_5$BS6xGUqgU+*Ffc%r%^z#u{HOcvaA;bk}-vDQ-(s{bXBX zQ?8phIkpDB*O!Yo0I5NsuC;`cRn2uR9`9t^yh>k=ZOjDQEPuVNaMGl6Z3W{e7Zl*n zc0t*EEdhTHFFU*habQ@ycKB!~%f4abxldM=OmUpR2AZ&#mMyz;NKrZ)~XadHq$D z`4`mr^1aP2;HAPI> z`;>;JDvzCi&d|f|CO`Zm_KZl-KBKz6vc{`4RaLp%%`F%z!a=x!%r;7PI1IkfrnJL4 z98mnKCUi&-`Kv6O$&EKsMby{N4`-^uTcec05wC)=7Y)YctEGU_tkdX1iefc2S7Oj` zMR8oH6qKjC-c#A=Z^o;(7@;END-~-i8>{M(NQ=h}VGHIWdIitrs%)Xi+&Py^H?Gjg z;cD<>6bL)RQEx7V1u>3EKDULJiX-_V(3>U6k1-_J&BbtvH-y3oh#jteZ!IP`wDoyc zV#aHr(w#fs$(znH{;4$7)z{bg8aTMB33=9IRC#?==}H~hEp624g_w{zV=gMS5Zmstzr~v%-ZpGf}oR zm33%cjWh$hDr?*%QCfWU-l`V7HN66vi~yw?bA{5}+~DGaxKfG103nP$G*x>AMGtFP zQRnt3%ly^#=xZQ~cbT^dEsX9uud)nu8ECD~*9=bOO3JZLFsM{1%V;%1JQ?6zniuE| zU!}Pg3lNv55se9{G*;KGa=BaF7$ZFHg11Xuj3;`I5GNrJAM>43r{3 zBNTD;QA*AXJ)NjWt8n?7(U&o#QCJQ(e7sv$!rO51OlMO~4gD`dbMZ_$eDHY)wajN$ zS2G5<1{xR1Wi)b(!+yBwsVX>)Q+OI@%xRplI;W}uCC}`)r*Xm7G<-)9s{2sqY zFseLmcs9MRu}ojWV*{(cX(b-MTy6!A9L04tb-sm_^_VpAj74jr@KOeE-M9D~`Rb-x zU#Wy=DOwcOdA)cu--Gg@1RS1KGJ$ZPo8L5xmh1XdO)KEJdK=ZVLUYp0mZpa2!s*FF zvt8j*)+J^Es+@aBbd59 zx>ZAS8P+f@=*Acq+?7gQ9qL$LC_?UEhVrVcq5*+A68gD5Z*qX;o{p;dNJPs$&q^1T zl}+wCAEpRzBphZ|dok@}28G{f$4VV4jA%1W`t$fY(OpYIYR-zMxyeleS7XykwBm4( zRssz!FIGVy4VZvIYMcBm99C6c$tk=6`%27FL{|#-m4eoJv3MXsO@ptgx|%}z!a`34 zoy$YRIz)JKiZ~+q&G=s^G$f^7sl^j28p=wAe5^!Y(Vs*WKlQO%4CQWKKQ$g7EkAf) z^n0oCDD;@fpAr>+OFd?P6az*idfri5nw47IUOxF_m_;;NPSENidetQ%S|(rnLyI~L zZz<7w#N?Qs68O>!nvL~!jms7O2^ko5jZKk$0KgaPE*Hh&L8$oAIB-YXmN5JP0<{{b z;f_|*A!IF-4^Xruw6A8W!*F1QUZ*Quja0W#Y6!~!Fwu$_0L$uHe6`UGzKlS1MJFnu z%t7SI101ri4}Z$C`sMCMUv$hchbt}T#=#>Rqb69;)1N;Os6kDF)MKbjgC`C}|1q4Kq;$XNtL2NK|FM49a+_a@m<;Nfo1lb`h&|i{MBlRap|N@_V6j zGMxI7H2!}Nc-2GD|IcFW7iqjHs8Q*qUcWxgp>pZakg!ALvDqjWA}>ys=<204_=L)y zh?V^!__qk_5@BFj*id<$2ui9d7m82@FSbb5WkC__h_G~7 z_-v>k#Pl)iB?yf(r!%kV<6OA0-aUc}Z{LjMop z6hL);t-M zJG{`6!670$z0}0_A~!?z|6au`;EiNegv5WgD*c2G?*kGH6wG+)7#Pnmgi4mQ*(V~p zY?DcHvqVH|4=H9ZDfnKLX1`d4UIygmFNY8Qb0bD4Jo@!=%gwu zPOd&pOG+h;Xu(|AmXvyW+R_sZYe{LX(CV+JxT1XxPd2P4<@G`@JxXsyE0n{UQlt4y zn(#o+t<+fgA2b*7a*-O6o|ZanLK7>Z*v9&%XjPww+bUFJm9~lg@N~FeERezP!mN2e ziQvx>R;(fUts0l$)p5FdnZl&XV!W)atIU@{cbHXPBZ7@#*8D$-;4@*?MY}|Bf0#92 z2Hy;`F1k=SvoP$`eCglvFl#}R2(AdT=IahdJ_iY#cL|EoP?6!+MKti}mFFJU9YS_@ zSjVsYPK5sy#d|`8pN``7Fa&T|$c_ri*Ju*_5N7tWDEX|nn6c)Q@!t+~O%$}33Y01% z!z%M-@UbxKvK0J730?gK#qw{x2wopyb%@}m23Vo?$P*xO0q<995wwR{^J4S-A2RfABt3@= zOJDH#A%jsBSYb z!o?y%%*ofvuq*5YhRII^I3CT^J&$}|DXb-hl~%O2NN~Pj!ZR6sI9gAFU17a)8I0r{ z_9DsYq4grs8$~?If(#!CCxA8Q^`fdb3TjlqjJ0-~u=b;%cocF8BZtF|xn%31ufCv* z9++aT-wOk>gwaD~P?iWvLfV#&f_1v>(*}tK;Yo|22E`YXI=(n)u+I8e&|VsZ6j{Rs z(o1*RDumC6v${YAUkbBM8<%CQXTmD;WiS$Jajera*5lz=7s+5G)@daz-BI~>2+(e1 zUsZ9;j<=#*hFb*>wI+iH!mP#XGIV2i2-?e*nKUkA)AS<4QI9+PK!0~J;6$|>GA(V^8c?5seRS#q!eaMN;VHp`uN&Debs)bV8b}Ym{gi_ zexJ#SQxXk$ay6!?#-zkVg7|hrjY|nkgp660Qmn_#{XvXLx=LIYRL)CGgtkRhNgO{M z;&Xu$NR*g(9)gKc$uLT$Pl}qzbPHNI5k`q5aR-FVnx>A#230cS3HPNfr+(Z#HZfCD zV16p3sd>m-KeZ@9_i1FG^ZOuwijp=?F_?88`PF}%GDM5O0g37Y>|v(IMyA5x(Fc;x zql{e03}=VKtZ;TX%og5qa28bc(%^7pYy#mtjuMU{QNbfuM+;YZ|DDqlE@ zQa>k>wWt_5;ru`)mnlQ6R4RExmFTGXiM*Z^r6AnKpk0`TRzsDnSTWV;XE+u<^z;dT zJKcCl!=q8I4G5Q^0v{!~RrTw5ar%PxyBM4z^`E9n&}}6B!hnBrtC8r4A=6@N0D6LC zM-7?DrmqmX9to>o8Zy&O$C1z<2z41UZKhVpiU}PvWR5cZ4B2i%Ul}rU6h?`&r}1H2 ziH{xX0aGg|SMQ`m?*dv#>Mt5HO(t@tnb1py%v94$KmkH88#0HO-jV1PO7sJX{$|L` zGJPu1tK>r1+1Cu21t#jk-1UQo%!#I<()HI3nMI}xBznV;=`dXkw3X6((~wziS_;Hd z|GOcx!c;BMTZYWVCi?d>uKBhhbE#>iMDG|fYfbB<<{?97v*|{O{$a@UndpCXxy|Nc4drbG2!kL?0S6TUFDufV_-9GG?}`CR&bic-WY^Q8m#&*E~h8er(L#teOr- z!L6$4GeDlqC&tVNRZ|xrugXu2nMlQaAtJV+#0WwVCpv}Gx&?J`>lRUt>ku~p9pqNRns~^UJ@q(ji&1*JY~%M*=X7%;g2YClj&Xwe==sSH<=y; zyp2r#f*LTH9+U7_)PTuE=bpSmx={lr?M1*Hq>S$f&fIF!=zx(Nd^AdtobBP18$AeR!Q6+czv994e<4p-T>hCIIT^}(}6d}X&a?{An@im z?M^8l1iUp)qf=HM-v<0(oc3oa9}c`NPJ2$`5x|efX>?M`{mTU25vLuLI1BjMIPLEe zX9Mq!)83Q#EZ}`{+9wi^1n!K}=!-A7y-~og#A)=^7#xoVJ{YI{TjH~U{~o8sV;JZ1 zbAS)UX>{_+aSrhNaaw`Ixxk0xv|@=dmt=kxr&UOt4}2s}YmvAB_*k5Foy3K}$5CDq zj{*K3ja*kNx+*eT7QWr1K(}Y@+6)Dyw#$WNIVtz0gE`t^ht5uPu^z5%AyRwJPA7 zsDCX1J`}HAA>}UM!|~dBiI)O@7O&kYaV7APc2DmjrJ4fPL;PnaG6p8DA+Y_`|5?>B{LxNTT%=6O# zyfHzmmGUOw%?a8y5;p_iouJ(&@fE;Z6SVsz_5weUpgk$E5BR|Z#axByB^4DGmtm%V zNzXvgyn^`}XRf75sT83HAvf32q|^cQHKEI~UQ*bj2pSiGmu{Y9 zS^;{PWRodgD-a!1o2O8`>wvhGsXX525Lne@evI9h&&&O2UOqldF`F^H+=s9w!%SZr z@D~KlR~TOcDKgKA_;w+sLEcP&lDQmdD3SSnqGB!s`xwOW8RiNEe0*hVr)BSDKx?QM?ZtXjFGgM+ zs!3tAX0lKd=UFr;hL_Q#{zA&y#K>yK@*Fr^!>kx7sdTN-^mk~|;H!-xcisc~mC#sn z=VKrmNVRd~z&|A#PYy5=Fbf_8&_pP#Fj}99V-(mX7A|$+*NCT0R#i2Pa5)N9n?}C% zSLRcA3Pt8SylE9!mn|e-1vjXq+k_GMI+(ifCornqUe z3Z=5u;lO+}Wvzu`DTAc3@VjLT@kon@L_|wRUh!^q3f z%b>-rKFqCVB#~qjB>AzSYc#Gyjk1VEm*52)>=(Kl9(M?m|K zQtHomoqWtI;sc1LlIRnH1B)s65k(q!Aq5Xp(^ZDcB)>!r(xon3Oi9O6d5&0!0^@1N ztCV==7GR!uf=Y(6^yK=elt5+@CO7U%BFEW0K}}7jC)VNeogn$vj=Hdkk}2THI1rO3 zQ^1os%Xss_HM|lERa%{9UIY1D@_D?T(o4YHjY94QR)&f~uW4vwRT^!ul2eo#!sFB= zY}aSHkhi}@;aVuYPk4+d5BxctoX&%%(SSw4>anGU@^Nkd!5TP)9$aW2z=)kUXw8W8;A?b>Umd z=!FwePoE=jwhbS#2lHBnVQ>o+3LwMQ#xrE^PLV}*7&m|C?;#uZ4ww9e)XbFJK49a_ zxc5NfETfK*G%?06y}2l({tTfu)F7>n=A|~&z?~i`PxzC>!J4{|-ip!+rTU0F;2n=q zXrO*L;%VTMR3?Q6YN{yb>AalB8hANRMUVWM#AA2@nFj2b@uD4P;6=;(kuJ;Gf!rKN zhP3kxgWp5EPT-tYeAv+KlQebk6JXv1oZH%}{st6cic?Obg55AU3vXY9wx3Py=x7$n80afGAPdJeMD@23;~ zn_dhK;F*M9(&Y~U&yJE$Ky{5q{b>hv{YAjJgmwMwaTL~V=ZC~$oIJhE9EQfmR|7xm z#v6d=k?~)2W7N(UM&W)iehJ~94DTQ(m^tKGl{{}z7mlRDyTnKn6us5K3+@sl@AZ!Z zPbGgYF;cG|@g;B(;Y*D_;|wp;hT+3O*k$B%Rs}F$_blc5nNI-ECAq-;P`mR9U#9EN z0$xmbv5waRR}x;L<2QkM#p&^t;Wlw_k!z#O&|o`-ynma#&m4jra_?)w??Ll>ws?mT)qn&z{iY2Dz2cL4S zUJaP6(UP9S)qts5n}lls)3p#F-=Mt)aENx3lwJ#H)9wK@AYHW;FiUGi&babgz){*C zr1Cnz9PLR!{!|?REYS8z>3YD4+BU?c^{d(jI8}RDO4|X8v{xkz0v2m;NO%LFLwi@k z4nU{&k%Tt_mTO-~coX1!?RyC~0#;}Sv=6>la5LaiEl$E)0Bg1Ij`SwLW~~pTysU1; zgJP?yrAvGp@OoAI6q(@i+kx9vElbMp0KP%h=s|?be*?Tx)s~`WIKB(`R#kgR#=jSM zv#J$H{Vl+Et6F$3cPsE#HR@T;pcq@AJkeTe@{35;S@b}$TB6ysryh{VNskvHiOT3{ zXOl#8=wahG65$at)pWl^c!W$hJtWaZv={%FL~{+;i+=`aE9%jTXSz|Q7l5b-TJcO* z5cSNY7@~adAuuUM7drmNe%nn|pdVl)>9?ISay`(m0+~#Y0}Vr0CYjmv0?^q4SxiTO ziUdkFS zO-nKV0a5A4andu)k0E$7#ks)z9D-XBH0H%U1cJkX*T8um!GXHo%cOU%`EziOAUH_R z{I|rNXdy%50h_5f{3_&qCz*!)WNKw-66jEL$^X|{BC!0Qt4{=$568N8#iM2H|J0l#_>q`;NTw(4OMCxq{71y%eV?EQ1pQjj*!0e% zFJBvt)t9fV4ibySp@Pm4^uN`YFO$aV%N1i8CTP0m3R)qk&W(J=>d7^ve62I0sfXmN zjPj*O`6irvZ!lIr_BDiCW8Oj7E3kYKAvV6^m}hrT8>7~UNmxOb;urDIsl#DB^>ajz z+oX%muV9_3V8y23OToISe7zI$N{3BJPCYPvM^oz??qJ5|-`=5pWPJF%%tcdQ|MmF4 za&B8-K;=4_ug zVe|19Z@4CD&o1rNpJBTX92$a~ejRKo?!~y9akt}s5I237ARRLv!hHnyN!%9nZt6I+ zKQj@x1NUOw^|)#3rUzuGDT^s1xM+z(_#si5^hiwjdLeHT_%X^nu0I1)KbeLF`P*1u zC!;V{;+8L@(_Qv?A(A`zQ9h4 zNAg9!TwQ@M;e6b5(LNL5k3|L2MhxMDNP{lg9U(kh_)dFlgwupRt?UW^S$0G?PWTnd z04~}_BfL!L(@qrOd|{s+tw}Wi-=7qDrAJ-T`4)Mii}n}^-^GVMT8r zmq?1op|(iv?0=#|uLVuUE&D!|JJ~U!q)ogP>us0(mhBr`FbdpOC|l$hxV!IqefShdZQB+1cpq31 zYDj*}wQStP(T8g4zfM|lEPI{xaOXv3hT9kPz5VPtHGkVQ^|7<-&f4>M(g%asZSb+1et+d6<*nnFBwu>z>d!8J+w{Q;8%A9H>N_8w=vVnm z#^Hb0wawXcXoKz2X{UZ%eQomdcMW!#|2Exs`=XQ^wluYWJifd6hm}8+TGtfSwD}gy z{BX_MF-dhteBZcjx2;|~@ZQxI{FsrkzVhJ{&#fN+(-luG?@N8`THLqb{vGZexL?No zA?|N*(+=eT+;jjw4R<+iH|`a>lDid9Y)*{5BB?>hiTq|)C>uKCVi_R2?MLU0j zMJEr$q9sulC@xxF5Q|nF!WJzvh(&8Q!J;J(v1r*SSacdhEP4$=u;`TrV$m~=V9`Q` zShN}xtQ!G|Mf>Bz3EB)J7VVS?En21#ird3quu7VZ9uh;(v9EZTn+T6AbeEILOMTC`Lq7Clo4C+PT&Sag;rv}id@EWSzx z#YIPQ#G=z+5s}u~#G)m*V9|1xShUI&EP5k`SoA0={GydPvFK4oXweQCv8p2G>0y9a z^o$_1=p2JsblN0brH2Dz(KCb4q7^x@XrV4x^teGRdO#8^dXyj*Jz)qIoi!4Rjvxh# z9z%#l&u4;l3XoXzfFM}+3l?oui#*b!9%<1gk8t%{p+$RnA|f5#krq8Z3oY77CKhcm z3tM#lN2~;B$%tY#Mr^u}8ovm~i5XC^Kxl3AdIgipVSx>Nx|TxHo4gfmiY}*4PKz&3 zu{J}FSAtHH%X6tWA@9w;JQmuDn8OvrY4PRR&5w}u7GEB^RAVykO)if*%8`C=_QQu8 zu-}{i@+9G`Gvr@x+W&fn@@*BhMSY+*|Kz^uWK?i(a=A6=KZAX_`KF!0zFg0!SIt$_ zRmnK2inDBlZVvJ@1b0z8txUSRseSOvo|Jr@VTNX&6^OgR+`(=%-Nah}=~EjhxL((% z_QEfzU)EEf+U;uGOGCQ8Xg~NOabaJN&D-|_2)7G8YDfH%deZ~p^j{&t4Z1yQPyCX4 zG5%8eKjYpe^r?OEOX|-Em~Mn+$`^f?_NW_myVTBl=*8rV^yfq802(i>WCExFD$**g4*W>Gq^Ih~+QutQjXkOjei4%Hq zyjOaA)#QBfRidZG&>8sVuFCrS8J_z3%9i~4x@G#8SLPSwjn5k^z334YbDsFR+Pqo} zLJI%3DEclcKx9aF7-2M5@h!0cDDUvMN(nvr4W~SV;9*%B`FhkCEWVXAhKsMx!WT{n zru?2OKzKo46SWLMtYeX(Tzoet02)7iUnT!CUepf%mM*aI>_+N(DC|CB>R;yxKD?)I zBSeU}`d4e|Z2c>>xD$F7b%!X-zy3;S$#1O^kbg;)2+OaXia`DArF5)d$sLdU=$CPl z%0?y3VPh-<*r+BpvW6M1W@j6(GE7(5=-C`!&Qc6_s;R7xG5HZ@x{94;TxHqFSSgEh zvU76T0CP1PWj5B%VsXZSK4#Bneat@W{cT~UC9LljmTsQKQqBKl^UNFB$f=B(jXuj% zW8aOi(`O1^6;|qWH#tN*3axSPn+#$4nI2|?wNcn&Ag3S zT3EI@k6CDRK<^BB9Cr5Nii{aButr)x6*mi05H_#nsE;F!Bu zMnV~je}`#{Sn6|Z7~IjOvJCTLHV{rSvz^(D{%SUu17jkh{Ej6i+{_GM^f51DLqX%; zhUM8zgKINpv3T=6EZNCY!i;2;T}psmV7?b_x3RNthRRgr_z+Y5O!*QHpk&w~Hs%gC zVhu|^55{JZ6MfA$GutIBV;f6b#4?O6mRZJyJ{IqXtH#NlEY(;#Rr)&+{$?15SFpjx zMaUWaG-j-0sxfsVQ!J0M?1b4Y8Oitep?du+ZaPaqKGWcH66M!y$zQyX4KuEo$~0q2 zCrc`2+BBA6^jCnHIF${7KRL5d2F5EYSR(!}h4n+sQr0h@r$2;C6U{sp#rR9ZG06vPJdy9>SlYq8>#tp+?M?GOJ-^3e!rN)$-^WNxbDP zHs}?W^e4om3Nm`pj*M0qtYL|U@hOZsxKjz{zpzZ>@(R}9m=2HN!|?U+ubTWzC;zrE z75&F@5z9(2YKCkT6;@$3CKw7-HUgnTEIq(RSYBa$11#CHn2j*{HnQQyq**M%G7x2B z$m)moYe}QF*U!8To>-2u_=PCFA!cLZXV70^s8m^wAv1*y_OlVl(Rb*M>&%vCSf&N# zY{*VUK~yX*NEi7pzEL-vr73m0JCKp;}_bxpxs)nekh>~P>v2-%t@6sDt(v`YhWFL9Q zz&XsEk6N>!j`Nsm#?trN%HK-V^Z!;~ykd5x~9!oWp^xwh~??ZwWh&j+~ zJiPi5l#FF6qNkgUTaB~8P5_t6D~}C)1aQsNMl2de=%VCn8p&Pz%d%9E!SZ* zor*XZ!`@#_R#J?=6-GXgMldp%EjNd)#2cS6%;K^CiGGA~H(MS@f0%`#VmVs%RCbOT zGXrJJ_}-d|Uh*~8Y|MFt&E)C!HJ?FgB3BxMO!P%BBJ*)(W6CVc2G-xhY?ceT{pZ$L zq6%({D7dK=%w{&er0708yQaDqANrY%uPB{t(4$bD#V~TmqZ#KRKP7yYi8n80nKkTe z$i_@%1!#c0+SqeUwK&m~LuxwfmtdLAY>%=*hgkf}n7+S5r`TwIjIk!B-O7@$L=*6# zm=`ZczupM_bTnSgd_EiaB1@gda;WvMV?(AQ)*@pyT64T{__r(>66P4M7RSd04#(&G^Jk2H}?JW3^gZ7nXew&SdgbfF45XNcE{CtqH4aoL6DJ<n5eR$3C4bg5h^U&X0daO73gP9HsEG9@F>ef9p?LJ zbkH!{#Ty4;QE~+vypknf4v%Ls%rOJZma#1LMK+1Xtr1gMQ71C~3>z{VC7)qFh!w?( zjckae7PEezS!{^Whw01M$H#_ab{&WoIt&hGP6OG9{9nwnCsU_Fa4G6x7aM3yqN!;# z3JJNWVQJIYKudolx{f;VRn=UgVe0vo4SokB#YXD;8b*^L#>cL;bkdy0@=@&A)G-_1 zR4SOs_`tQFA?KeeD82LqCu0~&&Y{5!s z`;{1w;{&u(dX3Kl#>cPhu~=eumScR*+=;Ipc_8BPI`v)k_e{!D@{D%eIEcn+5 z+yY8|UM_H@pbG@QOyFWcCklRnz{5e$Mf_w?O7A=DT~fIo14R+#?gpiN(avWs{x*P~ z4cZ7=2ud5S6mKLb#TyEWbEn+?pj57LpcL;*>~<3V7<2;Yo1j##yFkZ+J`GCo?+48T z-YoEq0yl!9Ipi(@rTi`s@;RWCexbl;3p!NLWKc@S0!rolD+-^|`2m#h*8;x|iZip^ zCj@;^$nO*K5Gd8l8c_UAn}QEYcN8eudy6U^f4>7I{#H=pAHsee;pagKKMpz)__v^B zZ!_p*-~>=IaRka_|6|Z8z;A&L2i*&brl0Eqr6Q#_42dRzlAT@Hm?M0rpff@7mpcL< zIO3f4PZU1kS3n6*0v!*0HYla{IhYjxZ=mGIc2G+HAy7(xGbp9M0*O(2R(w#rAF!v4 zBkJ6bL2CFWtd*eZ|rII^L@cV-z%eh8SDwh*5Likfq!tV+CilC1P z`4)k17j%uF9wDDAaH*h~f+h<2NjORN|0U?#g6;yP^#3UEW`WxTrq_Z=ULo)W0@ItE zWN)azaRMJlW=Wska3cABf$7|x@cjbcB=9PMmkE54z~>2kmcYpZclXil9|I+O9|^hx zleb+>`H-N074%_2|Bb^g8oBL`j$=N(-&_Nyk}nbT8H_80|0*cGVNKX6=(}jlgkKkQqM!wWeu;if@=pZaEhvo_ z#23ezX1Bl@g3@dGB>yA&dp?Hvf1q(7i%HW^kCQ;rHn|*ap3}onCjH%lZWXju(4~SF z32GBm5%jRIvs=)ug0>2}RL~+pZGwW333ERDBTD@v34N*nosX^?z_j9S#o$2~y%$25 zGDBCR!1DaBT z6TLz%&*$D0Sf0ln675G{W)2HzZmAC9rt z9b=E)7mBubUJM=^gTIWyQ)2AVKgLAcyC+6Y?+ZrDKa0WN#$frzi!2~IiN~L5qhLH2 zW1rr4inf1tjGW$QjFu0G!M}~cffzg{22o?{3zAJ4vM2^M`;0Gy12KbmLJ!uH@ps zMyIpoZ!+nq=Z`Y!yq@;GQTdGe875a5ek=yE@J~VE#|T^S2ac~r|KU29OZwNCoJRki)AQCS2R9E`zeRC1XNoTF#o%T~wF8p*5uY@x3<5fbXH(u0F zTt#Ww!!hxbgOn`FOO{fNzp|xD!7ry(; WZt)XvWW$$LI_JXTk_qFeYyBT;gTVO! literal 44180 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 F{|BT8g&Y6? literal 28868 zcmb__dwdkt+5efHO|nTK2@oZ)F|KlpN;V0E7!e@^f&>D@5D;%&HrY+Gve{jCH-JKG z%0*GB)r!_yG^w?%wbqx{VoR-Bs`h5pT5Bz}w&fN}ty*iXwbsh-`#tl_?hxtc*FWCj zGy6Ty9D3=WU>4IMIs-sAh- zp>pJ{o3wS9@>0lc-BB-m=CJ$iyN{0R&_(JW+N3?|onS}(?vPVI0srXRuExRPU2TKI z9^`SWp+ocimLEAtQ|^P$EH@1wjI~2Y68i^-P4%r~v|awxw&6WBzdWSW_F;F)_TgOQ z=|H*rYJPa=)y{3&-#z<(cSym8su?=6w0P*q9N1hlY1{DSGq(+|1%`k%UE7B1U~7)K zZMb3FHu&+WS_?2Y-F5M5$MLXYPW&)ow=3Q%8E~C;SS*uQkBSfd`PU zanmC@5BfrZQL|O+l{7wn46%Cs42R9vj~`!hVBM}aD=r&+^M~uKa)yr|f2Mrt;G0hi zeF!=eL9=X@Nj}S^Pb{Z-UH$V1)@^%^^pWGoC;lE~w4puP6xsy!Q8l*>PnCAE`;Cs< z!0JZ9{T8klx?AY(#sL%k5JDeL`xu3U?jLK14lPFCSd2D}6mLIVKIwKHb3-MLsK%i~ z`KUYj?vkNH>?3SrRde0&D4hG6whwz6uN!vbyss1e1AXJfHr4I-dYvwG=+N6Ms{T}p zKBxxJ_xD)#IDQ&St#&rlnj=Qz&{MfeJ%c>2Pp=ys&VvseQ^(HS3j1pg`O$vvi@x~B zQsiO(rB6m;+hLEo_>fvV^kwwlZ@F(pzeayR8;>(ou8ZllN=>Bx!Ew^3C?A4+i1JI1 z1V#R|Lyk5mV4l4W9_l~Ns9~O!N8B}^8Ag}Yc6T{+W`LKNnf0B1*I;bFfIhLNYjC(` z<{jvNE05d`J^FvSDL$dDx;~73+t8sW5&IprmhP#dYsveMAVvjlwQJZ@@|nXP#HR`E zLK*9N33S;Oq}^iseb^9j6R)z%S{J4KHcgI!v*l0J}!i=t8v@ma&znOcF|b_f88Zt z(0uA#3qH$P=qSh87K_A>O32wRy6!c1BhDxGgBH3@bkSWNx}e{CyBI`a(Z0uN}-mJd9UeTXU95-@3&iKTYC4 z;NVSxZlFJNw={>z11 z->iguKWL6Kw$}lSwMml4l=?HzZpm{1dAyLbJzmAUVb>3H%*2h#DlZCbWNbnN+Vvk!H`*x9UgJ~vzknl@~?o@VefJx8fI zI9qY9!5PI_3g;S|iq&SMZ^6mqe&8OQ`*5~lK=By5&QMQ-ehKHRIC)?IsP}PN^B5S= zt;1P6<6M6Y{^6RVR`jQR@oryVxG$c(+82yQ<6XgYB-Y~#1=B%aXMcBhIO#7?s_Osp zDA?@#56AjQctdT?c{RRJe_ui;R)Z5x+Ul#3ob9Xi*Vg!F*5IeM&bPVX|I)Q8Sc}Bc z;bgEY9a$f?%O$or*nRO(*q010l?Uz_a#_R;>bqeZe$5 zp?kqDXION)Ii_=j!d>wY{kDN!n+}o?)7yhwEu1KmY-k*dpq~jE?>W*x*vuDt@lR|q%!&RM;bjlY_CQ-GncoKC^M^Kr5N@*39 zJDCw!lcxW#%>;XTFltgG2A6MHJQ?;aXj`S@fypS0IY}y5ncfihY5(9tI5pkp_xo9~ zzHmAj`FLMkm115k>W{Hjm7u~&-g7+~UjOCBi9M8z#`rF8-Cs?#A02Gtshq&(EU;keoc4Y04US& z9K@Q`bmeV^KA0PDy)up5Yc(_HDHwOVa}ZW#dUE=3?J_-iuXvPly$rpabFunWt_rO6 zbGB~RMsr@qV$d}P*>bkUtzwF(Gen)6sN?z~tmN#Z4>@kv3c`bz;y2g*WBkIOMqK7y z51@?Pn%{tvcRO6UGw<)006eW==e8I#!~IIr)?5!C2!O zNE-96VxCitxgZwix3ezejaCqg@_)lZ%ZzWr+J*Ul1uL)IcpSvy{8MRdim?;Cw*23) z3VvfRh&A~KNmOg%^87!NsL{mQ{I^KdY9f^XcM>yt>s3o2-VmNiGY}++W(a`T zB=hD&!<|2~63%*_0waGGlPszj=sJX-{CXyf-1&>v0E^#3j{L=Rwm272&u{UAtMZ-) zyDa~LuYvI3?nC9zql)sxP|y5Ec4N2ae0Y~XU)R%fCOG*EnI7f2k|vv}Q&Mss43w&( zvi$RZ!P1_g+EQIGmxcMQn(ITG~u2e-e`Img1F6nxOPtADOt-0E}o*-1MdVLpiU9W28 z;wm`5mtLY?S2Dy_y`tHA^;z|5Mvd}gPeVg@m5*#Ar(1LpeAY(u(8{GC#=1^H^$Kb^ zu3WVkiUl+2t?M~-*MixsoauJ2LRd|Yn;RW@UqJz*3Qzwu@_Igke&HGHXv(t<5hy&9 zX55}tFj+WhCDOT`sZ391+M`@Cgl5#LoyeQ({v3YC-Ho489rCFVvE0MV zdyCa9N4|j)cUci;Qg=>tZa2f7XMj^v{MuObEl+|~{3DafGsN^Urrn+<{1*R-c|BIx zUT3IAd4hE3&vd86YN9vTL}laqQa!5p%`)UFM=}44e0sX91Va}-T1_Z%7ytDI6yf;+ znz{HLH!7?=Ptf&uIor5BYuOBc=Lq$A*3*~wsNUw$6VyLmL;9A9m$3ZzS=BaU;wC!z zPZAx*#3$iL@dqT<7!&`+BK}3C*vtqJXTW=f{K6|r>Q-z@=nT1HMJKMWv6IrpUXRzkv~;a zkGZ_fv^iccG4{K>M_68&mObtAb~6$awCpD?Zw~WK)Usz?-tUp}Y1s=d?|bz63@v-f z<-MBu&eYTam-iaVCTZ$b_!-=wiYII8pv$`*b7b)pO&xW4JJE#2Q#EzW5&h^qK3O}*>#{t!K|_-swR@A4jFJkQb8hc53Y+0fH9rA+Ue>`_&k za+}_JSO>qRJf=67R;o2M%Ji;eOV?orwrdQV}8K37xIO)nP-#SNOOfuD@ad77#-z4x*Xvo+OV zdgsu}`I?$zdOu`&b2Qaxdgs%#3pBOR^loJR=4xuO>HR!?nWw2%)9YpFjhbph-C6nq zgR{*V)9YvC7iwy)>8)T7Y1W#(rgsxdSZr{zh?-uG-{KZS&t9hYe`s@w!O3Hz>AjU+ zFVp!p!%zCM+~D9JFv}AQ7pdYE2B)7pP47lj_jaeWv$j zQmZs|zv(@j)M`yVXnL#Z*~OaLV|u5u^fj8=YkJqRewS!!pXn`OFTcVVi!t^XJY%~D zwCriqdoHQ9n)-?9-9svgsPcOF|ar74fwyMs2Ya&KY%Z{r8w%VCCZK%`SWe@HJS;0l8QE@kKmS{9H<@GrkEM zE^B@?jbc>p=N5za3~JK-Ak2vzDCTJpPNvYDsAW@j(b|2+)SayQBoJycIlDgr#c9`~ ziHu1skVj<+eqNoR)LF(wM$K79n}NqNXa53BqmG$6nA-gpWITtyH-Ic9tNszNrrTuI zZyv@pj9q={ZwaJ&mk|%tEHq>Rj&bm%tSa75(Nlz;5)Ub zplVq5M$nZwjos7Wbf(B#!1_-`POV1!7>z?v*{5@U2RUnL>>x-UM$0C!Q0I)r-bxQb zc`}PG-UciGe*8>;w_ilYvy67Lpu}wl&y|LYFNhp6m&cb8;Srdc`d9kX!RvJ|PGk3t zV_=ZUdKf&W4O-2RV-7F?{^I0LMDtZa-ORGNp=|0*=!fQ?smDcQC*`|mSV<-3p;dUbsf zP?V$Ds)qgChp5mGW4Cv#Qs?q6cZybpe|6wv8)6b2I>@qkynt94yFZOyH?0)TSb{4c zm^Md~lxzZ7f2A@GG1C`F&|OXa7=furO%Agr<*>{?jG@ZAG1ska=lMX5DN}0p_3*@a zg9f^xb>12zeg_ZFpTqLsngVim10B=JCy=V7%3Q0OIp%Z>WYpBfUNUC@KdfZMINQM6 zSpz!hLTQydp^`DcCpj4dLt-G1G4M{-fKIm4z=KW$oQN_8_KJa_jDdHv26XaX8rbhN zz-cXG;D8u7lrivL)__jFMgvEk2BJ;_`w)1>;7m+6RuJFM8qmqJ5!uS8p_YjOpIT)- z5CdHq10Q4!=wv4i9CaGtBQM*)Ih>9?Xef+IW&C9q%v|s;Sa&g38Tgm$wre+L>v4%@ zYXp-n|0+}Bzq2Lk1rm`EboHaSrcASlX$l*mXXhHK3F4&;WOqG6wi$E@NPa zcyI{}%+)>5&^uo9bl0=eTt-#ya+=_SJ==t?^R!thMVJI6LQU zDfIbFp{AoyE4_u;x%A5T&8LTUp>s;m7Z|xQcz$pBo#QZJr5~b+awuj@@Zn>|#AGqi zkuj0yFkz*+Zm6trnt0V=LRY;NQr+PHydH*h)p@s5c{%vbs++ei#Ds7TugjdM>AdmL zUS=5s)>OzUdG+07jc*;OMk?>Ml`)6d+U?ZdpVhW(&v`*qr{eD23QE4CMppV$%=#)6 zGeO}~*i2B~7ZZ_;i9&}7EB!f|aHC&kOzjJ+I2`)0~b*}8S1q++%G7NSu0sKBBczNv5O1M0tO8!bPc|q>A znDn7~A$Y%l57mp2;2OmrLgF{zd_iliba|TKo6!K*T(>T^F4+Hu_?uZH{>{izj3*XP zTfCf6e8jH&+rXw1zp>bs6Fb4A6K^{5KM39wKbO(m!B0CR4#XMMI`PWFWuhO!1d-(;!e1@+o*Pa;fT=x&aoj(=a z-21uxJ^!;91G!(<$;Yt7%zc2#rZjJ`-s0AbWpTlKbgkdu9*xCW_%Jvni@8>}7|q{c zukGfxBv)a2PqCDgYQ7YzW6ru1Nj8NgX$G}OUHB32Jic!%{yJ9ed%@y@s+0*!>+?vd zmOQvS_I(!(TtvD4xfm(jRPc^4*L?+u(cEor;lw)jmnL;TNnQQ3)zandX0H1N>T(CS z#f`#UFX|@^Tt$^mK_<0iB4S?rsKMpbBDJ&*_Qt6n;%=q}LiY7iZsC@avVQ2TYUS3B z>vR{FN7{AO%>A>{voD2^tD;f{-ufX+H9tb}ET%ao9g?M$2>Uqo4@fBG_%78q2ursi zNaOhSlNNAZ(*jG{{0M9Fo$biN>C2LEnI!H!MDcyR^WZqnidFM%;GObm`p02wd7=w! zc?Xi*kiG~18AbYsqD6?~^T==^UJ=4}uF z#@!fWO3}DNv&dVtYWx_Z1ap+@RAm;;En24|FAB0Akv@UTlh-pHCO&YHt; z8Vv=S88gnIGIlEJHSQE++5{TLBLf;aWgOg?gVsG&yO(3THy-vpRt0IOOuK8zA#K>HxA_Ot4BIPjfqbsi;J;P*A7)jd>I7Q2KOae07GS1RC zGslV@EaO%BfEE@RpRA8IqznPrSIHn*|t^G!M`)3W(oXy(crwisyr zS`>5Ejav-mD!a7_6Z6^G{3ql-=QOC2v!?J8U6tvD$UPRFtg24cj&mWa-?qp$s0N`d z^EH0SnsKF;#@dZl<85Oz3PC6})5>&v(*(Lzmvx1;Kf#?@sEo8BD^s71E6H;$PsC0G zgwmnu=6NiOF3xuFk?H&_iKU-aJE~ziK>eUFR}^&9%*zs#H9EqR!(8*T*5*xMCu{;k zJf1g!ek{mZuow%SS*X!`VgTmoW?Te;x-ir1=sL8%*ivPj>cF4}Et%Z9ds)mSS*FEU znqd^iikRJEw`SP70NPu|;l*C554~u@!vqkMak|ytjJ82bWZf>mgn7@zggrR53KLe%FXqjIN7uZA zz#9Rr!bGFRCoH!4Ohh&R;?02FR+4bPPIeIX;Is-tg3D<5LU>yzI|y7EYZWH&Jd`ye za9OGOtTm4s)U8fevyE`4POc(wn-K9Q?6bJ66Dwq>RkYKl&9)J&23lpAL}!5hG%GuS zn>8q(aFfL)SVlXtMmuQKvXtovY{11hbJcp~IX-c)7il(-P16W1*fiZ^{A`**q*xr--bcz?$N$C406a? z`LbpQm^Y=2MYBW2u2 z$oNR&GMp#zk>h5-sY~Lflj|}r+&{?JCGq`}>t_9$lc^)8IxC*_8Qx^HGQxx-)8uM8 z^muTpv5$jD9L342!G}0GmibW8J~&@A;^bWPK2GXjPScYZ$2Z%8^Nu}FP|Sn+YjASj zisE!0C-dWzu;Eg_gJqZTucFZkAEeO>oJMtjDp?(gbw%-Ft#T68!DL@mG!pCISk)8j z4+lFVz1`J(!PC-;Mmno|y1GuPRp&qNzc-n>+O~+d+M}6#%6`k--^JRc(jk=S@1@UH zx~e-G52nFEjKIOm*hr(E>8lgrRE8aiTX~S#PNpM$VT+ka_a?)^(1;u{8bvYGV~J?b zRHP>sj9TnSyel28a^%6gpjD|*5>hPJ?N{PK;mFiMQ#z+*P)fEe>xrMALXLRln~O z#ItfMcM7k^#(FHBRJ?1Q=EEDjFpCP0;3EpSdD6e;nMO^IS#(czRkeA|lC5=1t9#7! zJ+0f!;w?2x&#CFTuBxWW?Dd-y{D5w=Y)O?F@mHJW{>9bROIyur{MFSnU#aPViS8dn z%+dFl8~kSe5_7{6<#HQl!IrHns?3;w>)^I}bK?@6koxi4ZeH2_J+s0!+3?T!n>ng` zX>Cw|0@?C_}EcP#5Wt3`Yq8UimupV?pIs3n#;PkG6H4(r9*>e$d9_i4Dz2&rQjA_(aBqo za+~HopCa?H(S4)Yy~Ld8M@+%pt+_{yZZm(&pxL>^tne>2@4EIL^O#!FYTkjw8)}Jp z%98K7=AinCbpgIrm5N*w4x}}(1F3i@6zEDM`GQa&ur3k{sbwoK479K8P|`sHc#$`R z9AsZSzolc*iuM)Do1u(%v$ZL7mOwlfy;|`N=RmMax@v29eK@KDEh_@4;QDYN49nE) zL=geL)Q`8eRSGXrFXrphG~U+SycEMIm<}vl6le{{0t>A7%flf(4&Xu{5DRZ4@S_tJ zb1`O(-Uav?r8C&IPM5VI8A*o&oxxOC1@Mi^I)#q}P!6o7)P_{x>IB{lk7`GH)9FNj zFZ*l1Q!RJ}yqT}Hx5T>RS+^}q0lWqsPO3zrFQ8w2*ZwZ(XkWE_fx??P0n{nHQ3bks zgOQlB;}YoVPa=5H{yv6wLvUTVKM_cUuhN+p&0pEEqOEzk>f>u#c5LUjwyIz{-p!wg z6^leKY7@c>{)+QNI2o`e48|gnPAYyx!0$p-Fp}&_2D{T%-NM0Sx-*PWCWGm)iY!FD zTH~p-0xy-uw>)_FJ){_cl&)%DFu4x(>(lOs)BTAB*2~*?wHpPcW(1;PChQ)eUth;; z6iD&&3#BI&#WvA>g|79d@FKlR;Tsnv@1k@5!i(VuQBvU}3Gs~GV^K?Mv-aBhqysK* zu-xV+J^ZRfb>p4#SgeuRk5$7)W7Cauxxv6OmX-E#sFZ3U7-9w4Ull z&6BMNx#Jal-2vw7-vw67vON~Gu4rD2>&XtG+1A0C8M ze<~UdCv=@6F?7Iy4!hmil3{jTl)pF_!$&wt-2&{ZFs3Jb89)jHC}xjM4js!D!=t-x zD!uY*eEibafr|vbzj1^_Hw(uLqRU=`hD)kYydNLyWJa|Wwg`GXJWqBpr1(SyX?&Lh zQ}|8tw%Jq^+QtZAp z=++a9LhvzqR8KhF5l;5C!}BN>lNpCPTY#igN`nHjO?REZv%;5J=>$N zTa&+irEyFry5=c9(%?992sk}r(&|UE1Oh>P)TaBsw0Y*z5kLevwefovOo^CP(74N1 zv^S&UVgaahR5;jhfwitZ8!-1U+V<5IN+<0D)+l68z+BC_YW@NRBb;tEi-X-+Fx~IX zOzyVh_(-l6{sY({05dJ9vtX8GOJDGk;j8-5M(7SHt_H5^kD&8A228;ItjJzB^18Sn zjxpS$67~?19t-Q%q#EEL)InLeVtEG_2@qM%;RCVtRu5T$-q{z4MkDDy%b)d#H>M^` zP<@=37}K`)6>Bb0`huWGdRH_YjNz)OJFA|QS1e!D(!NY9FJG~;<-+CjTdg6cJKG5{ zcGdv?bn`j^)R!#wD_qG{KdN3^cA9vDicIU40Ufr$vy!um)TW*fGUOk0U$ybH@0 z%szDNns_YCL4-@a_G?kga@A=~C82OUn(TAg4Og{wVU6Hee$QPd?J$Bd`v06jRc`05Sf6GcoC{BT#< z%P3U2z78eox?xtghr3OO@ZD&r9}AQ)KA$)Vv-V`n87E`Tu}DzILE|7y>e?4Ql;?H8?TUZt1E_(ImYz$3zr zX@_%(zJ7OFUqmik)Ee)>a-hfQV*uY~@uj{8QSXJcwe|Wh7WR6{h?qr7DSv zRf*-iS4rrerd!ZakPI9LXNF3&CGn2GzQO5=#&Q2*MKBv(Hnl86)P)Nc%=T5b2UCg8 zNHAu_ud24@EGvcEaK6`a90#6!Z7v!$TEF|r+jAb1aW)lswz_UMRGH>jJnl_56}fLV z78aFUUgXZmHiBPi%bJQxS|Rg+<}rkGA5O5hxwo6w!RF$kGS{M_5`NoZ9c!?Y(Tfvh zZiC#lyx{q#i&RsgUG{!#8LU0ghW4Mieb`Q6U8a+egWFq8MU%JXZ}(i6cYW@ToEzLX znm566Q&EHK<$|KgO@(Sc_qBrDGExSgp61l6++2^5Zxp!3x=W2yjPYifF~OMV@|xvF zh3ia1`BPW-VLSsd=V+i&^tKViqA2(b532@>RGk>kW&Qj19 z0Ic3{OX;`L!Ol*$v(9dDI3qjAU@{oP=h{xz$2r&(3)>b^p7M9a`}k3=^5aY0upgtU z3T|Pw?J(S(%C%Z@|E{G{RrcOjtWe&Ic>+uYMgvo6w$6<26%W;_4t73a) z4+EdcpdB*|L(AC*t;3Q>Z4&mGpMB0cEctGm6#0;Yru~H(x2*i^bJk(yAJE%UlD`ynPm_e_75noF1Gdh|w7J&haXwsmu9?`g#u%X&%&Hs8iMt z=`}dnKR72*KLi}YxliZ~K>MKnr*NVu?FY-d9%*|{V*XvA?SuMXvk4&S?~b7NkDz}! zf_`NL{f80sYoP5pkLABNLY|Z9yH@#QL9;)ypHbgCLhciq^Ws?a$0;M^(?`&)Bj}4p z(5pw#SB#*$M$lJ|p!u1&eK3C8N6z>9Uv2L~IaM+@@zxETzCE{>lURp_tQ&S&ZtJxp z4L4`@7v(xG%MELBJ7V8$#9j6Ycfy%{Q+2g4GHb=h{dkfz)p?qDd@l85^jpbmRWy&L-FPs2m5F_F1S9R3j@7QXpZ4>e1pR= zUVgSxYlWWxQZG%!fZju%aUBs;QiyVNn1mqT+$_iI zrQ3-3N@R!#d+!5Jn~Cx;|ChtL&BR&O+YYq*AZVg~bPD8CO49p?_3(>`@(uvY8?47; z<>%owD~wO-l@s9?A2ptKKISOW(C0WPpN^A=_~JjYLe8jE9aVah}w_5%VMI`3he}0a1UxqQHFj6Pqyq5Lu33DeJQU@01YHSc{2} zM+I*Y@$p~nfD$ZJA5;#NjP zyYS=v@(a5$?p*UzaaoKtwzA5)t>PU_vl0xKVJMAirv({!Sv=?-rqV z3EnBVTX2ZD81WSPLBTzOdx_}J`-FZ>aKGTw#CoNEBJ{I@xd?>|Z#;1vxhgpSS$K*d zM9PIubO!M>ybvdRbZM2z|0N1o%kbkOzay`z0tAy?pj00%UPrzgguY#nuO86u_XK|=cv$f7f*gO;8zp$U z;5mZl3N8>_A$XZ!k6=nrk0;o>P3U_B9~FE~@POb^LH@ZI`f-LJKd&Nvo?xROzd9%X zBEc&JBZB>c{CQdIgsXUM$!p7#HN% z&eXqN@HW9g!EXqDNAM}Zp9}t0@Q;Fj6Fe?hm}l7^FE~lCTJU_q3k6pS1_ZYXepc{d z!6yWt5qw$jups|L59{@T;0%vN&lOxExLUANkbjPb`S`~eh&u#t7ra-HUxHKqnBY$Z zj|#pch*xv8UXftA;MszU1Um#f1rvgw5`0?lMZtrDZwY=V$iHz#zsdxs3f2j>34TH_ zD!4=N4#E2b9~Rs%_`Kk&g0Bm{FPMwlKbBuAc&1>DAm5RvyjAd0!Ct}jg4+Z?CpaYd zklW1w(>K!2!XW1$PTRAh=KPM}jX2 z9u|CCkbee;hZhWx#PPYRxcPY1}a z6+Bn)0>K4>ErKfqR|{St7!q73m=wHPa6oW};4Ol83JwWAAo#f8GlEA2|1RjlCItN+ zD_9{oRd6~H*QoP_ZYEB|w=u#G2tO?JM#1X^?-cyD;PZmN7CcI<#A|6n7h-|T^7vUh z{qhSvU$B{obx)h%6~f;vxLa@^5&54G`Z>WP#A!z&k(v^uubq1 z!G0pviJOGJiHP!U7y3aW;`FHC_l5rg(T`7yh5o0Y2b(1<{}dwZmJ?xbDsdb>1QU85 z5q1{}yB|`snp{Em}f3DzsBJ>xDd?gY3YlZG3LVu&+79#Yo7x^wC^uHwZLqzC* zSMVt!^nW7qUlE~ySm?hHq5pxPyVTOpCxUk>5&Dyat|3DIe8FZS>@N}d#YE`$3cX3> z147>}crOulzA5+}BJ4aS@}Cl6=VhUf5TXB;;QK`A|6Ak*xFMkacq06sOoV=o;Q2)8 zH;Q~25&EAH`YMsH7ka1Q7l^R)6~R43*m*?cPZDA0=R&_qg#IzXzY(GTzQ}W+OZ~A# z_<1@J`sWDN6QO^;$QKiFULtgq2>De)?-U#q{(VA!SMWLEzbN!k!M_qw?!N{3m$hhj zG!cGHBtkY#=sF_w8wHmVq2DI*D~QmK3H>R-n}mOd&|ek&mhc}H`e#JU2fq+{Snxw4 zeJsNXzs3rB1*a3IU_1%kD7Z>6BA681BzTwLLxMjPd`0jrLEd|^+;K$sak|j;f)^4o zZ?_BGMMOQKMCd1lzk`VQ-6nXC;3LEq%#T9|}uVrtl;B>)xg3W?g2yPa7f_i@g`do9+ zzkI>bg5`of!D)i$2Q<07MvkiFF03F@8iH8|9lJWt`_`+V5i`ff-%AMg4YOc5xh?DX2H)1-YfW3 z!G{DN7JO9j3Bex;J|p;|;LC!q3BE4)j^KNO9|^j+e}j7AKkcyMCdj|AND3Z5jbw5 zUMG07Apg=U%e_lb?}veYNa%+J9~FE;@JE8r2)-itdqKTV20O0{{ej>|f`#0tf?V&L z0r>}3NS`fuuHgBC{F5q_uNKt%X`p+A=HE@Be2XCe2ny*t1Oa;Ogxfnk$6;Bc^r8 z-6=xbCVK4z_&it^k8^NR-xmKTJ+`OQKkB`}!sM`%jH}bXZ5Lth0&%5(==$7F*X1<< zX>SHj9u07!!>&AN>QTN*5TK8pMYy*px2bGBP|OMCKDZLk;;?vRxvZaEZV+kOwT}SBc_cf&LJV>hT z^-6u(?i3E$myvebdkOYRz@t5E-DK>23u)S8f8dcj8}~A-fE<+Zd_vIHd+|c0eBjxK zt@mRvn6{61pyxbn*>AzL)0DqUJqN>X>R*HHtjAH*V*otX1Gj6LdK^Om zY1#zPHqE*_!lkCPSf7pBs$VZd?BxFg DqQW{@ From b26765a7f02d871f3102ad8fa1d89cfd9ecadb63 Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 7 Sep 2017 16:56:29 -0500 Subject: [PATCH 05/65] switched back to terminus 10x20 no unicode for now, until hardware rotates 90 Former-commit-id: 5db3d55af3443e9e15ee202156d71a1ec15a4086 --- dump1090/dump1090.REMOVED.git-id | 2 +- dump1090/interactive.c | 15 +++++++++++++-- dump1090/interactive.o | Bin 24392 -> 24264 bytes dump1090/view1090.REMOVED.git-id | 2 +- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/dump1090/dump1090.REMOVED.git-id b/dump1090/dump1090.REMOVED.git-id index 546c373..5a235ef 100644 --- a/dump1090/dump1090.REMOVED.git-id +++ b/dump1090/dump1090.REMOVED.git-id @@ -1 +1 @@ -991767a65daecf769ad18d4cff2b6ccf858da843 \ No newline at end of file +890272146e6936b8596ef44ad393d3987dab8418 \ No newline at end of file diff --git a/dump1090/interactive.c b/dump1090/interactive.c index 84d7e66..257aa42 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -444,7 +444,7 @@ void interactiveShowData(void) { printf ( // original version "Hex Mode Sqwk Flight Alt Spd Hdg Lat Long Sig Msgs Ti%c\n", progress); // pitft version "\x1B[30;47m\e[1mFlight Alt Spd Lat Long \n", progress); - "\x1B[30;47m\e[1mFlight Zm m/s D(km) %lc S",0x25cb); + "\x1B[30;47m\e[1mFlight Zm m/s D(km) H S "); } else { printf ( "Hex Flight Alt V/S GS TT SSR G*456^ Msgs Seen %c\n", progress); @@ -550,7 +550,8 @@ void interactiveShowData(void) { snprintf(strD, 6,"%5.01f", d); - //formatted for terminusBold 10x16 + /* + //formatted for Unifont 8x16, rotated 90 printf("\n\x1B[%d;31m%-8s\x1B[%d;32m%5s \x1B[%d;33m%3s \x1B[%d;34m%6s \x1B[%d;36m%c%c \x1B[%d;37m%lc", count%2, a->flight, count%2, strFl, @@ -558,6 +559,16 @@ void interactiveShowData(void) { count%2, strD, count%2, cLat, cLon, count%2, 0x2581 + (wint_t) (2*signalAverage)); + */ + + //formatted for terminusBold 10x20, no unicode + printf("\n\x1B[%d;31m%-8s\x1B[%d;32m%5s \x1B[%d;33m%3s \x1B[%d;34m%6s \x1B[%d;36m%c%c \x1B[%d;37m%d", + count%2, a->flight, + count%2, strFl, + count%2, strGs, + count%2, strD, + count%2, cLat, cLon, + count%2, signalAverage); count++; } else { numNoDir++; diff --git a/dump1090/interactive.o b/dump1090/interactive.o index 9f80f679860d6ffd556210cc7058b5b3c7a9e637..a8b1bf0c621e849fbcf157d0970284c2d5f3715a 100644 GIT binary patch delta 5188 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 Date: Thu, 7 Sep 2017 17:13:29 -0500 Subject: [PATCH 06/65] testing box drawing Former-commit-id: 344c6412a5f73087026f13be6521486a9493938b --- dump1090/dump1090.REMOVED.git-id | 2 +- dump1090/interactive.c | 14 +++++++++----- dump1090/interactive.o | Bin 24264 -> 24284 bytes dump1090/view1090.REMOVED.git-id | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/dump1090/dump1090.REMOVED.git-id b/dump1090/dump1090.REMOVED.git-id index 5a235ef..5e56695 100644 --- a/dump1090/dump1090.REMOVED.git-id +++ b/dump1090/dump1090.REMOVED.git-id @@ -1 +1 @@ -890272146e6936b8596ef44ad393d3987dab8418 \ No newline at end of file +f949a3ecfc90cfcc5b1b6fedbb8f447476e22b95 \ No newline at end of file diff --git a/dump1090/interactive.c b/dump1090/interactive.c index 257aa42..72e1ac1 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -444,7 +444,7 @@ void interactiveShowData(void) { printf ( // original version "Hex Mode Sqwk Flight Alt Spd Hdg Lat Long Sig Msgs Ti%c\n", progress); // pitft version "\x1B[30;47m\e[1mFlight Alt Spd Lat Long \n", progress); - "\x1B[30;47m\e[1mFlight Zm m/s D(km) H S "); + "\x1B[30;47m\e[1m Flight Zm m/s D(km) H S "); } else { printf ( "Hex Flight Alt V/S GS TT SSR G*456^ Msgs Seen %c\n", progress); @@ -498,7 +498,7 @@ void interactiveShowData(void) { unsigned char * pSig = a->signalLevel; unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] + - pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 9; //up to 4 bars + pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 3; //up to 4 bars if (a->bFlags & MODES_ACFLAGS_AOG) { snprintf(strFl, 6," grnd"); @@ -562,13 +562,17 @@ void interactiveShowData(void) { */ //formatted for terminusBold 10x20, no unicode - printf("\n\x1B[%d;31m%-8s\x1B[%d;32m%5s \x1B[%d;33m%3s \x1B[%d;34m%6s \x1B[%d;36m%c%c \x1B[%d;37m%d", + + if(count==3) { + printf("\n%lc%lc%lc%lc",0x250C,0x2500,0x2500,0x2510); + } + printf("\n \x1B[%d;31m%-8s\x1B[%d;32m%5s \x1B[%d;33m%3s \x1B[%d;34m%6s \x1B[%d;36m%c%c \x1B[%d;37m%d", count%2, a->flight, count%2, strFl, count%2, strGs, count%2, strD, count%2, cLat, cLon, - count%2, signalAverage); + count%2, (int)(signalAverage/255)); count++; } else { numNoDir++; @@ -583,7 +587,7 @@ void interactiveShowData(void) { count++; } - printf("\x1B[30;47m\e[1m\n%+3d %c \x1B[37;40m",numNoDir,progress); + printf("%c%c%c%c\x1B[30;47m\e[1m\n%+3d %c \x1B[37;40m",192,196,191,179,numNoDir,progress); fflush(stdout); } // diff --git a/dump1090/interactive.o b/dump1090/interactive.o index a8b1bf0c621e849fbcf157d0970284c2d5f3715a..65c4b4e14d3706c3ad179fb01eb63a81507e1979 100644 GIT binary patch delta 3348 zcma)9e^6A{6@EXs&)rpcyDKY;u(Bu%EP_h>(P%+f-Axu)A`wv_g0?yfw%Sp%I8AL_ z5+u`=*$niKV{FD$lSzV26G?VD0aFpQB|@AwF|ASCQENIGjXJ3q+e94cci+3~kLI5~ zmiwLWyXT&J-nsYPw|nA<`1d1XXQ}mOrJ!BT2|C`a>{`CqHm2TJ6JRFS2trfW>vOGw zS??&-L2#yYeYx0D%2g*<*V2VziDfNUSpasm(ui1MUC-6WL|xsPLZ6k==q+)E^*0t> zO4dObvC|vMH0qa}mVVx~YogwFo<1X$So{v16&Q4Ero&KMTsjL$I_{>aa*5+gj?Omn z=*HPP57Y|6JlZ19wbT^p%76|+3+E-#>UQ2Q6_zF9oN zd3q4)rT`vT^nAuY40Oy#+Cre?^=8xr2^z!Z%8s{t zpkbG*?fb^K>iWP0&Fdax8{>hkag@ngwDFHxMmyTsBNa)=!rkOg!-V|<=sx@hG=1!e z@$|;f77lnjq5)cE%X6@iPkB~*8a$1jH4VqLK=+=FSf}l*C_3qel)b8JQ`b~;v+o^%g1r~ny$mB&#B1UWW|YHtH}=J%X++#ZNokY#1l?2`O>(@?>#i*qAH{!}aV@oBjl0;E-KZ1ABGDd5q-{A(`&EP|f*Gs!tNRvSjMi{Tt z`m8nT=D&t&UpsMr#Pz+)a83YJQDk@??A$9Rpla9@5zc3aX;NqQ6hHIgB3Yg{!c1$B;g3X zU6C!;(#$}P_%SU*dzo%Q+e7!FJwpcrvyJ{^I8<=$q2EI5rJ0pE;)PgQIOL*NNR1o|8$zUBsU_KpoLo-a zN+%q@HVhM&G$)zlD~57rP$$VuQvB^IhB~v9& zDsjpecN7sK=bk2J`K}No)FRiOzBkqs&)vF2r1q$uAI{*Lx delta 3334 zcmZu!X>e256@K?UUqv#QC&`v=c@;*+@`AAnq-GJaj10yLkYHn(uqH*M8*w^@fwCx$ zF%w}#?cS0=r)10zI)-UGOw^=y3e*m%V{p>4g(1*k++{M5ga(U{LYbm|SMQ3Y=^guh z=lkwC=bpQ~MSnR#hEI^L3bSsJ6l=DpG}JBXes->9M17wBGTk=-UKTVs`a4Q=c+)XIE~waOYk&#a0&`<()fHHhq&N;U5D zNm3cxs7x~@&e0T`sH}+fD{fPfOH+j?)i6VX+f*#nULn`AW~dkDYQA<2q}%KW)PMbt zn#S%y&2(!{e^)e|%@$I(=|Sa_8FJVG>b5%OX=;TSt-3~%c-Un&M!#)((W~_ih~C%O zOdVq8Yw9(zvDNh&cd%~VR72TvNty&|J~c0^$KnmSrAF3U8na(Yk{7uLiJ zj;O{M@pN|dVvt^a>x_unOkG%*h*vEcW@}9;x}Lfa{SRgDn@Z(#lznA-(d_D#Tbp<+ z&m2)#(eJYFn{DGO5Efgf&vUz2kJ+-?8W%iY$MTbnj%aKZ>N;n{Ce?Y^hYXz?_uR1H z2tPhwPsp344Bj;aI~w5O_h7L72=S{vYQh5e)xwT7ENV^<{0b~Ks9$x&=Hgd}1_!!hjb_5n=hmB&I3YEv-M&9UWk3}gPEU~05Q<7Y9wE68@Rf=@MGMg(Ov z!6BjsnuXCk2+#Lol^{h2cSlA0_)-JUKub!EMXVCoJOJ%9G7YOuFrPtuGfmb;J%fjPtSd!?-#t5=gWOoj9zRmBL&VA)5az3J4x_FdyvG&920Y|3Mxw`DQ@2onj$rX zorS4n)=BZSBB*m z#?7*a(l^GPC%P7^Y)QT~ysxBHCQDf2)X8Kd?40`HxU9{|l9b+uV%uR@2_FA@xlse- zK-fAvhmsAfykb3hn)OtKWJeF1?U}UJ(Sm>yrMoXcu+&Kxh#4FNP-0RgK%(OO?L$En-3AA17qlpK+p+mdb>X!UYIf%xQ!C zHYQlO9ejxMW%6#GGFLB2XE<++^-tz&cNUIGE9CSZ_{Ns-6pX#Bbl&eW6u9yhKlP)i zhPSIp%qgd4d>~Ht|L>l4R8)FFVEnv&A^4X9i^UGd4}nKT_B8gi_p%&GX2z;r&NkgK-M@Tp*i zx&qS2oVcE4&A9GoZMY7wBX#&1cu(`+!2SxYg&FD#$d$0O{t#8p9t;qC`9i@~ij!V?2 z{9E!-dWSyMOsRg|Vme;mO{wlpN_6^KD(QpNmRL*8`b~7=q0=-`d9byW8g%c{Ox-SO z_z}%-rUs=gp$ij;ZXKp39q)zUqYh>7wmH<0r?kwW7DPWsbNA8`{cdV;QPVO+-Bso& z-P?T182hlHIw198ztSaX%5H%!U=DaW5L;Sr7y4Tu_%xmJ6JQ>&4TwM2_i(|7?35ay z8GIfv4SY5b=g~DCmrwIDlixP8Xn9Oq=4i)4}&|r59AJ;fcT!C^0MGgAWpmG z9v*vmSy*lWIscQuA%RDMxD%%w6nvk+R)OCU*Z}1D7XxVki6#mmiwofQabNI(27xHn zbri@04g-0AQ1G3CzX0R~-NgOH{jLMK-wDC{1b+j_{k94HC17~}vfq-7-(aC|3+R3+ s&@M15IlRj^L?*_6L>$4XpMX1Nz4+yjjdYy1upcg8O Date: Thu, 7 Sep 2017 20:40:12 -0500 Subject: [PATCH 07/65] added close plane box Former-commit-id: 584925da2eb83039e42c8a76f259d6c4c1d69cc7 --- dump1090/dump1090.REMOVED.git-id | 2 +- dump1090/interactive.c | 26 +++++++++++++++++++------- dump1090/interactive.o | Bin 24284 -> 24892 bytes dump1090/view1090.REMOVED.git-id | 2 +- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/dump1090/dump1090.REMOVED.git-id b/dump1090/dump1090.REMOVED.git-id index 5e56695..349f9ab 100644 --- a/dump1090/dump1090.REMOVED.git-id +++ b/dump1090/dump1090.REMOVED.git-id @@ -1 +1 @@ -f949a3ecfc90cfcc5b1b6fedbb8f447476e22b95 \ No newline at end of file +12cd0ac25a00548b5547e3652a223af0087cb1a6 \ No newline at end of file diff --git a/dump1090/interactive.c b/dump1090/interactive.c index 72e1ac1..c3b4c48 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -496,9 +496,11 @@ void interactiveShowData(void) { char cLat = ' '; char cLon = ' '; + double d; + unsigned char * pSig = a->signalLevel; unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] + - pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 3; //up to 4 bars + pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 3; if (a->bFlags & MODES_ACFLAGS_AOG) { snprintf(strFl, 6," grnd"); @@ -525,7 +527,7 @@ void interactiveShowData(void) { double x = dLon * M_PI / 180.0f * cos(((a->lat+***REMOVED***)/2.0f) * M_PI / 180.0f); double y = dLat * M_PI / 180.0f; - double d = sqrt(x*x + y*y) * 6371.0; + d = sqrt(x*x + y*y) * 6371.0; if(fabs(dLon) < .01 && fabs(dLat) > fabs(dLon)) { cLon = ' '; @@ -563,16 +565,26 @@ void interactiveShowData(void) { //formatted for terminusBold 10x20, no unicode - if(count==3) { - printf("\n%lc%lc%lc%lc",0x250C,0x2500,0x2500,0x2510); + if(d<5) { + printf("%ls",L"\n╔═════════════════════════════╗\n║"); + } else { + printf("\n "); } - printf("\n \x1B[%d;31m%-8s\x1B[%d;32m%5s \x1B[%d;33m%3s \x1B[%d;34m%6s \x1B[%d;36m%c%c \x1B[%d;37m%d", + + printf("\x1B[%d;31m%-8s\x1B[%d;32m%5s \x1B[%d;33m%3s \x1B[%d;34m%6s \x1B[%d;36m%c%c \x1B[%d;37m%d", count%2, a->flight, count%2, strFl, count%2, strGs, count%2, strD, count%2, cLat, cLon, - count%2, (int)(signalAverage/255)); + count%2, (int)((float)signalAverage/25.0f)); + + + if(d<5) { + printf("%ls",L"║\n╚═════════════════════════════╝"); + count+=2; + } + count++; } else { numNoDir++; @@ -587,7 +599,7 @@ void interactiveShowData(void) { count++; } - printf("%c%c%c%c\x1B[30;47m\e[1m\n%+3d %c \x1B[37;40m",192,196,191,179,numNoDir,progress); + printf("\x1B[30;47m\e[1m\n%+3d %c \x1B[37;40m",numNoDir,progress); fflush(stdout); } // diff --git a/dump1090/interactive.o b/dump1090/interactive.o index 65c4b4e14d3706c3ad179fb01eb63a81507e1979..edce3ec41632b7e344aa7ec0cad43d3a5e63bb39 100644 GIT binary patch delta 6799 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 G?LPqtjEW)v delta 6083 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 Date: Thu, 7 Sep 2017 20:49:22 -0500 Subject: [PATCH 08/65] fixed box type for Terminux compatibility Former-commit-id: 7ed2ec5382d6ab092580df3e2925b46aabd6e7a7 --- dump1090/interactive.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dump1090/interactive.c b/dump1090/interactive.c index c3b4c48..2bf1187 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -566,7 +566,7 @@ void interactiveShowData(void) { //formatted for terminusBold 10x20, no unicode if(d<5) { - printf("%ls",L"\n╔═════════════════════════════╗\n║"); + printf("%ls",L"\n┌─────────────────────────────┐\n│"); } else { printf("\n "); } @@ -581,7 +581,7 @@ void interactiveShowData(void) { if(d<5) { - printf("%ls",L"║\n╚═════════════════════════════╝"); + printf("%ls",L"│\n└─────────────────────────────┘"); count+=2; } From b7f556f8af19737b5225c43ac86c8f5322acf8c1 Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 7 Sep 2017 21:14:18 -0500 Subject: [PATCH 09/65] adjusted colors, removed dark Former-commit-id: 7aa775124aad99253440ae93157226df3f53f5fd --- dump1090/dump1090.REMOVED.git-id | 2 +- dump1090/interactive.c | 14 +++++++------- dump1090/interactive.o | Bin 24892 -> 24892 bytes dump1090/view1090.REMOVED.git-id | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dump1090/dump1090.REMOVED.git-id b/dump1090/dump1090.REMOVED.git-id index 349f9ab..0eb8277 100644 --- a/dump1090/dump1090.REMOVED.git-id +++ b/dump1090/dump1090.REMOVED.git-id @@ -1 +1 @@ -12cd0ac25a00548b5547e3652a223af0087cb1a6 \ No newline at end of file +0891e80b8f5fb676a069f14e08657e51799e2b61 \ No newline at end of file diff --git a/dump1090/interactive.c b/dump1090/interactive.c index 2bf1187..0eab51b 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -571,13 +571,13 @@ void interactiveShowData(void) { printf("\n "); } - printf("\x1B[%d;31m%-8s\x1B[%d;32m%5s \x1B[%d;33m%3s \x1B[%d;34m%6s \x1B[%d;36m%c%c \x1B[%d;37m%d", - count%2, a->flight, - count%2, strFl, - count%2, strGs, - count%2, strD, - count%2, cLat, cLon, - count%2, (int)((float)signalAverage/25.0f)); + printf("\x1B[1;31m%-8s\x1B[1;32m%5s \x1B[1;33m%3s \x1B[1;34m%6s \x1B[1;36m%c%c \x1B[1;35m%d", + , a->flight, + , strFl, + , strGs, + , strD, + , cLat, cLon, + , (int)((float)signalAverage/25.0f)); if(d<5) { diff --git a/dump1090/interactive.o b/dump1090/interactive.o index edce3ec41632b7e344aa7ec0cad43d3a5e63bb39..f54aa835ed2d53afd4ed1d7cd6a055a438677de3 100644 GIT binary patch delta 282 zcmdmUh;h#$#tj^j^*pK!3=9K+1%P&PF)-9KFo7%w0uT)pU=X3JW4M7fLM@coEGVVz F4gf0o52OG9 delta 282 zcmdmUh;h#$#tj^j^&zSZ3;_dx!+~~kF)-9K1Ogc#0HT2c3{iA-3^&5}v6}^@wA}&x CDI Date: Thu, 7 Sep 2017 21:23:17 -0500 Subject: [PATCH 10/65] fixed commas Former-commit-id: 723719c6b153d866c5fe58701d4180df153b492b --- dump1090/interactive.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dump1090/interactive.c b/dump1090/interactive.c index 0eab51b..2debdf0 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -572,12 +572,12 @@ void interactiveShowData(void) { } printf("\x1B[1;31m%-8s\x1B[1;32m%5s \x1B[1;33m%3s \x1B[1;34m%6s \x1B[1;36m%c%c \x1B[1;35m%d", - , a->flight, - , strFl, - , strGs, - , strD, - , cLat, cLon, - , (int)((float)signalAverage/25.0f)); + a->flight, + strFl, + strGs, + strD, + cLat, cLon, + (int)((float)signalAverage/25.0f)); if(d<5) { From 6ea639860c5b5308d452ffb4098c579cb5b5e53c Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 7 Sep 2017 23:54:16 -0500 Subject: [PATCH 11/65] format fixes Former-commit-id: b060dd40fe1cefe9154eaf0f5babf89bbfe4befc --- dump1090/dump1090.REMOVED.git-id | 2 +- dump1090/interactive.c | 8 ++++---- dump1090/interactive.o | Bin 24892 -> 24916 bytes dump1090/view1090.REMOVED.git-id | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dump1090/dump1090.REMOVED.git-id b/dump1090/dump1090.REMOVED.git-id index 0eb8277..73be60f 100644 --- a/dump1090/dump1090.REMOVED.git-id +++ b/dump1090/dump1090.REMOVED.git-id @@ -1 +1 @@ -0891e80b8f5fb676a069f14e08657e51799e2b61 \ No newline at end of file +38444892864e17640f6fc1e64fda8df61a994cd0 \ No newline at end of file diff --git a/dump1090/interactive.c b/dump1090/interactive.c index 2debdf0..c3d81ac 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -444,7 +444,7 @@ void interactiveShowData(void) { printf ( // original version "Hex Mode Sqwk Flight Alt Spd Hdg Lat Long Sig Msgs Ti%c\n", progress); // pitft version "\x1B[30;47m\e[1mFlight Alt Spd Lat Long \n", progress); - "\x1B[30;47m\e[1m Flight Zm m/s D(km) H S "); + "\x1B[30;47m\e[1m Flight Alt(m) km/h D(km) H S "); } else { printf ( "Hex Flight Alt V/S GS TT SSR G*456^ Msgs Seen %c\n", progress); @@ -566,12 +566,12 @@ void interactiveShowData(void) { //formatted for terminusBold 10x20, no unicode if(d<5) { - printf("%ls",L"\n┌─────────────────────────────┐\n│"); + printf("%ls",L"\n\x1B[1;37m┌───────────────────────────────┐\n│"); } else { printf("\n "); } - printf("\x1B[1;31m%-8s\x1B[1;32m%5s \x1B[1;33m%3s \x1B[1;34m%6s \x1B[1;36m%c%c \x1B[1;35m%d", + printf("\x1B[1;31m%-8s\x1B[1;32m%5s \x1B[1;33m%4s \x1B[1;34m%6s \x1B[1;36m%c%c \x1B[1;35m%d", a->flight, strFl, strGs, @@ -581,7 +581,7 @@ void interactiveShowData(void) { if(d<5) { - printf("%ls",L"│\n└─────────────────────────────┘"); + printf("%ls",L"\x1B[1;37m│\n└───────────────────────────────┘"); count+=2; } diff --git a/dump1090/interactive.o b/dump1090/interactive.o index f54aa835ed2d53afd4ed1d7cd6a055a438677de3..6aa1541ed9f1781fea7c5be60b6ee8c726a5ab5b 100644 GIT binary patch delta 2286 zcmai0eN0nV6o2=%uTn%_Ujf_4hZLoJ2|__E%t5KPT3ib?qT*COM$$Q1rwd}HnSsg3 ztgHw*%eEK|vL%Z%8ZixvPByDE8>m^_<{xug7B{y<$7Tfl+=tzH@7?NRV)l~ze&_to z@1Aq+eJ}UDku&7d8PZoJq6nd8dcCaaMo6JetCn!`W4UHHXhJ^`D3b2`QEPR3}uiDdd)Qe47BG)8+b>MS%U>Mf( zR{frOq+PGw{}X9`=QzhO(99QW12SLTGXOvF%NuI&wc$TaC9Yt_QZy}LIg2Y;YL`4E zr@iacd`!h`F`}woRt0_x?Ds|@N_;#~aWES9-y9V$L7&c;KO*(TzrGt&I4!??(Orl0 zB+4DQSv}WTRNb;CRcf?+ln*Y0OS-JsIp}s>nay`6gIZ`OLD(*2Yum8@Ne7=l3e7?y zcfcLws^K%CkfgzsP)piju|Au;2d#P&*#mFta~CzDUS5m+PWM5qM%s-LxwN}yxE?#W zz7$_DAD`~Pu7a=5QrS;OR6aYe>wXu-KE9sw!Cg!?4U7rJS>Izvaxx#Evwt(rp5%4h zC-_9sAD!gaT$cP{*qo529Y7WtZUEj+Fqb#WUc(Fp*Mu=LHp$nI@~hEYep(VX$P&TX ziMf8m@w1PwE7%6N60Ago{KTq`Fbd@2Qju@uuID*Bw;C*A-0(vf#HS_gr>q%|m+5z+ zbE<>wYDeH6)|+zidEqI(feT}bDLy|ONX-m5GGk=@Mmf#OAy?3YTkGs|1}35n!W;kzYo-x%S9ed)MFE4xOjx$Pl*X>HdT74*V5~$ZW>RSmYeJSAD*D zeEREB@60KQl1oO;w@>22Qn837+%sGUdy|UD@zD9C>8!#2;+7nLuBp{uxWQy{Zc*$~IA&aJ zPQez|;;`UYh@%9DmDxnE&4SYdpOyvr;|mBgjuN1jxrKc*Sl+{QeefM8uD0MGK;c{#wK&^y?7Q(6=MvnVGZzF$4W6d=xmp zxZ)ZblHe*LE-dW_L`ir75l@Dsvotft!0zz2x4FCWD delta 2306 zcma)8e{2(V6u-On$~wlb*ZpeOjUC&%Uvz98jBUED>ujOJc0aj4wjs{I zrenfocG>bGK@5U1m=QrSjd22w4h;-V1PuHEQJ4nI2BQ0cIzg!K?!IM4qw$jV^FE*V zzVE&7`(Ezu@)`Qn8M>#8pHWT8moP)Y8ND?&-lUrr)o5n)zFoizM06=Ws;qa^#y5r{ ziP!^0w2ki}Y8X+EgGk%-`-qxPD{_Av>|jjr3!M^kkyoS);uZKTZd)usHaWlD6a0@S;3L~Vn8>Ov4$gZ?Yx zWu$T9_0wWl!j|eUIusgOH1;&?XG@J!L@pyG3~q{2VWa`Z*#f?Bk+LX2ytPoIu^Fcp zD=J6EVW?90bI_~F(Kgmmlo^G9|GeheFnR>6T$C|iitu#3UyV&!gCi2F5I=W|hhZ&O zpzp3l+4b`8_fh6vF=;3Y)^mAUQPwNE-h%JAn);o1+i(L3w98lW0-DxPV*Dta?KrBA27hAn!59)Q>MndRLWFYm?vYiA!;qgxC?xwO0Ma4mK) z+JZNjmrHVBSH4XND*NCcDzBZ>b?(DpFIUU%h2JpQLNG+-rGryiuVsonC@_Bk( zqB~WG#-TQs7?FxsS2SVSCm`<%z^;`rkZH^_69IyA~rg@5bN-f@m` zcgY=-qp%0h**k*THl3&I*m2y5r}Hk?x#mGID61JMC&N*6WIpiXHIGZ$C2f{EEs1i` z;Fm2EI0*qZ#1zsa{x@T0GO?>01iTt@ngqd-v85qXa0$Xv0X~iEC^v6pFoxo(kew3=trinJpA`llWQEgp{u5a&jW=sxZa-~-uB-%j-Lk%DfUHze z+uGZdl+*v;5N8^vXf(C%7BPQ>OWE;lKl~$L?euEJ`X3=NBT)7gJg&UFiI_Vd zOG~vOyItx=3&eBKe=qwZhB4{<@8w4D^nkzLzJ&=7kX}*Fb|ldH(3~tp$9Y+q*!VH6 z()Yi(KmJem6Zc876w*p)OT~oS2);zHonSAA#pC?Ri)L&5#cs89PIgZm9e`CH8{G$Q zc+%;181$qwhLdpHlSVfJUzv_i<)X@TEp-YX5O|G(z0$-+;6r{0MD&iqhm|?nX99|M z07hkvuS%z9`irU_YLeL5*VtrDn4ZnhRI$aHqipgkY>YbRK!b&=r1{e7=?U4BEC>d0MUrN3o!=y zF2qFSTM_Zm7vn{ogM1DmuForpB>_AlZZI(%Q3||23*Y;Q6NplRn~0Kr%s;;JpxS Date: Thu, 7 Sep 2017 23:58:43 -0500 Subject: [PATCH 12/65] format fixes Former-commit-id: 741bba68434141272870c622dccdb0538838ba09 --- dump1090/dump1090.REMOVED.git-id | 2 +- dump1090/interactive.c | 6 +++--- dump1090/interactive.o | Bin 24916 -> 24900 bytes dump1090/view1090.REMOVED.git-id | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dump1090/dump1090.REMOVED.git-id b/dump1090/dump1090.REMOVED.git-id index 73be60f..3992489 100644 --- a/dump1090/dump1090.REMOVED.git-id +++ b/dump1090/dump1090.REMOVED.git-id @@ -1 +1 @@ -38444892864e17640f6fc1e64fda8df61a994cd0 \ No newline at end of file +45ff8ab75fc61797727c3eed611990930e907a26 \ No newline at end of file diff --git a/dump1090/interactive.c b/dump1090/interactive.c index c3d81ac..0e6521c 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -492,7 +492,7 @@ void interactiveShowData(void) { char strLat[8] = " "; char strLon[9] = " "; - char strD[6] = " "; + char strD[5] = " "; char cLat = ' '; char cLon = ' '; @@ -550,7 +550,7 @@ void interactiveShowData(void) { } } - snprintf(strD, 6,"%5.01f", d); + snprintf(strD, 5,"%4.01f", d); /* //formatted for Unifont 8x16, rotated 90 @@ -571,7 +571,7 @@ void interactiveShowData(void) { printf("\n "); } - printf("\x1B[1;31m%-8s\x1B[1;32m%5s \x1B[1;33m%4s \x1B[1;34m%6s \x1B[1;36m%c%c \x1B[1;35m%d", + printf("\x1B[1;31m%-8s\x1B[1;32m%5s \x1B[1;33m%4s \x1B[1;34m%5s \x1B[1;36m%c%c \x1B[1;35m%d", a->flight, strFl, strGs, diff --git a/dump1090/interactive.o b/dump1090/interactive.o index 6aa1541ed9f1781fea7c5be60b6ee8c726a5ab5b..deaa4c538ebe993d7e306b55debfb9f1e129717d 100644 GIT binary patch delta 770 zcmZ9KO=uHA6vyZ7X4Axwrn4rJ7}Pyz6Qw0-wUmNpqc&+M`RbvdkTz8$_yHwq5B8?u z#e>-Jq$CFgQ8Y@?mH}zhQVpUO1c`Xi9;DtxQEc&|2XW#|FAnVc@BjDSn;CZByE;6t z!&H>IvgF?~T7k{~G8Ks;2%Yy5qTs64j|s(~wvB>LIfMprQZZ?H zt8fQwvImzGQ(tZuZbA|IyAwC75nph<_|E_iY7x59FYNjj1S^{9 zv&96B%Hx7bLR5|nT-ADMA}+E|W%fAsS$R)F&=&b+f*Ik9Sh9xf=W>MX;NTTovc?_i zi`Z3k>j_t^s!Zh9Ty3%QYpzl47M{`#XGtUEbF=sBu0nxL>vgbkLb~48G&bf206#nG zd85D{?DqC3J!kQxH`8V`8;FR_7kuqC@TYf%Red-04MXxDo^fEf!_SHx^-bVpyAL|; zY;Q6LP{v9s07ZP33MjV6_$Ad2V@T5hc#nNN{=g$V&f_H>S8y&Jf-HXGahB0cw-p%n z4-Z0!T^a6D={P@1C#3TPSAK0zf;A2;s{3c;tQGi#v|0(t@tWp(!k?yJpT*14Uzhb; qWc?j%tc+}fdsyRf5AJTWn^{{?{(<~6$v;tfS2`WT{SgrsIOhz-k(KGC^2yPY zgCONsLD0h%5t{@x?voMthe#KZ89hV~(PIz@N)PqcndkV@f#2_YzMu0u_i*m{y3>UK4Ay1=x&0V~B0$4DKsAsf@XO-xttrr4(BFEAJ8$8X`1s41W^ z${{(9W|O7}oMt&bftM*=^sw5KOvro8QTp*ex{ZHLn!3xWU}D9p5B*Yy^1F-K{ZH8N zv7|ZdUPe9qxb|K`M2eblM`}|d-E4J*uinA4GTq~2w1oee_7L+)T#y^hbAyDOqTs7h zkh?9?*t+)tK~?oxJF|iw-L)R{CU>nv(o;;RF3Ww1ke|ifziN#~>Kc^FbngDVBpbsv z0H`uXDmDdZ!Df4l*gEaPggsPzEEf%y*aSE1uCjA<-a_LVjRTl*%;JQjR@$S+g5$Yr z?&t5T8=lkO4}-&Sc9xlqrrrp^9Hs&_FpT*?jqv9+ehXAX7$H~#8(2s45A35ki!(HT z!c4FcJh(-3+JI2A44Zgnzz_At?0{QTCg~|EA@x_O(%V(|jn&Aqc<~i)!70 zw5B*FX%zi_i{`k`@cN^?ei2s(*CCCms1x2{j^>A0h%UoDObxxPoQNf^>!VZgD|+JA ZX#e<)+g))z-Y~6C^ Date: Tue, 5 Sep 2017 00:18:48 +0000 Subject: [PATCH 13/65] removed trailing header block Former-commit-id: cd32fe5ab4e5541693bce94946fd70d1f2ab05eb --- dump1090/anet.o | Bin 17960 -> 21540 bytes dump1090/dump1090.REMOVED.git-id | 2 +- dump1090/dump1090.o | Bin 37100 -> 0 bytes dump1090/dump1090.o.REMOVED.git-id | 1 + dump1090/interactive.c | 2 +- dump1090/interactive.o | Bin 24900 -> 29048 bytes dump1090/mode_ac.o | Bin 14044 -> 29920 bytes dump1090/mode_s.o.REMOVED.git-id | 2 +- dump1090/net_io.o | Bin 40816 -> 44176 bytes dump1090/view1090.REMOVED.git-id | 2 +- dump1090/view1090.o | Bin 19276 -> 28860 bytes 11 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 dump1090/dump1090.o create mode 100644 dump1090/dump1090.o.REMOVED.git-id diff --git a/dump1090/anet.o b/dump1090/anet.o index 78e8fd76107e659002a738be646d7f642ec72bdb..4b4f362365cfbf819b8d2e3e4de596ddb7d728cb 100644 GIT binary patch literal 21540 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

*vZQ?cBT{Iw~7cmwZdN} zbd%7R2pu9~{H_#wI}!D76ug57`(F|Ih~Uoze@jICuL*5U0?mFQf{zzvH9bw}bA>J; z!cVL4*9qM(@+*aZjnKnF-zfBFiKzde@V_VYb0R+>_`1m77W!{O^Q~gW=_Ml0sY1^n z!tNsBHwb;H$a@91iTo;|cL{yH&^HNvtI%I0!tO)De?sWriToAe|4Hb#g+3$nq{${; zKM~_KkBGQyg};ml`;8*+5dLL?5y5SOgGA^b5IijSEy3>z{+x*M|BcXp5Z zMChF(bd_L};N^lbBJ{2n`X(aUahuTh6EQB|6a1OrFNn~4S?KqK_Tk2k?IX^zUTEr<2{s6Z1#c2e2|gtFqTt^JXW~Ykam*L& z5WG?lmto~P+dL~^JNVKp5!IFJeC(%)pqqtWDRi&U{X&ljy;tb_g?>=zXN7)VXnns8 z`|k?P{U!bB`)c^B7rI&E;d2qn`Fn82vqk8L(8EHH2%Qr89-*HU`YEBgAEmw1LUTV# zn!kaj{r~BK6i_gs_erc%i!<}BBix4R15-dh-K#gGDrtZo{7eVU`qaavUY#ej8^~i9 znHdLld6eO#=%48Ypu;*fIC;=sp=|^-{gP}F1n6Tw?gREAN9@C{QU?Y^s$K;BsK{$7 z+mVgaZpT`b?K)H~Mo019+CFUA2#|3!)pH# z*M>l_#Oe5OtKr0V4a#;M6xBl5W6s)#ExQ>EyG+@u&^zlx+HnJ9nSM9JFUN=df=i|2 z_X{Y~9>;};g~FA%7qt({c-|vu>kTea$`77>*m_?BgJt{p7wBakw(JLB+GWabf!^Yb zJmT6QIYMy66mz!X_V0oaezLax)8q#u?e8<3(L8aqZGdfJwAiA4_l9z j5srH4BJ-o-8Q{;u$@qLY8Cyp8t9~Tpw`?Pj*~R|@We4&V literal 17960 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 SaAeK5bw~BGt03Rw`Tqet(C&-? diff --git a/dump1090/dump1090.o.REMOVED.git-id b/dump1090/dump1090.o.REMOVED.git-id new file mode 100644 index 0000000..5ae2ce4 --- /dev/null +++ b/dump1090/dump1090.o.REMOVED.git-id @@ -0,0 +1 @@ +ddb13620fcd71864b26415e0f2a4431a0ef1b6f2 \ No newline at end of file diff --git a/dump1090/interactive.c b/dump1090/interactive.c index 0e6521c..9bc1e65 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -444,7 +444,7 @@ void interactiveShowData(void) { printf ( // original version "Hex Mode Sqwk Flight Alt Spd Hdg Lat Long Sig Msgs Ti%c\n", progress); // pitft version "\x1B[30;47m\e[1mFlight Alt Spd Lat Long \n", progress); - "\x1B[30;47m\e[1m Flight Alt(m) km/h D(km) H S "); + "\x1B[30;47m\e[1m Flight Alt(m) km/h D(km) H S "); } else { printf ( "Hex Flight Alt V/S GS TT SSR G*456^ Msgs Seen %c\n", progress); diff --git a/dump1090/interactive.o b/dump1090/interactive.o index deaa4c538ebe993d7e306b55debfb9f1e129717d..6f432f267db9b644fa4bf2f60b67bf2277462501 100644 GIT binary patch literal 29048 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 literal 24900 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 N^=%E*@?YIB_P;7Fkk|kK diff --git a/dump1090/mode_s.o.REMOVED.git-id b/dump1090/mode_s.o.REMOVED.git-id index d8d6079..2617aaa 100644 --- a/dump1090/mode_s.o.REMOVED.git-id +++ b/dump1090/mode_s.o.REMOVED.git-id @@ -1 +1 @@ -bdd60b55bc0624ff84544a794ae21d71eaf0adc8 \ No newline at end of file +c5cca26f61b7bebfa4164ea741dd693aa78bf76c \ No newline at end of file diff --git a/dump1090/net_io.o b/dump1090/net_io.o index 92db651b18a0a541bc6f2cf06ece0028e86706dd..4b887a04e0ff4c4babd43033921258f3624a50f0 100644 GIT binary patch literal 44176 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 literal 40816 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

*vZQ?cBT{Iw~7cmwZdN} zbd%7R2pu9~{H_#wI}!D76ug57`(F|Ih~Uoze@jICuL*5U0?mFQf{zzvH9bw}bA>J; z!cVL4*9qM(@+*aZjnKnF-zfBFiKzde@V_VYb0R+>_`1m77W!{O^Q~gW=_Ml0sY1^n z!tNsBHwb;H$a@91iTo;|cL{yH&^HNvtI%I0!tO)De?sWriToAe|4Hb#g+3$nq{${; zKM~_KkBGQyg};ml`;8*+5dLL?5y5SOgGA^b5IijSEy3>z{+x*M|BcXp5Z zMChF(bd_L};N^lbBJ{2n`X(aUahuTh6EQB|6a1OrFNn~4S?KqK_Tk2k?IX^zUTEr<2{s6Z1#c2e2|gtFqTt^JXW~Ykam*L& z5WG?lmto~P+dL~^JNVKp5!IFJeC(%)pqqtWDRi&U{X&ljy;tb_g?>=zXN7)VXnns8 z`|k?P{U!bB`)c^B7rI&E;d2qn`Fn82vqk8L(8EHH2%Qr89-*HU`YEBgAEmw1LUTV# zn!kaj{r~BK6i_gs_erc%i!<}BBix4R15-dh-K#gGDrtZo{7eVU`qaavUY#ej8^~i9 znHdLld6eO#=%48Ypu;*fIC;=sp=|^-{gP}F1n6Tw?gREAN9@C{QU?Y^s$K;BsK{$7 z+mVgaZpT`b?K)H~Mo019+CFUA2#|3!)pH# z*M>l_#Oe5OtKr0V4a#;M6xBl5W6s)#ExQ>EyG+@u&^zlx+HnJ9nSM9JFUN=df=i|2 z_X{Y~9>;};g~FA%7qt({c-|vu>kTea$`77>*m_?BgJt{p7wBakw(JLB+GWabf!^Yb zJmT6QIYMy66mz!X_V0oaezLax)8q#u?e8<3(L8aqZGdfJwAiA4_l9z j5srH4BJ-o-8Q{;u$@qLY8Cyp8t9~Tpw`?Pj*~R|@We4&V diff --git a/dump1090/dump1090.REMOVED.git-id b/dump1090/dump1090.REMOVED.git-id index 8a50246..bcf1952 100644 --- a/dump1090/dump1090.REMOVED.git-id +++ b/dump1090/dump1090.REMOVED.git-id @@ -1 +1 @@ -6f6bc86677ae1f1852853f24130b9039e026b7bc \ No newline at end of file +6e78e92e9261a1c1a12064288f64a1786a246ec6 \ No newline at end of file diff --git a/dump1090/dump1090.o b/dump1090/dump1090.o new file mode 100644 index 0000000000000000000000000000000000000000..d4608b9696f38fcb7f05f1271830b0f344972cc3 GIT binary patch literal 37100 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 SaAeK5bw~BGt03Rw`Tqet(C&-? literal 0 HcmV?d00001 diff --git a/dump1090/dump1090.o.REMOVED.git-id b/dump1090/dump1090.o.REMOVED.git-id deleted file mode 100644 index 5ae2ce4..0000000 --- a/dump1090/dump1090.o.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -ddb13620fcd71864b26415e0f2a4431a0ef1b6f2 \ No newline at end of file diff --git a/dump1090/interactive.c b/dump1090/interactive.c index 9bc1e65..2a7db58 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -453,7 +453,8 @@ void interactiveShowData(void) { //"---------------------------------------"); printf("\x1B[37;40m"); int numNoDir = 0; - while(a && (count < 10)) { + // while(a && (count < 10)) { + while(a && (count < Modes.interactive_rows)) { if ((now - a->seen) < Modes.interactive_display_ttl) { int msgs = a->messages; @@ -566,22 +567,31 @@ void interactiveShowData(void) { //formatted for terminusBold 10x20, no unicode if(d<5) { - printf("%ls",L"\n\x1B[1;37m┌───────────────────────────────┐\n│"); + printf("%ls",L"\n\x1B[1;37m┌──────────────────────────────┐\n│"); } else { printf("\n "); } - printf("\x1B[1;31m%-8s\x1B[1;32m%5s \x1B[1;33m%4s \x1B[1;34m%5s \x1B[1;36m%c%c \x1B[1;35m%d", - a->flight, - strFl, - strGs, - strD, - cLat, cLon, - (int)((float)signalAverage/25.0f)); - + if ((now - a->seen) > 30 ) { + printf("\x1B[1;30m%-8s%5s %4s %5s %c%c %d", + a->flight, + strFl, + strGs, + strD, + cLat, cLon, + (int)((float)signalAverage/25.0f)); + } else { + printf("\x1B[1;31m%-8s\x1B[1;32m%5s \x1B[1;33m%4s \x1B[1;34m%5s \x1B[1;36m%c%c \x1B[1;35m%d", + a->flight, + strFl, + strGs, + strD, + cLat, cLon, + (int)((float)signalAverage/25.0f)); + } if(d<5) { - printf("%ls",L"\x1B[1;37m│\n└───────────────────────────────┘"); + printf("%ls",L"\x1B[1;37m│\n└──────────────────────────────┘"); count+=2; } diff --git a/dump1090/interactive.o b/dump1090/interactive.o index 6f432f267db9b644fa4bf2f60b67bf2277462501..3eb74d5faf5bcfcfb6ae5ec93524b48ebc41b38d 100644 GIT binary patch literal 25084 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

-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 U?OHKfidr$haB3_z2|e(C0b7I6)&Kwi literal 29048 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 diff --git a/dump1090/mode_ac.o b/dump1090/mode_ac.o index b88d523fbe71a1c3c9197dbf219b62ffb83b1521..b5745f4adb45ceea8bda12779e2a3c708cb667a1 100644 GIT binary patch literal 14044 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 N^=%E*@?YIB_P;7Fkk|kK literal 29920 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

sd8o@(3inYDA80g!c-6<;vxpF^)5; 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 WZt)XvWW$$LI_JXTk_qFeYyBT;gTVO! literal 44176 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 diff --git a/dump1090/view1090.REMOVED.git-id b/dump1090/view1090.REMOVED.git-id index a41cd58..477777b 100644 --- a/dump1090/view1090.REMOVED.git-id +++ b/dump1090/view1090.REMOVED.git-id @@ -1 +1 @@ -a747e61e42f6d5e47b99924389b8df5fa0c11786 \ No newline at end of file +f8df326f25fd1b7dcebda663d33f6c93ea268776 \ No newline at end of file diff --git a/dump1090/view1090.o b/dump1090/view1090.o index ed822246aeb6c45a50e0cb0e3f5a4a3bb1ab7e8f..a9231fc001b09429d43ac3e03493b9f8bdb459f1 100644 GIT binary patch literal 19276 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 F{|BT8g&Y6? literal 28860 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 Date: Mon, 11 Sep 2017 17:48:38 -0500 Subject: [PATCH 16/65] finished merging Former-commit-id: a6b0822840034687ea37ab6088a55b149a47cff3 --- dump1090/interactive.c | 11 ----------- dump1090/interactive.o | Bin 25084 -> 25076 bytes dump1090/view1090.REMOVED.git-id | 2 +- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/dump1090/interactive.c b/dump1090/interactive.c index 2872080..2a7db58 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -572,7 +572,6 @@ void interactiveShowData(void) { printf("\n "); } -<<<<<<< HEAD if ((now - a->seen) > 30 ) { printf("\x1B[1;30m%-8s%5s %4s %5s %c%c %d", a->flight, @@ -590,16 +589,6 @@ void interactiveShowData(void) { cLat, cLon, (int)((float)signalAverage/25.0f)); } -======= - printf("\x1B[1;31m%-8s\x1B[1;32m%5s \x1B[1;33m%4s \x1B[1;34m%5s \x1B[1;36m%c%c \x1B[1;35m%d", - a->flight, - strFl, - strGs, - strD, - cLat, cLon, - (int)((float)signalAverage/25.0f)); - ->>>>>>> 474b6b928fbf41ebad522ee55fae952c481aabf5 if(d<5) { printf("%ls",L"\x1B[1;37m│\n└──────────────────────────────┘"); diff --git a/dump1090/interactive.o b/dump1090/interactive.o index 3eb74d5faf5bcfcfb6ae5ec93524b48ebc41b38d..6fdd68c0f5806eb4667edccec9007c68f5283c42 100644 GIT binary patch delta 493 zcmex!nDNVD#t9CB+XEQDK!F`XZ=V?G&v;|wLVZTYfXNpb{TVYRD>AtYHV8wcCvZdP z1(Pe8>;(nnA-r%72yHO=Bv3S69l|SNg3#@gC7JCdZ)-w${vr_iw*iDsm|VzgE~sS( z;RP^4Xs^jTne7Fu>>)g;Aj7Q5oGkW&)lktDP~q8=BY~pIju5pf5Q@Qh@=BnnJDO( z6Vv3)5-pQ0BsWZcBe`Mo0;vXLMvlpfe(H=5CVK+OiphmQ^1|eqK+vB<@T{d89NKEKsGv51 zh&d6XmI2}-R&~qVx2P$}&d_66Wkas zvdo?7zc(D=iOb?8W#j6#`aEO09Bkp6E7IGZp)+;0%hDKi$9O48+OIyQE~t;7?GAay zvy2T(k$0NzR1aLB*Lwv~=id9S;jOQL5njPOH}I9;{Lncb$WH=8o(@6_6EZh&UFHMY jGUHg4xs1;;1LzS!NMcxo;0{-1?mD)(?uI8Pk#&r3S)E{| diff --git a/dump1090/view1090.REMOVED.git-id b/dump1090/view1090.REMOVED.git-id index 477777b..cd5a2a1 100644 --- a/dump1090/view1090.REMOVED.git-id +++ b/dump1090/view1090.REMOVED.git-id @@ -1 +1 @@ -f8df326f25fd1b7dcebda663d33f6c93ea268776 \ No newline at end of file +18958032218e1a8e0ef5b79733e5e4b9dd540f61 \ No newline at end of file From d450dc59cee1061934f65a1a7728c142b7a493db Mon Sep 17 00:00:00 2001 From: Nathan Date: Wed, 13 Sep 2017 22:21:36 -0500 Subject: [PATCH 17/65] initial SDL version Former-commit-id: 3714e6bfc11cd1ccb095602b2f93d64b4d107346 Former-commit-id: cfe3cc42c26367d1875c31c581ef1dbf4e2d89e5 --- sdl1090/.gitignore | 2 + sdl1090/Arial.ttf.REMOVED.git-id | 1 + sdl1090/Makefile | 27 + sdl1090/README.md | 284 ++++ sdl1090/TODO | 5 + sdl1090/anet.c | 345 +++++ sdl1090/anet.h | 59 + sdl1090/coaa.h | 6 + sdl1090/defs.h | 8 + sdl1090/draw.c | 112 ++ sdl1090/draw.h | 3 + sdl1090/dump1090.c | 904 ++++++++++++ sdl1090/dump1090.h | 466 +++++++ sdl1090/font.c | 59 + sdl1090/font.h | 3 + sdl1090/init.c | 56 + sdl1090/init.h | 3 + sdl1090/input.c | 32 + sdl1090/input.h | 1 + sdl1090/interactive.c | 596 ++++++++ sdl1090/mode_ac.c | 386 ++++++ sdl1090/mode_s.c.REMOVED.git-id | 1 + sdl1090/net_io.c | 1006 ++++++++++++++ sdl1090/parula.h | 130 ++ sdl1090/pthreads/pthread.h | 1368 +++++++++++++++++++ sdl1090/pthreads/sched.h | 183 +++ sdl1090/pthreads/semaphore.h | 169 +++ sdl1090/public_html/config.js | 34 + sdl1090/public_html/coolclock/coolclock.js | 318 +++++ sdl1090/public_html/coolclock/excanvas.js | 785 +++++++++++ sdl1090/public_html/coolclock/moreskins.js | 212 +++ sdl1090/public_html/extension.js | 19 + sdl1090/public_html/gmap.html | 65 + sdl1090/public_html/options.js | 17 + sdl1090/public_html/planeObject.js | 260 ++++ sdl1090/public_html/script.js | 658 +++++++++ sdl1090/public_html/style.css | 32 + sdl1090/rtlsdr/rtl-sdr.h | 366 +++++ sdl1090/rtlsdr/rtl-sdr_export.h | 47 + sdl1090/structs.h | 8 + sdl1090/testfiles/modes1.bin.REMOVED.git-id | 1 + sdl1090/tools/debug.html | 193 +++ sdl1090/unifont.ttf.REMOVED.git-id | 1 + sdl1090/view1090.REMOVED.git-id | 1 + sdl1090/view1090.c | 405 ++++++ sdl1090/view1090.dsp | 149 ++ sdl1090/view1090.h | 84 ++ sdl1090/winstubs.h | 111 ++ 48 files changed, 9981 insertions(+) create mode 100644 sdl1090/.gitignore create mode 100644 sdl1090/Arial.ttf.REMOVED.git-id create mode 100644 sdl1090/Makefile create mode 100644 sdl1090/README.md create mode 100644 sdl1090/TODO create mode 100644 sdl1090/anet.c create mode 100644 sdl1090/anet.h create mode 100644 sdl1090/coaa.h create mode 100644 sdl1090/defs.h create mode 100644 sdl1090/draw.c create mode 100644 sdl1090/draw.h create mode 100644 sdl1090/dump1090.c create mode 100644 sdl1090/dump1090.h create mode 100755 sdl1090/font.c create mode 100755 sdl1090/font.h create mode 100644 sdl1090/init.c create mode 100644 sdl1090/init.h create mode 100644 sdl1090/input.c create mode 100644 sdl1090/input.h create mode 100644 sdl1090/interactive.c create mode 100644 sdl1090/mode_ac.c create mode 100644 sdl1090/mode_s.c.REMOVED.git-id create mode 100644 sdl1090/net_io.c create mode 100644 sdl1090/parula.h create mode 100644 sdl1090/pthreads/pthread.h create mode 100644 sdl1090/pthreads/sched.h create mode 100644 sdl1090/pthreads/semaphore.h create mode 100644 sdl1090/public_html/config.js create mode 100644 sdl1090/public_html/coolclock/coolclock.js create mode 100644 sdl1090/public_html/coolclock/excanvas.js create mode 100644 sdl1090/public_html/coolclock/moreskins.js create mode 100644 sdl1090/public_html/extension.js create mode 100644 sdl1090/public_html/gmap.html create mode 100644 sdl1090/public_html/options.js create mode 100644 sdl1090/public_html/planeObject.js create mode 100644 sdl1090/public_html/script.js create mode 100644 sdl1090/public_html/style.css create mode 100644 sdl1090/rtlsdr/rtl-sdr.h create mode 100644 sdl1090/rtlsdr/rtl-sdr_export.h create mode 100644 sdl1090/structs.h create mode 100644 sdl1090/testfiles/modes1.bin.REMOVED.git-id create mode 100644 sdl1090/tools/debug.html create mode 100644 sdl1090/unifont.ttf.REMOVED.git-id create mode 100644 sdl1090/view1090.REMOVED.git-id create mode 100644 sdl1090/view1090.c create mode 100644 sdl1090/view1090.dsp create mode 100644 sdl1090/view1090.h create mode 100644 sdl1090/winstubs.h diff --git a/sdl1090/.gitignore b/sdl1090/.gitignore new file mode 100644 index 0000000..b04dcba --- /dev/null +++ b/sdl1090/.gitignore @@ -0,0 +1,2 @@ +*.o +dump1090 diff --git a/sdl1090/Arial.ttf.REMOVED.git-id b/sdl1090/Arial.ttf.REMOVED.git-id new file mode 100644 index 0000000..98f1e60 --- /dev/null +++ b/sdl1090/Arial.ttf.REMOVED.git-id @@ -0,0 +1 @@ +ab68fb197d4479b3b6dec6e85bd5cbaf433a87c5 \ No newline at end of file diff --git a/sdl1090/Makefile b/sdl1090/Makefile new file mode 100644 index 0000000..4da4694 --- /dev/null +++ b/sdl1090/Makefile @@ -0,0 +1,27 @@ +# +# When building a package or installing otherwise in the system, make +# sure that the variable PREFIX is defined, e.g. make PREFIX=/usr/local +# +PROGNAME=dump1090 + +ifdef PREFIX +BINDIR=$(PREFIX)/bin +SHAREDIR=$(PREFIX)/share/$(PROGNAME) +EXTRACFLAGS=-DHTMLPATH=\"$(SHAREDIR)\" +endif + +CFLAGS=-O2 -g -Wall -W `pkg-config --cflags librtlsdr` +LIBS=`pkg-config --libs librtlsdr` -lpthread -lm `sdl2-config --libs` -lSDL2 -lSDL2_ttf +CC=gcc + + +all: view1090 + +%.o: %.c + $(CC) $(CFLAGS) $(EXTRACFLAGS) -c $< + +view1090: view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o input.o draw.o font.o init.o + $(CC) -g -o view1090 view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o input.o draw.o font.o init.o $(LIBS) $(LDFLAGS) + +clean: + rm -f *.o view1090 diff --git a/sdl1090/README.md b/sdl1090/README.md new file mode 100644 index 0000000..3fdd396 --- /dev/null +++ b/sdl1090/README.md @@ -0,0 +1,284 @@ +Dump1090 README +=== + +Dump 1090 is a Mode S decoder specifically designed for RTLSDR devices. + +The main features are: + +* Robust decoding of weak messages, with mode1090 many users observed + improved range compared to other popular decoders. +* Network support: TCP30003 stream (MSG5...), Raw packets, HTTP. +* Embedded HTTP server that displays the currently detected aircrafts on + Google Map. +* Single bit errors correction using the 24 bit CRC. +* Ability to decode DF11, DF17 messages. +* Ability to decode DF formats like DF0, DF4, DF5, DF16, DF20 and DF21 + where the checksum is xored with the ICAO address by brute forcing the + checksum field using recently seen ICAO addresses. +* Decode raw IQ samples from file (using --ifile command line switch). +* Interactive command-line-interfae mode where aircrafts currently detected + are shown as a list refreshing as more data arrives. +* CPR coordinates decoding and track calculation from velocity. +* TCP server streaming and recceiving raw data to/from connected clients + (using --net). + +Installation +--- + +Type "make". + +Normal usage +--- + +To capture traffic directly from your RTL device and show the captured traffic +on standard output, just run the program without options at all: + + ./dump1090 + +To just output hexadecimal messages: + + ./dump1090 --raw + +To run the program in interactive mode: + + ./dump1090 --interactive + +To run the program in interactive mode, with networking support, and connect +with your browser to http://localhost:8080 to see live traffic: + + ./dump1090 --interactive --net + +In iteractive mode it is possible to have a less information dense but more +"arcade style" output, where the screen is refreshed every second displaying +all the recently seen aircrafts with some additional information such as +altitude and flight number, extracted from the received Mode S packets. + +Using files as source of data +--- + +To decode data from file, use: + + ./dump1090 --ifile /path/to/binfile + +The binary file should be created using `rtl_sdr` like this (or with any other +program that is able to output 8-bit unsigned IQ samples at 2Mhz sample rate). + + rtl_sdr -f 1090000000 -s 2000000 -g 50 output.bin + +In the example `rtl_sdr` a gain of 50 is used, simply you should use the highest +gain availabe for your tuner. This is not needed when calling Dump1090 itself +as it is able to select the highest gain supported automatically. + +It is possible to feed the program with data via standard input using +the --ifile option with "-" as argument. + +Additional options +--- + +Dump1090 can be called with other command line options to set a different +gain, frequency, and so forth. For a list of options use: + + ./dump1090 --help + +Everything is not documented here should be obvious, and for most users calling +it without arguments at all is the best thing to do. + +Reliability +--- + +By default Dump1090 checks for decoding errors using the 24-bit CRC checksum, +where available. Messages with errors are discarded. + +The --fix command line switch enables fixing single bit error correction +based on the CRC checksum. Technically, it uses a table of precomputed +checksum differences resulting from single bit errors to look up the +wrong bit position. + +This is indeed able to fix errors and works reliably in my experience, +however if you are interested in very reliable data I suggest to use +the --no-fix command line switch in order to disable error fixing. + +Performances and sensibility of detection +--- + +In my limited experience Dump1090 was able to decode a big number of messages +even in conditions where I encountered problems using other programs, however +no formal test was performed so I can't really claim that this program is +better or worse compared to other similar programs. + +If you can capture traffic that Dump1090 is not able to decode properly, drop +me an email with a download link. I may try to improve the detection during +my free time (this is just an hobby project). + +Network server features +--- + +By enabling the networking support with --net Dump1090 starts listening +for clients connections on port 30002 and 30001 (you can change both the +ports if you want, see --help output). + +Port 30002 +--- + +Connected clients are served with data ASAP as they arrive from the device +(or from file if --ifile is used) in the raw format similar to the following: + + *8D451E8B99019699C00B0A81F36E; + +Every entry is separated by a simple newline (LF character, hex 0x0A). + +Port 30001 +--- + +Port 30001 is the raw input port, and can be used to feed Dump1090 with +data in the same format as specified above, with hex messages starting with +a `*` and ending with a `;` character. + +So for instance if there is another remote Dump1090 instance collecting data +it is possible to sum the output to a local Dump1090 instance doing something +like this: + + nc remote-dump1090.example.net 30002 | nc localhost 30001 + +It is important to note that what is received via port 30001 is also +broadcasted to clients listening to port 30002. + +In general everything received from port 30001 is handled exactly like the +normal traffic from RTL devices or from file when --ifile is used. + +It is possible to use Dump1090 just as an hub using --ifile with /dev/zero +as argument as in the following example: + + ./dump1090 --net-only + +Or alternatively to see what's happening on the screen: + + ./dump1090 --net-only --interactive + +Then you can feed it from different data sources from the internet. + +Port 30003 +--- + +Connected clients are served with messages in SBS1 (BaseStation) format, +similar to: + + MSG,4,,,738065,,,,,,,,420,179,,,0,,0,0,0,0 + MSG,3,,,738065,,,,,,,35000,,,34.81609,34.07810,,,0,0,0,0 + +This can be used to feed data to various sharing sites without the need to use another decoder. + +Antenna +--- + +Mode S messages are transmitted in the 1090 Mhz frequency. If you have a decent +antenna you'll be able to pick up signals from aircrafts pretty far from your +position, especially if you are outdoor and in a position with a good sky view. + +You can easily build a very cheap antenna following the istructions at: + + http://antirez.com/news/46 + +With this trivial antenna I was able to pick up signals of aircrafts 200+ Km +away from me. + +If you are interested in a more serious antenna check the following +resources: + +* http://gnuradio.org/redmine/attachments/download/246/06-foster-adsb.pdf +* http://www.lll.lu/~edward/edward/adsb/antenna/ADSBantenna.html +* http://modesbeast.com/pix/adsb-ant-drawing.gif + +Aggressive mode +--- + +With --aggressive it is possible to activate the *aggressive mode* that is a +modified version of the Mode S packet detection and decoding. +The aggresive mode uses more CPU usually (especially if there are many planes +sending DF17 packets), but can detect a few more messages. + +The algorithm in aggressive mode is modified in the following ways: + +* Up to two demodulation errors are tolerated (adjacent entires in the + magnitude vector with the same eight). Normally only messages without + errors are checked. +* It tries to fix DF17 messages with CRC errors resulting from any two bit + errors. + +The use of aggressive mdoe is only advised in places where there is +low traffic in order to have a chance to capture some more messages. + +Debug mode +--- + +The Debug mode is a visual help to improve the detection algorithm or to +understand why the program is not working for a given input. + +In this mode messages are displayed in an ASCII-art style graphical +representation, where the individial magnitude bars sampled at 2Mhz are +displayed. + +An index shows the sample number, where 0 is the sample where the first +Mode S peak was found. Some additional background noise is also added +before the first peak to provide some context. + +To enable debug mode and check what combinations of packets you can +log, use `mode1090 --help` to obtain a list of available debug flags. + +Debug mode includes an optional javascript output that is used to visualize +packets using a web browser, you can use the file debug.html under the +'tools' directory to load the generated frames.js file. + +How this program works? +--- + +The code is very documented and written in order to be easy to understand. +For the diligent programmer with a Mode S specification on his hands it +should be trivial to understand how it works. + +The algorithms I used were obtained basically looking at many messages +as displayed using a trow-away SDL program, and trying to model the algorithm +based on how the messages look graphically. + +How to test the program? +--- + +If you have an RTLSDR device and you happen to be in an area where there +are aircrafts flying over your head, just run the program and check for signals. + +However if you don't have an RTLSDR device, or if in your area the presence +of aircrafts is very limited, you may want to try the sample file distributed +with the Dump1090 distribution under the "testfiles" directory. + +Just run it like this: + + ./dump1090 --ifile testfiles/modes1.bin + +What is --strip mode? +--- + +It is just a simple filter that will get raw IQ 8 bit samples in input +and will output a file missing all the parts of the file where I and Q +are lower than the specified for more than 32 samples. + +Use it like this: + + cat big.bin | ./dump1090 --snip 25 > small.bin + +I used it in order to create a small test file to include inside this +program source code distribution. + +Contributing +--- + +Dump1090 was written during some free time during xmas 2012, it is an hobby +project so I'll be able to address issues and improve it only during +free time, however you are incouraged to send pull requests in order to +improve the program. A good starting point can be the TODO list included in +the source distribution. + +Credits +--- + +Dump1090 was written by Salvatore Sanfilippo and is +released under the BSD three clause license. diff --git a/sdl1090/TODO b/sdl1090/TODO new file mode 100644 index 0000000..041ad29 --- /dev/null +++ b/sdl1090/TODO @@ -0,0 +1,5 @@ +TODO + +* Extract more information from captured Mode S messages. +* Improve the web interface gmap.html. +* Enhance the algorithm to reliably decode more messages. diff --git a/sdl1090/anet.c b/sdl1090/anet.c new file mode 100644 index 0000000..859c98c --- /dev/null +++ b/sdl1090/anet.c @@ -0,0 +1,345 @@ +/* anet.c -- Basic TCP socket stuff made a bit less boring + * + * Copyright (c) 2006-2012, Salvatore Sanfilippo + * 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. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * 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 OWNER 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 _WIN32 + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include +#else + #include "winstubs.h" //Put everything Windows specific in here + #include "dump1090.h" +#endif + +#include "anet.h" + +static void anetSetError(char *err, const char *fmt, ...) +{ + va_list ap; + + if (!err) return; + va_start(ap, fmt); + vsnprintf(err, ANET_ERR_LEN, fmt, ap); + va_end(ap); +} + +int anetNonBlock(char *err, int fd) +{ + int flags; +#ifndef _WIN32 + /* Set the socket nonblocking. + * Note that fcntl(2) for F_GETFL and F_SETFL can't be + * interrupted by a signal. */ + if ((flags = fcntl(fd, F_GETFL)) == -1) { + anetSetError(err, "fcntl(F_GETFL): %s", strerror(errno)); + return ANET_ERR; + } + if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) { + anetSetError(err, "fcntl(F_SETFL,O_NONBLOCK): %s", strerror(errno)); + return ANET_ERR; + } +#else + flags = 1; + if (ioctlsocket(fd, FIONBIO, &flags)) { + errno = WSAGetLastError(); + anetSetError(err, "ioctlsocket(FIONBIO): %s", strerror(errno)); + return ANET_ERR; + } +#endif + return ANET_OK; +} + +int anetTcpNoDelay(char *err, int fd) +{ + int yes = 1; + if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void*)&yes, sizeof(yes)) == -1) + { + anetSetError(err, "setsockopt TCP_NODELAY: %s", strerror(errno)); + return ANET_ERR; + } + return ANET_OK; +} + +int anetSetSendBuffer(char *err, int fd, int buffsize) +{ + if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (void*)&buffsize, sizeof(buffsize)) == -1) + { + anetSetError(err, "setsockopt SO_SNDBUF: %s", strerror(errno)); + return ANET_ERR; + } + return ANET_OK; +} + +int anetTcpKeepAlive(char *err, int fd) +{ + int yes = 1; + if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&yes, sizeof(yes)) == -1) { + anetSetError(err, "setsockopt SO_KEEPALIVE: %s", strerror(errno)); + return ANET_ERR; + } + return ANET_OK; +} + +int anetResolve(char *err, char *host, char *ipbuf) +{ + struct sockaddr_in sa; + + sa.sin_family = AF_INET; + if (inet_aton(host, (void*)&sa.sin_addr) == 0) { + struct hostent *he; + + he = gethostbyname(host); + if (he == NULL) { + anetSetError(err, "can't resolve: %s", host); + return ANET_ERR; + } + memcpy(&sa.sin_addr, he->h_addr, sizeof(struct in_addr)); + } + strcpy(ipbuf,inet_ntoa(sa.sin_addr)); + return ANET_OK; +} + +static int anetCreateSocket(char *err, int domain) { + int s, on = 1; + if ((s = socket(domain, SOCK_STREAM, 0)) == -1) { +#ifdef _WIN32 + errno = WSAGetLastError(); +#endif + anetSetError(err, "creating socket: %s", strerror(errno)); + return ANET_ERR; + } + + /* Make sure connection-intensive things like the redis benckmark + * will be able to close/open sockets a zillion of times */ + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void*)&on, sizeof(on)) == -1) { + anetSetError(err, "setsockopt SO_REUSEADDR: %s", strerror(errno)); + return ANET_ERR; + } + return s; +} + +#define ANET_CONNECT_NONE 0 +#define ANET_CONNECT_NONBLOCK 1 +static int anetTcpGenericConnect(char *err, char *addr, int port, int flags) +{ + int s; + struct sockaddr_in sa; + + if ((s = anetCreateSocket(err,AF_INET)) == ANET_ERR) + return ANET_ERR; + + memset(&sa,0,sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons((uint16_t)port); + if (inet_aton(addr, (void*)&sa.sin_addr) == 0) { + struct hostent *he; + + he = gethostbyname(addr); + if (he == NULL) { + anetSetError(err, "can't resolve: %s", addr); + close(s); + return ANET_ERR; + } + memcpy(&sa.sin_addr, he->h_addr, sizeof(struct in_addr)); + } + if (flags & ANET_CONNECT_NONBLOCK) { + if (anetNonBlock(err,s) != ANET_OK) + return ANET_ERR; + } + if (connect(s, (struct sockaddr*)&sa, sizeof(sa)) == -1) { + if (errno == EINPROGRESS && + flags & ANET_CONNECT_NONBLOCK) + return s; + + anetSetError(err, "connect: %s", strerror(errno)); + close(s); + return ANET_ERR; + } + return s; +} + +int anetTcpConnect(char *err, char *addr, int port) +{ + return anetTcpGenericConnect(err,addr,port,ANET_CONNECT_NONE); +} + +int anetTcpNonBlockConnect(char *err, char *addr, int port) +{ + return anetTcpGenericConnect(err,addr,port,ANET_CONNECT_NONBLOCK); +} + +/* Like read(2) but make sure 'count' is read before to return + * (unless error or EOF condition is encountered) */ +int anetRead(int fd, char *buf, int count) +{ + int nread, totlen = 0; + while(totlen != count) { + nread = read(fd,buf,count-totlen); + if (nread == 0) return totlen; + if (nread == -1) return -1; + totlen += nread; + buf += nread; + } + return totlen; +} + +/* Like write(2) but make sure 'count' is read before to return + * (unless error is encountered) */ +int anetWrite(int fd, char *buf, int count) +{ + int nwritten, totlen = 0; + while(totlen != count) { + nwritten = write(fd,buf,count-totlen); + if (nwritten == 0) return totlen; + if (nwritten == -1) return -1; + totlen += nwritten; + buf += nwritten; + } + return totlen; +} + +static int anetListen(char *err, int s, struct sockaddr *sa, socklen_t len) { + if (bind(s,sa,len) == -1) { +#ifdef _WIN32 + errno = WSAGetLastError(); +#endif + anetSetError(err, "bind: %s", strerror(errno)); + close(s); + return ANET_ERR; + } + + /* Use a backlog of 512 entries. We pass 511 to the listen() call because + * the kernel does: backlogsize = roundup_pow_of_two(backlogsize + 1); + * which will thus give us a backlog of 512 entries */ + if (listen(s, 511) == -1) { +#ifdef _WIN32 + errno = WSAGetLastError(); +#endif + anetSetError(err, "listen: %s", strerror(errno)); + close(s); + return ANET_ERR; + } + return ANET_OK; +} + +int anetTcpServer(char *err, int port, char *bindaddr) +{ + int s; + struct sockaddr_in sa; + + if ((s = anetCreateSocket(err,AF_INET)) == ANET_ERR) + return ANET_ERR; + + memset(&sa,0,sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons((uint16_t)port); + sa.sin_addr.s_addr = htonl(INADDR_ANY); + if (bindaddr && inet_aton(bindaddr, (void*)&sa.sin_addr) == 0) { + anetSetError(err, "invalid bind address"); + close(s); + return ANET_ERR; + } + if (anetListen(err,s,(struct sockaddr*)&sa,sizeof(sa)) == ANET_ERR) + return ANET_ERR; + return s; +} + +static int anetGenericAccept(char *err, int s, struct sockaddr *sa, socklen_t *len) { + int fd; + while(1) { + fd = accept(s,sa,len); + if (fd == -1) { +#ifndef _WIN32 + if (errno == EINTR) { + continue; +#else + errno = WSAGetLastError(); + if (errno == WSAEWOULDBLOCK) { +#endif + } else { + anetSetError(err, "accept: %s", strerror(errno)); + } + } + break; + } + return fd; +} + +int anetTcpAccept(char *err, int s, char *ip, int *port) { + int fd; + struct sockaddr_in sa; + socklen_t salen = sizeof(sa); + if ((fd = anetGenericAccept(err,s,(struct sockaddr*)&sa,&salen)) == ANET_ERR) + return ANET_ERR; + + if (ip) strcpy(ip,inet_ntoa(sa.sin_addr)); + if (port) *port = ntohs(sa.sin_port); + return fd; +} + +int anetPeerToString(int fd, char *ip, int *port) { + struct sockaddr_in sa; + socklen_t salen = sizeof(sa); + + if (getpeername(fd,(struct sockaddr*)&sa,&salen) == -1) { + *port = 0; + ip[0] = '?'; + ip[1] = '\0'; + return -1; + } + if (ip) strcpy(ip,inet_ntoa(sa.sin_addr)); + if (port) *port = ntohs(sa.sin_port); + return 0; +} + +int anetSockName(int fd, char *ip, int *port) { + struct sockaddr_in sa; + socklen_t salen = sizeof(sa); + + if (getsockname(fd,(struct sockaddr*)&sa,&salen) == -1) { + *port = 0; + ip[0] = '?'; + ip[1] = '\0'; + return -1; + } + if (ip) strcpy(ip,inet_ntoa(sa.sin_addr)); + if (port) *port = ntohs(sa.sin_port); + return 0; +} diff --git a/sdl1090/anet.h b/sdl1090/anet.h new file mode 100644 index 0000000..6d74af5 --- /dev/null +++ b/sdl1090/anet.h @@ -0,0 +1,59 @@ +/* anet.c -- Basic TCP socket stuff made a bit less boring + * + * Copyright (c) 2006-2012, Salvatore Sanfilippo + * 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. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * 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 OWNER 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 ANET_H +#define ANET_H + +#define ANET_OK 0 +#define ANET_ERR -1 +#define ANET_ERR_LEN 256 + +#if defined(__sun) +#define AF_LOCAL AF_UNIX +#endif + +int anetTcpConnect(char *err, char *addr, int port); +int anetTcpNonBlockConnect(char *err, char *addr, int port); +int anetUnixConnect(char *err, char *path); +int anetUnixNonBlockConnect(char *err, char *path); +int anetRead(int fd, char *buf, int count); +int anetResolve(char *err, char *host, char *ipbuf); +int anetTcpServer(char *err, int port, char *bindaddr); +int anetUnixServer(char *err, char *path, mode_t perm); +int anetTcpAccept(char *err, int serversock, char *ip, int *port); +int anetUnixAccept(char *err, int serversock); +int anetWrite(int fd, char *buf, int count); +int anetNonBlock(char *err, int fd); +int anetTcpNoDelay(char *err, int fd); +int anetTcpKeepAlive(char *err, int fd); +int anetPeerToString(int fd, char *ip, int *port); +int anetSetSendBuffer(char *err, int fd, int buffsize); + +#endif diff --git a/sdl1090/coaa.h b/sdl1090/coaa.h new file mode 100644 index 0000000..3d07704 --- /dev/null +++ b/sdl1090/coaa.h @@ -0,0 +1,6 @@ +// coaa.h configuration file for Plane Plotter Uploader +// +// You MUST apply via the COAA website for your own personal version of this file +// Do not disclose the contents of this file to anyone thereafter as it uniquely +// identifies you to the PlanePlotter system +// diff --git a/sdl1090/defs.h b/sdl1090/defs.h new file mode 100644 index 0000000..0bb1727 --- /dev/null +++ b/sdl1090/defs.h @@ -0,0 +1,8 @@ +#include +#include +#include +#include "SDL2/SDL.h" +#include "SDL2/SDL_ttf.h" + +#define SCREEN_WIDTH 320 +#define SCREEN_HEIGHT 240 diff --git a/sdl1090/draw.c b/sdl1090/draw.c new file mode 100644 index 0000000..c1ecad5 --- /dev/null +++ b/sdl1090/draw.c @@ -0,0 +1,112 @@ +#include "draw.h" +#include "parula.h" + +extern void drawString(char *, int, int, TTF_Font *, SDL_Color); + +void CROSSVP(double *v, double *u, double *w) +{ + v[0] = u[1]*w[2] - u[2]*(w)[1]; + v[1] = u[2]*w[0] - u[0]*(w)[2]; + v[2] = u[0]*w[1] - u[1]*(w)[0]; +} + +void drawPlaneHeading(int x, int y, double heading, int signal, char *flight) +{ + + if(signal > 127) { + signal = 127; + } + + SDL_SetRenderDrawColor(game.renderer, parula[signal][0], parula[signal][1], parula[signal][2], SDL_ALPHA_OPAQUE); + + double body = 8.0; + double wing = 6.0; + double tail = 3.0; + + double vec[3]; + vec[0] = sin(heading * M_PI / 180); + vec[1] = cos(heading * M_PI / 180); + vec[2] = 0; + + double up[] = {0,0,1}; + + double out[3]; + + CROSSVP(out,vec,up); + + int x1, x2, y1, y2; + + //body + + x1 = x + round(-body*vec[0]); + y1 = y + round(-body*vec[1]); + x2 = x + round(body*vec[0]); + y2 = y + round(body*vec[1]); + + SDL_RenderDrawLine(game.renderer, x1, y1, x2, y2); + + //wing + + x1 = x + round(-wing*out[0]); + y1 = y + round(-wing*out[1]); + x2 = x + round(wing*out[0]); + y2 = y + round(wing*out[1]); + + SDL_RenderDrawLine(game.renderer, x1, y1, x2, y2); + + //tail + + x1 = x + round(-body*vec[0]) + round(-tail*out[0]); + y1 = y + round(-body*vec[1]) + round(-tail*out[1]); + x2 = x + round(-body*vec[0]) + round(tail*out[0]); + y2 = y + round(-body*vec[1]) + round(tail*out[1]); + + SDL_RenderDrawLine(game.renderer, x1, y1, x2, y2); + + + SDL_Color color = { parula[signal][0], parula[signal][1], parula[signal][2]}; + + drawString(flight, x, y - 10, game.font, color); +} + +void drawPlane(int x, int y, int signal) +{ + SDL_SetRenderDrawColor(game.renderer, 255, 255, 255, SDL_ALPHA_OPAQUE); + + int length = 3.0; + + double vec[3]; + + SDL_RenderDrawLine(game.renderer, x-length , y , x+length , y ); + SDL_RenderDrawLine(game.renderer, x , y-length , x , y+length ); +} + + +void drawGrid() +{ + SDL_SetRenderDrawColor(game.renderer, 40, 40, 40, SDL_ALPHA_OPAQUE); + + SDL_RenderDrawLine(game.renderer, 0, 120, 320, 120); + SDL_RenderDrawLine(game.renderer, 160, 0, 160, 240); +} + + +void delay(unsigned int frameLimit) +{ + unsigned int ticks = SDL_GetTicks(); + + if (frameLimit < ticks) + { + return; + } + + if (frameLimit > ticks + 16) + { + SDL_Delay(16); + } + + else + { + SDL_Delay(frameLimit - ticks); + } +} diff --git a/sdl1090/draw.h b/sdl1090/draw.h new file mode 100644 index 0000000..23c33a1 --- /dev/null +++ b/sdl1090/draw.h @@ -0,0 +1,3 @@ +#include "structs.h" + +Game game; diff --git a/sdl1090/dump1090.c b/sdl1090/dump1090.c new file mode 100644 index 0000000..60882fc --- /dev/null +++ b/sdl1090/dump1090.c @@ -0,0 +1,904 @@ +// dump1090, a Mode S messages decoder for RTLSDR devices. +// +// Copyright (C) 2012 by Salvatore Sanfilippo +// +// 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 "dump1090.h" +// +// ============================= Utility functions ========================== +// +void sigintHandler(int dummy) { + MODES_NOTUSED(dummy); + signal(SIGINT, SIG_DFL); // reset signal handler - bit extra safety + Modes.exit = 1; // Signal to threads that we are done +} +// +// =============================== Terminal handling ======================== +// +#ifndef _WIN32 +// Get the number of rows after the terminal changes size. +int getTermRows() { + struct winsize w; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); + return (w.ws_row); +} + +// Handle resizing terminal +void sigWinchCallback() { + signal(SIGWINCH, SIG_IGN); + Modes.interactive_rows = getTermRows(); + interactiveShowData(); + signal(SIGWINCH, sigWinchCallback); +} +#else +int getTermRows() { return MODES_INTERACTIVE_ROWS;} +#endif +// +// =============================== Initialization =========================== +// +void modesInitConfig(void) { + // Default everything to zero/NULL + memset(&Modes, 0, sizeof(Modes)); + + // Now initialise things that should not be 0/NULL to their defaults + Modes.gain = MODES_MAX_GAIN; + Modes.freq = MODES_DEFAULT_FREQ; + Modes.ppm_error = MODES_DEFAULT_PPM; + Modes.check_crc = 1; + Modes.net_heartbeat_rate = MODES_NET_HEARTBEAT_RATE; + Modes.net_output_sbs_port = MODES_NET_OUTPUT_SBS_PORT; + Modes.net_output_raw_port = MODES_NET_OUTPUT_RAW_PORT; + Modes.net_input_raw_port = MODES_NET_INPUT_RAW_PORT; + Modes.net_output_beast_port = MODES_NET_OUTPUT_BEAST_PORT; + Modes.net_input_beast_port = MODES_NET_INPUT_BEAST_PORT; + Modes.net_http_port = MODES_NET_HTTP_PORT; + Modes.interactive_rows = getTermRows(); + 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; +} +// +//========================================================================= +// +void modesInit(void) { + int i, q; + + pthread_mutex_init(&Modes.pDF_mutex,NULL); + pthread_mutex_init(&Modes.data_mutex,NULL); + pthread_cond_init(&Modes.data_cond,NULL); + + // Allocate the various buffers used by Modes + if ( ((Modes.icao_cache = (uint32_t *) malloc(sizeof(uint32_t) * MODES_ICAO_CACHE_LEN * 2) ) == NULL) || + ((Modes.pFileData = (uint16_t *) malloc(MODES_ASYNC_BUF_SIZE) ) == NULL) || + ((Modes.magnitude = (uint16_t *) malloc(MODES_ASYNC_BUF_SIZE+MODES_PREAMBLE_SIZE+MODES_LONG_MSG_SIZE) ) == NULL) || + ((Modes.maglut = (uint16_t *) malloc(sizeof(uint16_t) * 256 * 256) ) == NULL) || + ((Modes.beastOut = (char *) malloc(MODES_RAWOUT_BUF_SIZE) ) == NULL) || + ((Modes.rawOut = (char *) malloc(MODES_RAWOUT_BUF_SIZE) ) == NULL) ) + { + 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); + memset(Modes.pFileData,127, MODES_ASYNC_BUF_SIZE); + memset(Modes.magnitude, 0, MODES_ASYNC_BUF_SIZE+MODES_PREAMBLE_SIZE+MODES_LONG_MSG_SIZE); + + // 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; + } + + // Limit the maximum requested raw output size to less than one Ethernet Block + if (Modes.net_output_raw_size > (MODES_RAWOUT_BUF_FLUSH)) + {Modes.net_output_raw_size = MODES_RAWOUT_BUF_FLUSH;} + if (Modes.net_output_raw_rate > (MODES_RAWOUT_BUF_RATE)) + {Modes.net_output_raw_rate = MODES_RAWOUT_BUF_RATE;} + if (Modes.net_sndbuf_size > (MODES_NET_SNDBUF_MAX)) + {Modes.net_sndbuf_size = MODES_NET_SNDBUF_MAX;} + + // Initialise the Block Timers to something half sensible + ftime(&Modes.stSystemTimeBlk); + for (i = 0; i < MODES_ASYNC_BUF_NUMBER; i++) + {Modes.stSystemTimeRTL[i] = Modes.stSystemTimeBlk;} + + // Each I and Q value varies from 0 to 255, which represents a range from -1 to +1. To get from the + // unsigned (0-255) range you therefore subtract 127 (or 128 or 127.5) from each I and Q, giving you + // a range from -127 to +128 (or -128 to +127, or -127.5 to +127.5).. + // + // To decode the AM signal, you need the magnitude of the waveform, which is given by sqrt((I^2)+(Q^2)) + // The most this could be is if I&Q are both 128 (or 127 or 127.5), so you could end up with a magnitude + // of 181.019 (or 179.605, or 180.312) + // + // However, in reality the magnitude of the signal should never exceed the range -1 to +1, because the + // values are I = rCos(w) and Q = rSin(w). Therefore the integer computed magnitude should (can?) never + // exceed 128 (or 127, or 127.5 or whatever) + // + // If we scale up the results so that they range from 0 to 65535 (16 bits) then we need to multiply + // by 511.99, (or 516.02 or 514). antirez's original code multiplies by 360, presumably because he's + // assuming the maximim calculated amplitude is 181.019, and (181.019 * 360) = 65166. + // + // So lets see if we can improve things by subtracting 127.5, Well in integer arithmatic we can't + // subtract half, so, we'll double everything up and subtract one, and then compensate for the doubling + // in the multiplier at the end. + // + // If we do this we can never have I or Q equal to 0 - they can only be as small as +/- 1. + // This gives us a minimum magnitude of root 2 (0.707), so the dynamic range becomes (1.414-255). This + // also affects our scaling value, which is now 65535/(255 - 1.414), or 258.433254 + // + // The sums then become mag = 258.433254 * (sqrt((I*2-255)^2 + (Q*2-255)^2) - 1.414) + // or mag = (258.433254 * sqrt((I*2-255)^2 + (Q*2-255)^2)) - 365.4798 + // + // We also need to clip mag just incaes any rogue I/Q values somehow do have a magnitude greater than 255. + // + + for (i = 0; i <= 255; i++) { + for (q = 0; q <= 255; q++) { + int mag, mag_i, mag_q; + + mag_i = (i * 2) - 255; + mag_q = (q * 2) - 255; + + mag = (int) round((sqrt((mag_i*mag_i)+(mag_q*mag_q)) * 258.433254) - 365.4798); + + Modes.maglut[(i*256)+q] = (uint16_t) ((mag < 65535) ? mag : 65535); + } + } + + // Prepare error correction tables + modesInitErrorInfo(); +} +// +// =============================== RTLSDR handling ========================== +// +void modesInitRTLSDR(void) { + int j; + int device_count; + char vendor[256], product[256], serial[256]; + + device_count = rtlsdr_get_device_count(); + if (!device_count) { + fprintf(stderr, "No supported RTLSDR devices found.\n"); + exit(1); + } + + fprintf(stderr, "Found %d device(s):\n", device_count); + for (j = 0; j < device_count; j++) { + rtlsdr_get_device_usb_strings(j, vendor, product, serial); + fprintf(stderr, "%d: %s, %s, SN: %s %s\n", j, vendor, product, serial, + (j == Modes.dev_index) ? "(currently selected)" : ""); + } + + if (rtlsdr_open(&Modes.dev, Modes.dev_index) < 0) { + fprintf(stderr, "Error opening the RTLSDR device: %s\n", + strerror(errno)); + exit(1); + } + + // Set gain, frequency, sample rate, and reset the device + rtlsdr_set_tuner_gain_mode(Modes.dev, + (Modes.gain == MODES_AUTO_GAIN) ? 0 : 1); + if (Modes.gain != MODES_AUTO_GAIN) { + if (Modes.gain == MODES_MAX_GAIN) { + // Find the maximum gain available + int numgains; + int gains[100]; + + numgains = rtlsdr_get_tuner_gains(Modes.dev, gains); + Modes.gain = gains[numgains-1]; + fprintf(stderr, "Max available gain is: %.2f\n", Modes.gain/10.0); + } + rtlsdr_set_tuner_gain(Modes.dev, Modes.gain); + fprintf(stderr, "Setting gain to: %.2f\n", Modes.gain/10.0); + } else { + fprintf(stderr, "Using automatic gain control.\n"); + } + rtlsdr_set_freq_correction(Modes.dev, Modes.ppm_error); + if (Modes.enable_agc) rtlsdr_set_agc_mode(Modes.dev, 1); + rtlsdr_set_center_freq(Modes.dev, Modes.freq); + rtlsdr_set_sample_rate(Modes.dev, MODES_DEFAULT_RATE); + rtlsdr_reset_buffer(Modes.dev); + fprintf(stderr, "Gain reported by device: %.2f\n", + rtlsdr_get_tuner_gain(Modes.dev)/10.0); +} +// +//========================================================================= +// +// We use a thread reading data in background, while the main thread +// handles decoding and visualization of data to the user. +// +// The reading thread calls the RTLSDR API to read data asynchronously, and +// uses a callback to populate the data buffer. +// +// A Mutex is used to avoid races with the decoding thread. +// +void rtlsdrCallback(unsigned char *buf, uint32_t len, void *ctx) { + + MODES_NOTUSED(ctx); + + // Lock the data buffer variables before accessing them + pthread_mutex_lock(&Modes.data_mutex); + + Modes.iDataIn &= (MODES_ASYNC_BUF_NUMBER-1); // Just incase!!! + + // Get the system time for this block + ftime(&Modes.stSystemTimeRTL[Modes.iDataIn]); + + if (len > MODES_ASYNC_BUF_SIZE) {len = MODES_ASYNC_BUF_SIZE;} + + // Queue the new data + Modes.pData[Modes.iDataIn] = (uint16_t *) buf; + Modes.iDataIn = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataIn + 1); + Modes.iDataReady = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataIn - Modes.iDataOut); + + if (Modes.iDataReady == 0) { + // Ooooops. We've just received the MODES_ASYNC_BUF_NUMBER'th outstanding buffer + // This means that RTLSDR is currently overwriting the MODES_ASYNC_BUF_NUMBER+1 + // buffer, but we havent yet processed it, so we're going to lose it. There + // isn't much we can do to recover the lost data, but we can correct things to + // avoid any additional problems. + Modes.iDataOut = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataOut+1); + Modes.iDataReady = (MODES_ASYNC_BUF_NUMBER-1); + Modes.iDataLost++; + } + + // Signal to the other thread that new data is ready, and unlock + pthread_cond_signal(&Modes.data_cond); + pthread_mutex_unlock(&Modes.data_mutex); +} +// +//========================================================================= +// +// This is used when --ifile is specified in order to read data from file +// instead of using an RTLSDR device +// +void readDataFromFile(void) { + pthread_mutex_lock(&Modes.data_mutex); + while(Modes.exit == 0) { + ssize_t nread, toread; + unsigned char *p; + + if (Modes.iDataReady) { + pthread_cond_wait(&Modes.data_cond, &Modes.data_mutex); + continue; + } + + if (Modes.interactive) { + // When --ifile and --interactive are used together, slow down + // playing at the natural rate of the RTLSDR received. + pthread_mutex_unlock(&Modes.data_mutex); + usleep(64000); + pthread_mutex_lock(&Modes.data_mutex); + } + + toread = MODES_ASYNC_BUF_SIZE; + p = (unsigned char *) Modes.pFileData; + while(toread) { + nread = read(Modes.fd, p, toread); + if (nread <= 0) { + Modes.exit = 1; // Signal the other threads to exit. + break; + } + p += nread; + toread -= nread; + } + if (toread) { + // Not enough data on file to fill the buffer? Pad with no signal. + memset(p,127,toread); + } + + Modes.iDataIn &= (MODES_ASYNC_BUF_NUMBER-1); // Just incase!!! + + // Get the system time for this block + ftime(&Modes.stSystemTimeRTL[Modes.iDataIn]); + + // Queue the new data + Modes.pData[Modes.iDataIn] = Modes.pFileData; + Modes.iDataIn = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataIn + 1); + Modes.iDataReady = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataIn - Modes.iDataOut); + + // Signal to the other thread that new data is ready + pthread_cond_signal(&Modes.data_cond); + } +} +// +//========================================================================= +// +// We read data using a thread, so the main thread only handles decoding +// without caring about data acquisition +// +void *readerThreadEntryPoint(void *arg) { + MODES_NOTUSED(arg); + + if (Modes.filename == NULL) { + rtlsdr_read_async(Modes.dev, rtlsdrCallback, NULL, + MODES_ASYNC_BUF_NUMBER, + MODES_ASYNC_BUF_SIZE); + } else { + readDataFromFile(); + } + // Signal to the other thread that new data is ready - dummy really so threads don't mutually lock + pthread_cond_signal(&Modes.data_cond); + pthread_mutex_unlock(&Modes.data_mutex); +#ifndef _WIN32 + pthread_exit(NULL); +#else + return NULL; +#endif +} +// +// ============================== Snip mode ================================= +// +// Get raw IQ samples and filter everything is < than the specified level +// for more than 256 samples in order to reduce example file size +// +void snipMode(int level) { + int i, q; + uint64_t c = 0; + + while ((i = getchar()) != EOF && (q = getchar()) != EOF) { + if (abs(i-127) < level && abs(q-127) < level) { + c++; + if (c > MODES_PREAMBLE_SIZE) continue; + } else { + c = 0; + } + putchar(i); + putchar(q); + } +} +// +// ================================ Main ==================================== +// +void showHelp(void) { + printf( +"-----------------------------------------------------------------------------\n" +"| dump1090 ModeS Receiver Ver : " MODES_DUMP1090_VERSION " |\n" +"-----------------------------------------------------------------------------\n" +"--device-index Select RTL device (default: 0)\n" +"--gain Set gain (default: max gain. Use -10 for auto-gain)\n" +"--enable-agc Enable the Automatic Gain Control (default: off)\n" +"--freq Set frequency (default: 1090 Mhz)\n" +"--ifile Read data from file (use '-' for stdin)\n" +"--interactive Interactive mode refreshing data on screen\n" +"--interactive-rows Max number of rows in interactive mode (default: 15)\n" +"--interactive-ttl Remove from list if idle for (default: 60)\n" +"--interactive-rtl1090 Display flight table in RTL1090 format\n" +"--raw Show only messages hex values\n" +"--net Enable networking\n" +"--modeac Enable decoding of SSR Modes 3/A & 3/C\n" +"--net-beast TCP raw output in Beast binary format\n" +"--net-only Enable just networking, no RTL device or file used\n" +"--net-bind-address IP address to bind to (default: Any; Use 127.0.0.1 for private)\n" +"--net-http-port HTTP server port (default: 8080)\n" +"--net-ri-port TCP raw input listen port (default: 30001)\n" +"--net-ro-port TCP raw output listen port (default: 30002)\n" +"--net-sbs-port TCP BaseStation output listen port (default: 30003)\n" +"--net-bi-port TCP Beast input listen port (default: 30004)\n" +"--net-bo-port TCP Beast output listen port (default: 30005)\n" +"--net-ro-size TCP raw output minimum size (default: 0)\n" +"--net-ro-rate TCP raw output memory flush rate (default: 0)\n" +"--net-heartbeat TCP heartbeat rate in seconds (default: 60 sec; 0 to disable)\n" +"--net-buffer TCP buffer size 64Kb * (2^n) (default: n=0, 64Kb)\n" +"--lat Reference/receiver latitude for surface posn (opt)\n" +"--lon Reference/receiver longitude for surface posn (opt)\n" +"--fix Enable single-bits error correction using CRC\n" +"--no-fix Disable single-bits error correction using CRC\n" +"--no-crc-check Disable messages with broken CRC (discouraged)\n" +"--phase-enhance Enable phase enhancement\n" +"--aggressive More CPU for more messages (two bits fixes, ...)\n" +"--mlat display raw messages in Beast ascii mode\n" +"--stats With --ifile print stats at exit. No other output\n" +"--stats-every Show and reset stats every seconds\n" +"--onlyaddr Show only ICAO addresses (testing purposes)\n" +"--metric Use metric units (meters, km/h, ...)\n" +"--snip Strip IQ file removing samples < level\n" +"--debug Debug mode (verbose), see README for details\n" +"--quiet Disable output to stdout. Use for daemon applications\n" +"--ppm Set receiver error in parts per million (default 0)\n" +"--help Show this help\n" +"\n" +"Debug mode flags: d = Log frames decoded with errors\n" +" D = Log frames decoded with zero errors\n" +" c = Log frames with bad CRC\n" +" C = Log frames with good CRC\n" +" p = Log frames with bad preamble\n" +" n = Log network debugging info\n" +" j = Log frames to frames.js, loadable by debug.html\n" + ); +} + +#ifdef _WIN32 +void showCopyright(void) { + uint64_t llTime = time(NULL) + 1; + + printf( +"-----------------------------------------------------------------------------\n" +"| dump1090 ModeS Receiver Ver : " MODES_DUMP1090_VERSION " |\n" +"-----------------------------------------------------------------------------\n" +"\n" +" Copyright (C) 2012 by Salvatore Sanfilippo \n" +" Copyright (C) 2014 by Malcolm Robb \n" +"\n" +" All rights reserved.\n" +"\n" +" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" +" ""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" +" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" +" A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n" +" HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" +" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n" +" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n" +" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n" +" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n" +" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n" +" OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" +"\n" +" For further details refer to \n" +"\n" + ); + + // delay for 1 second to give the user a chance to read the copyright + while (llTime >= time(NULL)) {} +} +#endif + + +static void display_stats(void) { + int j; + time_t now = time(NULL); + + printf("\n\n"); + if (Modes.interactive) + interactiveShowData(); + + printf("Statistics as at %s", ctime(&now)); + + printf("%d sample blocks processed\n", Modes.stat_blocks_processed); + printf("%d sample blocks dropped\n", Modes.stat_blocks_dropped); + + printf("%d ModeA/C detected\n", Modes.stat_ModeAC); + printf("%d valid Mode-S preambles\n", Modes.stat_valid_preamble); + printf("%d DF-?? fields corrected for length\n", Modes.stat_DF_Len_Corrected); + printf("%d DF-?? fields corrected for type\n", Modes.stat_DF_Type_Corrected); + printf("%d demodulated with 0 errors\n", Modes.stat_demodulated0); + printf("%d demodulated with 1 error\n", Modes.stat_demodulated1); + printf("%d demodulated with 2 errors\n", Modes.stat_demodulated2); + printf("%d demodulated with > 2 errors\n", Modes.stat_demodulated3); + printf("%d with good crc\n", Modes.stat_goodcrc); + printf("%d with bad crc\n", Modes.stat_badcrc); + printf("%d errors corrected\n", Modes.stat_fixed); + + for (j = 0; j < MODES_MAX_BITERRORS; j++) { + printf(" %d with %d bit %s\n", Modes.stat_bit_fix[j], j+1, (j==0)?"error":"errors"); + } + + if (Modes.phase_enhance) { + printf("%d phase enhancement attempts\n", Modes.stat_out_of_phase); + printf("%d phase enhanced demodulated with 0 errors\n", Modes.stat_ph_demodulated0); + printf("%d phase enhanced demodulated with 1 error\n", Modes.stat_ph_demodulated1); + printf("%d phase enhanced demodulated with 2 errors\n", Modes.stat_ph_demodulated2); + printf("%d phase enhanced demodulated with > 2 errors\n", Modes.stat_ph_demodulated3); + printf("%d phase enhanced with good crc\n", Modes.stat_ph_goodcrc); + printf("%d phase enhanced with bad crc\n", Modes.stat_ph_badcrc); + printf("%d phase enhanced errors corrected\n", Modes.stat_ph_fixed); + + for (j = 0; j < MODES_MAX_BITERRORS; j++) { + printf(" %d with %d bit %s\n", Modes.stat_ph_bit_fix[j], j+1, (j==0)?"error":"errors"); + } + } + + printf("%d total usable messages\n", Modes.stat_goodcrc + Modes.stat_ph_goodcrc + Modes.stat_fixed + Modes.stat_ph_fixed); + fflush(stdout); + + Modes.stat_blocks_processed = + Modes.stat_blocks_dropped = 0; + + Modes.stat_ModeAC = + Modes.stat_valid_preamble = + Modes.stat_DF_Len_Corrected = + Modes.stat_DF_Type_Corrected = + Modes.stat_demodulated0 = + Modes.stat_demodulated1 = + Modes.stat_demodulated2 = + Modes.stat_demodulated3 = + Modes.stat_goodcrc = + Modes.stat_badcrc = + Modes.stat_fixed = 0; + + Modes.stat_out_of_phase = + Modes.stat_ph_demodulated0 = + Modes.stat_ph_demodulated1 = + Modes.stat_ph_demodulated2 = + Modes.stat_ph_demodulated3 = + Modes.stat_ph_goodcrc = + Modes.stat_ph_badcrc = + Modes.stat_ph_fixed = 0; + + for (j = 0; j < MODES_MAX_BITERRORS; j++) { + Modes.stat_ph_bit_fix[j] = 0; + Modes.stat_bit_fix[j] = 0; + } +} + + +// +//========================================================================= +// +// This function is called a few times every second by main in order to +// perform tasks we need to do continuously, like accepting new clients +// from the net, refreshing the screen in interactive mode, and so forth +// +void backgroundTasks(void) { + static time_t next_stats; + + if (Modes.net) { + modesReadFromClients(); + } + + // If Modes.aircrafts is not NULL, remove any stale aircraft + if (Modes.aircrafts) { + interactiveRemoveStaleAircrafts(); + } + + // Refresh screen when in interactive mode + if (Modes.interactive) { + interactiveShowData(); + } + + if (Modes.stats > 0) { + time_t now = time(NULL); + if (now > next_stats) { + if (next_stats != 0) + display_stats(); + next_stats = now + Modes.stats; + } + } +} +// +//========================================================================= +// +int verbose_device_search(char *s) +{ + int i, device_count, device, offset; + char *s2; + char vendor[256], product[256], serial[256]; + device_count = rtlsdr_get_device_count(); + if (!device_count) { + fprintf(stderr, "No supported devices found.\n"); + return -1; + } + fprintf(stderr, "Found %d device(s):\n", device_count); + for (i = 0; i < device_count; i++) { + rtlsdr_get_device_usb_strings(i, vendor, product, serial); + fprintf(stderr, " %d: %s, %s, SN: %s\n", i, vendor, product, serial); + } + fprintf(stderr, "\n"); + /* does string look like raw id number */ + device = (int)strtol(s, &s2, 0); + if (s2[0] == '\0' && device >= 0 && device < device_count) { + fprintf(stderr, "Using device %d: %s\n", + device, rtlsdr_get_device_name((uint32_t)device)); + return device; + } + /* does string exact match a serial */ + for (i = 0; i < device_count; i++) { + rtlsdr_get_device_usb_strings(i, vendor, product, serial); + if (strcmp(s, serial) != 0) { + continue;} + device = i; + fprintf(stderr, "Using device %d: %s\n", + device, rtlsdr_get_device_name((uint32_t)device)); + return device; + } + /* does string prefix match a serial */ + for (i = 0; i < device_count; i++) { + rtlsdr_get_device_usb_strings(i, vendor, product, serial); + if (strncmp(s, serial, strlen(s)) != 0) { + continue;} + device = i; + fprintf(stderr, "Using device %d: %s\n", + device, rtlsdr_get_device_name((uint32_t)device)); + return device; + } + /* does string suffix match a serial */ + for (i = 0; i < device_count; i++) { + rtlsdr_get_device_usb_strings(i, vendor, product, serial); + offset = strlen(serial) - strlen(s); + if (offset < 0) { + continue;} + if (strncmp(s, serial+offset, strlen(s)) != 0) { + continue;} + device = i; + fprintf(stderr, "Using device %d: %s\n", + device, rtlsdr_get_device_name((uint32_t)device)); + return device; + } + fprintf(stderr, "No matching devices found.\n"); + return -1; +} +// +//========================================================================= +// +int main(int argc, char **argv) { + int j; + + // Set sane defaults + modesInitConfig(); + 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],"--device-index") && more) { + Modes.dev_index = verbose_device_search(argv[++j]); + } else if (!strcmp(argv[j],"--gain") && more) { + Modes.gain = (int) (atof(argv[++j])*10); // Gain is in tens of DBs + } else if (!strcmp(argv[j],"--enable-agc")) { + Modes.enable_agc++; + } else if (!strcmp(argv[j],"--freq") && more) { + Modes.freq = (int) strtoll(argv[++j],NULL,10); + } else if (!strcmp(argv[j],"--ifile") && more) { + Modes.filename = strdup(argv[++j]); + } else if (!strcmp(argv[j],"--fix")) { + Modes.nfix_crc = 1; + } else if (!strcmp(argv[j],"--no-fix")) { + Modes.nfix_crc = 0; + } else if (!strcmp(argv[j],"--no-crc-check")) { + Modes.check_crc = 0; + } else if (!strcmp(argv[j],"--phase-enhance")) { + Modes.phase_enhance = 1; + } else if (!strcmp(argv[j],"--raw")) { + Modes.raw = 1; + } else if (!strcmp(argv[j],"--net")) { + Modes.net = 1; + } else if (!strcmp(argv[j],"--modeac")) { + Modes.mode_ac = 1; + } else if (!strcmp(argv[j],"--net-beast")) { + Modes.beast = 1; + } else if (!strcmp(argv[j],"--net-only")) { + Modes.net = 1; + Modes.net_only = 1; + } else if (!strcmp(argv[j],"--net-heartbeat") && more) { + Modes.net_heartbeat_rate = atoi(argv[++j]) * 15; + } else if (!strcmp(argv[j],"--net-ro-size") && more) { + Modes.net_output_raw_size = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--net-ro-rate") && more) { + Modes.net_output_raw_rate = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--net-ro-port") && more) { + if (Modes.beast) // Required for legacy backward compatibility + {Modes.net_output_beast_port = atoi(argv[++j]);;} + else + {Modes.net_output_raw_port = atoi(argv[++j]);} + } else if (!strcmp(argv[j],"--net-ri-port") && more) { + Modes.net_input_raw_port = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--net-bo-port") && more) { + Modes.net_output_beast_port = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--net-bi-port") && more) { + Modes.net_input_beast_port = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--net-bind-address") && more) { + Modes.net_bind_address = strdup(argv[++j]); + } else if (!strcmp(argv[j],"--net-http-port") && more) { + Modes.net_http_port = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--net-sbs-port") && more) { + Modes.net_output_sbs_port = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--net-buffer") && more) { + Modes.net_sndbuf_size = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--onlyaddr")) { + Modes.onlyaddr = 1; + } else if (!strcmp(argv[j],"--metric")) { + Modes.metric = 1; + } else if (!strcmp(argv[j],"--aggressive")) { + Modes.nfix_crc = MODES_MAX_BITERRORS; + } else if (!strcmp(argv[j],"--interactive")) { + Modes.interactive = 1; + } else if (!strcmp(argv[j],"--interactive-rows") && more) { + Modes.interactive_rows = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--interactive-ttl") && more) { + Modes.interactive_display_ttl = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--lat") && more) { + Modes.fUserLat = atof(argv[++j]); + } else if (!strcmp(argv[j],"--lon") && more) { + Modes.fUserLon = atof(argv[++j]); + } else if (!strcmp(argv[j],"--debug") && more) { + char *f = argv[++j]; + while(*f) { + switch(*f) { + case 'D': Modes.debug |= MODES_DEBUG_DEMOD; break; + case 'd': Modes.debug |= MODES_DEBUG_DEMODERR; break; + case 'C': Modes.debug |= MODES_DEBUG_GOODCRC; break; + case 'c': Modes.debug |= MODES_DEBUG_BADCRC; break; + case 'p': Modes.debug |= MODES_DEBUG_NOPREAMBLE; break; + case 'n': Modes.debug |= MODES_DEBUG_NET; break; + case 'j': Modes.debug |= MODES_DEBUG_JS; break; + default: + fprintf(stderr, "Unknown debugging flag: %c\n", *f); + exit(1); + break; + } + f++; + } + } else if (!strcmp(argv[j],"--stats")) { + Modes.stats = -1; + } else if (!strcmp(argv[j],"--stats-every") && more) { + Modes.stats = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--snip") && more) { + snipMode(atoi(argv[++j])); + exit(0); + } else if (!strcmp(argv[j],"--help")) { + showHelp(); + exit(0); + } else if (!strcmp(argv[j],"--ppm") && more) { + Modes.ppm_error = atoi(argv[++j]); + } else if (!strcmp(argv[j],"--quiet")) { + Modes.quiet = 1; + } else if (!strcmp(argv[j],"--mlat")) { + Modes.mlat = 1; + } else if (!strcmp(argv[j],"--interactive-rtl1090")) { + Modes.interactive = 1; + Modes.interactive_rtl1090 = 1; + } else { + fprintf(stderr, + "Unknown or not enough arguments for option '%s'.\n\n", + argv[j]); + showHelp(); + exit(1); + } + } + +#ifdef _WIN32 + // Try to comply with the Copyright license conditions for binary distribution + if (!Modes.quiet) {showCopyright();} +#endif + +#ifndef _WIN32 + // Setup for SIGWINCH for handling lines + if (Modes.interactive) {signal(SIGWINCH, sigWinchCallback);} +#endif + + // Initialization + modesInit(); + + if (Modes.net_only) { + fprintf(stderr,"Net-only mode, no RTL device or file open.\n"); + } else if (Modes.filename == NULL) { + modesInitRTLSDR(); + } else { + if (Modes.filename[0] == '-' && Modes.filename[1] == '\0') { + Modes.fd = STDIN_FILENO; + } else if ((Modes.fd = open(Modes.filename, +#ifdef _WIN32 + (O_RDONLY | O_BINARY) +#else + (O_RDONLY) +#endif + )) == -1) { + perror("Opening data file"); + exit(1); + } + } + if (Modes.net) modesInitNet(); + + // If the user specifies --net-only, just run in order to serve network + // clients without reading data from the RTL device + while (Modes.net_only) { + if (Modes.exit) exit(0); // If we exit net_only nothing further in main() + backgroundTasks(); + usleep(100000); + } + + // Create the thread that will read the data from the device. + pthread_create(&Modes.reader_thread, NULL, readerThreadEntryPoint, NULL); + pthread_mutex_lock(&Modes.data_mutex); + + while (Modes.exit == 0) { + + if (Modes.iDataReady == 0) { + pthread_cond_wait(&Modes.data_cond,&Modes.data_mutex); // This unlocks Modes.data_mutex, and waits for Modes.data_cond + continue; // Once (Modes.data_cond) occurs, it locks Modes.data_mutex + } + + // Modes.data_mutex is Locked, and (Modes.iDataReady != 0) + if (Modes.iDataReady) { // Check we have new data, just in case!! + + Modes.iDataOut &= (MODES_ASYNC_BUF_NUMBER-1); // Just incase + + // Translate the next lot of I/Q samples into Modes.magnitude + computeMagnitudeVector(Modes.pData[Modes.iDataOut]); + + Modes.stSystemTimeBlk = Modes.stSystemTimeRTL[Modes.iDataOut]; + + // Update the input buffer pointer queue + Modes.iDataOut = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataOut + 1); + Modes.iDataReady = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataIn - Modes.iDataOut); + + // If we lost some blocks, correct the timestamp + if (Modes.iDataLost) { + Modes.timestampBlk += (MODES_ASYNC_BUF_SAMPLES * 6 * Modes.iDataLost); + Modes.stat_blocks_dropped += Modes.iDataLost; + Modes.iDataLost = 0; + } + + // It's safe to release the lock now + pthread_cond_signal (&Modes.data_cond); + pthread_mutex_unlock(&Modes.data_mutex); + + // Process data after releasing the lock, so that the capturing + // thread can read data while we perform computationally expensive + // stuff at the same time. + detectModeS(Modes.magnitude, MODES_ASYNC_BUF_SAMPLES); + + // Update the timestamp ready for the next block + Modes.timestampBlk += (MODES_ASYNC_BUF_SAMPLES*6); + Modes.stat_blocks_processed++; + } else { + pthread_cond_signal (&Modes.data_cond); + pthread_mutex_unlock(&Modes.data_mutex); + } + + backgroundTasks(); + pthread_mutex_lock(&Modes.data_mutex); + } + + // If --stats were given, print statistics + if (Modes.stats) { + display_stats(); + } + + if (Modes.filename == NULL) { + rtlsdr_cancel_async(Modes.dev); // Cancel rtlsdr_read_async will cause data input thread to terminate cleanly + rtlsdr_close(Modes.dev); + } + pthread_cond_destroy(&Modes.data_cond); // Thread cleanup + pthread_mutex_destroy(&Modes.data_mutex); + pthread_join(Modes.reader_thread,NULL); // Wait on reader thread exit +#ifndef _WIN32 + pthread_exit(0); +#else + return (0); +#endif +} +// +//========================================================================= +// diff --git a/sdl1090/dump1090.h b/sdl1090/dump1090.h new file mode 100644 index 0000000..9ad4de0 --- /dev/null +++ b/sdl1090/dump1090.h @@ -0,0 +1,466 @@ +// dump1090, a Mode S messages decoder for RTLSDR devices. +// +// Copyright (C) 2012 by Salvatore Sanfilippo +// +// 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 __DUMP1090_H +#define __DUMP1090_H + +// File Version number +// ==================== +// Format is : MajorVer.MinorVer.DayMonth.Year" +// MajorVer changes only with significant changes +// 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.10.3010.14" + +// ============================= Include files ========================== + +#ifndef _WIN32 + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include "rtl-sdr.h" + #include "anet.h" +#else + #include "winstubs.h" //Put everything Windows specific in here + #include "rtl-sdr.h" + #include "anet.h" +#endif + +// ============================= #defines =============================== +// +// If you have a valid coaa.h, these values will come from it. If not, +// then you can enter your own values in the #else section here +// +#ifdef USER_LATITUDE + #define MODES_USER_LATITUDE_DFLT (USER_LATITUDE) + #define MODES_USER_LONGITUDE_DFLT (USER_LONGITUDE) +#else + #define MODES_USER_LATITUDE_DFLT (0.0) + #define MODES_USER_LONGITUDE_DFLT (0.0) +#endif + +#define MODES_DEFAULT_PPM 52 +#define MODES_DEFAULT_RATE 2000000 +#define MODES_DEFAULT_FREQ 1090000000 +#define MODES_DEFAULT_WIDTH 1000 +#define MODES_DEFAULT_HEIGHT 700 +#define MODES_ASYNC_BUF_NUMBER 16 +#define MODES_ASYNC_BUF_SIZE (16*16384) // 256k +#define MODES_ASYNC_BUF_SAMPLES (MODES_ASYNC_BUF_SIZE / 2) // Each sample is 2 bytes +#define MODES_AUTO_GAIN -100 // Use automatic gain +#define MODES_MAX_GAIN 999999 // Use max available gain +#define MODES_MSG_SQUELCH_LEVEL 0x02FF // Average signal strength limit +#define MODES_MSG_ENCODER_ERRS 3 // Maximum number of encoding errors + +// When changing, change also fixBitErrors() and modesInitErrorTable() !! +#define MODES_MAX_BITERRORS 2 // Global max for fixable bit erros + +#define MODEAC_MSG_SAMPLES (25 * 2) // include up to the SPI bit +#define MODEAC_MSG_BYTES 2 +#define MODEAC_MSG_SQUELCH_LEVEL 0x07FF // Average signal strength limit +#define MODEAC_MSG_FLAG (1<<0) +#define MODEAC_MSG_MODES_HIT (1<<1) +#define MODEAC_MSG_MODEA_HIT (1<<2) +#define MODEAC_MSG_MODEC_HIT (1<<3) +#define MODEAC_MSG_MODEA_ONLY (1<<4) +#define MODEAC_MSG_MODEC_OLD (1<<5) + +#define MODES_PREAMBLE_US 8 // microseconds = bits +#define MODES_PREAMBLE_SAMPLES (MODES_PREAMBLE_US * 2) +#define MODES_PREAMBLE_SIZE (MODES_PREAMBLE_SAMPLES * sizeof(uint16_t)) +#define MODES_LONG_MSG_BYTES 14 +#define MODES_SHORT_MSG_BYTES 7 +#define MODES_LONG_MSG_BITS (MODES_LONG_MSG_BYTES * 8) +#define MODES_SHORT_MSG_BITS (MODES_SHORT_MSG_BYTES * 8) +#define MODES_LONG_MSG_SAMPLES (MODES_LONG_MSG_BITS * 2) +#define MODES_SHORT_MSG_SAMPLES (MODES_SHORT_MSG_BITS * 2) +#define MODES_LONG_MSG_SIZE (MODES_LONG_MSG_SAMPLES * sizeof(uint16_t)) +#define MODES_SHORT_MSG_SIZE (MODES_SHORT_MSG_SAMPLES * sizeof(uint16_t)) + +#define MODES_RAWOUT_BUF_SIZE (1500) +#define MODES_RAWOUT_BUF_FLUSH (MODES_RAWOUT_BUF_SIZE - 200) +#define MODES_RAWOUT_BUF_RATE (1000) // 1000 * 64mS = 1 Min approx + +#define MODES_ICAO_CACHE_LEN 1024 // Power of two required +#define MODES_ICAO_CACHE_TTL 60 // Time to live of cached addresses +#define MODES_UNIT_FEET 0 +#define MODES_UNIT_METERS 1 + +#define MODES_USER_LATLON_VALID (1<<0) + +#define MODES_ACFLAGS_LATLON_VALID (1<<0) // Aircraft Lat/Lon is decoded +#define MODES_ACFLAGS_ALTITUDE_VALID (1<<1) // Aircraft altitude is known +#define MODES_ACFLAGS_HEADING_VALID (1<<2) // Aircraft heading is known +#define MODES_ACFLAGS_SPEED_VALID (1<<3) // Aircraft speed is known +#define MODES_ACFLAGS_VERTRATE_VALID (1<<4) // Aircraft vertical rate is known +#define MODES_ACFLAGS_SQUAWK_VALID (1<<5) // Aircraft Mode A Squawk is known +#define MODES_ACFLAGS_CALLSIGN_VALID (1<<6) // Aircraft Callsign Identity +#define MODES_ACFLAGS_EWSPEED_VALID (1<<7) // Aircraft East West Speed is known +#define MODES_ACFLAGS_NSSPEED_VALID (1<<8) // Aircraft North South Speed is known +#define MODES_ACFLAGS_AOG (1<<9) // Aircraft is On the Ground +#define MODES_ACFLAGS_LLEVEN_VALID (1<<10) // Aircraft Even Lot/Lon is known +#define MODES_ACFLAGS_LLODD_VALID (1<<11) // Aircraft Odd Lot/Lon is known +#define MODES_ACFLAGS_AOG_VALID (1<<12) // MODES_ACFLAGS_AOG is valid +#define MODES_ACFLAGS_FS_VALID (1<<13) // Aircraft Flight Status is known +#define MODES_ACFLAGS_NSEWSPD_VALID (1<<14) // Aircraft EW and NS Speed is known +#define MODES_ACFLAGS_LATLON_REL_OK (1<<15) // Indicates it's OK to do a relative CPR + +#define MODES_ACFLAGS_LLEITHER_VALID (MODES_ACFLAGS_LLEVEN_VALID | MODES_ACFLAGS_LLODD_VALID) +#define MODES_ACFLAGS_LLBOTH_VALID (MODES_ACFLAGS_LLEVEN_VALID | MODES_ACFLAGS_LLODD_VALID) +#define MODES_ACFLAGS_AOG_GROUND (MODES_ACFLAGS_AOG_VALID | MODES_ACFLAGS_AOG) + +#define MODES_DEBUG_DEMOD (1<<0) +#define MODES_DEBUG_DEMODERR (1<<1) +#define MODES_DEBUG_BADCRC (1<<2) +#define MODES_DEBUG_GOODCRC (1<<3) +#define MODES_DEBUG_NOPREAMBLE (1<<4) +#define MODES_DEBUG_NET (1<<5) +#define MODES_DEBUG_JS (1<<6) + +// When debug is set to MODES_DEBUG_NOPREAMBLE, the first sample must be +// at least greater than a given level for us to dump the signal. +#define MODES_DEBUG_NOPREAMBLE_LEVEL 25 + +#define MODES_INTERACTIVE_REFRESH_TIME 250 // Milliseconds +#define MODES_INTERACTIVE_ROWS 22 // Rows on screen +#define MODES_INTERACTIVE_DELETE_TTL 300 // Delete from the list after 300 seconds +#define MODES_INTERACTIVE_DISPLAY_TTL 60 // Delete from display after 60 seconds + +#define MODES_NET_HEARTBEAT_RATE 900 // Each block is approx 65mS - default is > 1 min + +#define MODES_NET_SERVICES_NUM 6 +#define MODES_NET_INPUT_RAW_PORT 30001 +#define MODES_NET_OUTPUT_RAW_PORT 30002 +#define MODES_NET_OUTPUT_SBS_PORT 30003 +#define MODES_NET_INPUT_BEAST_PORT 30004 +#define MODES_NET_OUTPUT_BEAST_PORT 30005 +#define MODES_NET_HTTP_PORT 8080 +#define MODES_CLIENT_BUF_SIZE 1024 +#define MODES_NET_SNDBUF_SIZE (1024*64) +#define MODES_NET_SNDBUF_MAX (7) + +#ifndef HTMLPATH +#define HTMLPATH "./public_html" // default path for gmap.html etc +#endif + +#define MODES_NOTUSED(V) ((void) V) + +//======================== structure declarations ========================= + +// Structure used to describe a networking client +struct client { + struct client* next; // Pointer to next client + int fd; // File descriptor + int service; // TCP port the client is connected to + int buflen; // Amount of data on buffer + char buf[MODES_CLIENT_BUF_SIZE+1]; // Read buffer +}; + +// Structure used to describe an aircraft in iteractive mode +struct aircraft { + uint32_t addr; // ICAO address + char flight[16]; // Flight number + unsigned char signalLevel[8]; // Last 8 Signal Amplitudes + int altitude; // Altitude + int speed; // Velocity + int track; // Angle of flight + int vert_rate; // Vertical rate. + time_t seen; // Time at which the last packet was received + time_t seenLatLon; // Time at which the last lat long was calculated + uint64_t timestamp; // Timestamp at which the last packet was received + uint64_t timestampLatLon;// Timestamp at which the last lat long was calculated + long messages; // Number of Mode S messages received + int modeA; // Squawk + int modeC; // Altitude + long modeAcount; // Mode A Squawk hit Count + long modeCcount; // Mode C Altitude hit Count + int modeACflags; // Flags for mode A/C recognition + + // Encoded latitude and longitude as extracted by odd and even CPR encoded messages + int odd_cprlat; + int odd_cprlon; + int even_cprlat; + int even_cprlon; + uint64_t odd_cprtime; + uint64_t even_cprtime; + double lat, lon; // Coordinated obtained from CPR encoded data + int bFlags; // Flags related to valid fields in this structure + struct aircraft *next; // Next aircraft in our linked list +}; + +struct stDF { + struct stDF *pNext; // Pointer to next item in the linked list + struct stDF *pPrev; // Pointer to previous item in the linked list + struct aircraft *pAircraft; // Pointer to the Aircraft structure for this DF + time_t seen; // Dos/UNIX Time at which the this packet was received + uint64_t llTimestamp; // Timestamp at which the this packet was received + uint32_t addr; // Timestamp at which the this packet was received + unsigned char msg[MODES_LONG_MSG_BYTES]; // the binary +} tDF; + +// Program global state +struct { // Internal state + pthread_t reader_thread; + + pthread_mutex_t data_mutex; // Mutex to synchronize buffer access + pthread_cond_t data_cond; // Conditional variable associated + uint16_t *pData [MODES_ASYNC_BUF_NUMBER]; // Raw IQ sample buffers from RTL + struct timeb stSystemTimeRTL[MODES_ASYNC_BUF_NUMBER]; // System time when RTL passed us this block + int iDataIn; // Fifo input pointer + int iDataOut; // Fifo output pointer + int iDataReady; // Fifo content count + int iDataLost; // Count of missed buffers + + uint16_t *pFileData; // Raw IQ samples buffer (from a File) + uint16_t *magnitude; // Magnitude vector + uint64_t timestampBlk; // Timestamp of the start of the current block + struct timeb stSystemTimeBlk; // System time when RTL passed us currently processing this block + int fd; // --ifile option file descriptor + uint32_t *icao_cache; // Recently seen ICAO addresses cache + uint16_t *maglut; // I/Q -> Magnitude lookup table + int exit; // Exit from the main loop when true + + // RTLSDR + int dev_index; + int gain; + int enable_agc; + rtlsdr_dev_t *dev; + int freq; + int ppm_error; + + // Networking + char aneterr[ANET_ERR_LEN]; + struct client *clients; // Our clients + int sbsos; // SBS output listening socket + int ros; // Raw output listening socket + int ris; // Raw input listening socket + int bos; // Beast output listening socket + int bis; // Beast input listening socket + int https; // HTTP listening socket + char *rawOut; // Buffer for building raw output data + int rawOutUsed; // How much of the buffer is currently used + char *beastOut; // Buffer for building beast output data + int beastOutUsed; // How much if the buffer is currently used +#ifdef _WIN32 + WSADATA wsaData; // Windows socket initialisation +#endif + + // Configuration + char *filename; // Input form file, --ifile option + int phase_enhance; // Enable phase enhancement if true + int nfix_crc; // Number of crc bit error(s) to correct + int check_crc; // Only display messages with good CRC + int raw; // Raw output format + int beast; // Beast binary format output + int mode_ac; // Enable decoding of SSR Modes A & C + int debug; // Debugging mode + int net; // Enable networking + int net_only; // Enable just networking + int net_heartbeat_count; // TCP heartbeat counter + int net_heartbeat_rate; // TCP heartbeat rate + int net_output_sbs_port; // SBS output TCP port + int net_output_raw_size; // Minimum Size of the output raw data + int net_output_raw_rate; // Rate (in 64mS increments) of output raw data + int net_output_raw_rate_count; // Rate (in 64mS increments) of output raw data + int net_output_raw_port; // Raw output TCP port + int net_input_raw_port; // Raw input TCP port + int net_output_beast_port; // Beast output TCP port + int net_input_beast_port; // Beast input TCP port + char *net_bind_address; // Bind address + int net_http_port; // HTTP port + int net_sndbuf_size; // TCP output buffer size (64Kb * 2^n) + int quiet; // Suppress stdout + int interactive; // Interactive mode + int interactive_rows; // Interactive mode: max number of rows + int interactive_display_ttl; // Interactive mode: TTL display + int interactive_delete_ttl; // Interactive mode: TTL before deletion + int stats; // Print stats at exit in --ifile mode + int onlyaddr; // Print only ICAO addresses + int metric; // Use metric units + int mlat; // Use Beast ascii format for raw data output, i.e. @...; iso *...; + int interactive_rtl1090; // flight table in interactive mode is formatted like RTL1090 + + // User details + double fUserLat; // Users receiver/antenna lat/lon needed for initial surface location + double fUserLon; // Users receiver/antenna lat/lon needed for initial surface location + int bUserFlags; // Flags relating to the user details + + // Interactive mode + struct aircraft *aircrafts; + uint64_t interactive_last_update; // Last screen update in milliseconds + time_t last_cleanup_time; // Last cleanup time in seconds + + // DF List mode + int bEnableDFLogging; // Set to enable DF Logging + pthread_mutex_t pDF_mutex; // Mutex to synchronize pDF access + struct stDF *pDF; // Pointer to DF list + + // Statistics + unsigned int stat_valid_preamble; + unsigned int stat_demodulated0; + unsigned int stat_demodulated1; + unsigned int stat_demodulated2; + unsigned int stat_demodulated3; + unsigned int stat_goodcrc; + unsigned int stat_badcrc; + unsigned int stat_fixed; + + // Histogram of fixed bit errors: index 0 for single bit erros, + // index 1 for double bit errors etc. + unsigned int stat_bit_fix[MODES_MAX_BITERRORS]; + + unsigned int stat_http_requests; + unsigned int stat_sbs_connections; + unsigned int stat_raw_connections; + unsigned int stat_beast_connections; + unsigned int stat_out_of_phase; + unsigned int stat_ph_demodulated0; + unsigned int stat_ph_demodulated1; + unsigned int stat_ph_demodulated2; + unsigned int stat_ph_demodulated3; + unsigned int stat_ph_goodcrc; + unsigned int stat_ph_badcrc; + unsigned int stat_ph_fixed; + // Histogram of fixed bit errors: index 0 for single bit erros, + // index 1 for double bit errors etc. + unsigned int stat_ph_bit_fix[MODES_MAX_BITERRORS]; + + unsigned int stat_DF_Len_Corrected; + unsigned int stat_DF_Type_Corrected; + unsigned int stat_ModeAC; + + unsigned int stat_blocks_processed; + unsigned int stat_blocks_dropped; +} Modes; + +// The struct we use to store information about a decoded message. +struct modesMessage { + // Generic fields + unsigned char msg[MODES_LONG_MSG_BYTES]; // Binary message. + int msgbits; // Number of bits in message + int msgtype; // Downlink format # + int crcok; // True if CRC was valid + uint32_t crc; // Message CRC + int correctedbits; // No. of bits corrected + char corrected[MODES_MAX_BITERRORS]; // corrected bit positions + uint32_t addr; // ICAO Address from bytes 1 2 and 3 + int phase_corrected; // True if phase correction was applied + uint64_t timestampMsg; // Timestamp of the message + int remote; // If set this message is from a remote station + unsigned char signalLevel; // Signal Amplitude + + // DF 11 + int ca; // Responder capabilities + int iid; + + // DF 17, DF 18 + int metype; // Extended squitter message type. + int mesub; // Extended squitter message subtype. + int heading; // Reported by aircraft, or computed from from EW and NS velocity + int raw_latitude; // Non decoded latitude. + int raw_longitude; // Non decoded longitude. + double fLat; // Coordinates obtained from CPR encoded data if/when decoded + double fLon; // Coordinates obtained from CPR encoded data if/when decoded + char flight[16]; // 8 chars flight number. + int ew_velocity; // E/W velocity. + int ns_velocity; // N/S velocity. + int vert_rate; // Vertical rate. + int velocity; // Reported by aircraft, or computed from from EW and NS velocity + + // DF4, DF5, DF20, DF21 + int fs; // Flight status for DF4,5,20,21 + int modeA; // 13 bits identity (Squawk). + + // Fields used by multiple message types. + int altitude; + int unit; + int bFlags; // Flags related to fields in this structure +}; + +// ======================== function declarations ========================= + +#ifdef __cplusplus +extern "C" { +#endif + +// +// Functions exported from mode_ac.c +// +int detectModeA (uint16_t *m, struct modesMessage *mm); +void decodeModeAMessage(struct modesMessage *mm, int ModeA); +int ModeAToModeC (unsigned int ModeA); + +// +// Functions exported from mode_s.c +// +void detectModeS (uint16_t *m, uint32_t mlen); +void decodeModesMessage (struct modesMessage *mm, unsigned char *msg); +void displayModesMessage(struct modesMessage *mm); +void useModesMessage (struct modesMessage *mm); +void computeMagnitudeVector(uint16_t *pData); +int decodeCPR (struct aircraft *a, int fflag, int surface); +int decodeCPRrelative (struct aircraft *a, int fflag, int surface); +void modesInitErrorInfo (); +// +// Functions exported from interactive.c +// +struct aircraft* interactiveReceiveData(struct modesMessage *mm); +void interactiveShowData(void); +void interactiveRemoveStaleAircrafts(void); +int decodeBinMessage (struct client *c, char *p); +struct aircraft *interactiveFindAircraft(uint32_t addr); +struct stDF *interactiveFindDF (uint32_t addr); + +// +// Functions exported from net_io.c +// +void modesInitNet (void); +void modesReadFromClients (void); +void modesSendAllClients (int service, void *msg, int len); +void modesQueueOutput (struct modesMessage *mm); +void modesReadFromClient(struct client *c, char *sep, int(*handler)(struct client *, char *)); + +#ifdef __cplusplus +} +#endif + +#endif // __DUMP1090_H diff --git a/sdl1090/font.c b/sdl1090/font.c new file mode 100755 index 0000000..380bfc9 --- /dev/null +++ b/sdl1090/font.c @@ -0,0 +1,59 @@ +#include "font.h" + +TTF_Font *loadFont(char *name, int size) +{ + /* Use SDL_TTF to load the font at the specified size */ + + TTF_Font *font = TTF_OpenFont(name, size); + + if (font == NULL) + { + printf("Failed to open Font %s: %s\n", name, TTF_GetError()); + + exit(1); + } + + return font; +} + +void closeFont(TTF_Font *font) +{ + /* Close the font once we're done with it */ + + if (font != NULL) + { + TTF_CloseFont(font); + } +} + +void drawString(char * text, int x, int y, TTF_Font *font, SDL_Color color) +{ + SDL_Rect dest; + SDL_Surface *surface; + + // surface = TTF_RenderUTF8_Shaded(font, text, foregroundColor, backgroundColor); + surface = TTF_RenderText_Solid(font, text, color); + + if (surface == NULL) + { + printf("Couldn't create String: %s\n", SDL_GetError()); + + return; + } + + SDL_Texture* Message = SDL_CreateTextureFromSurface(game.renderer, surface); //now you can convert it into a texture + + SDL_Rect Message_rect; //create a rect + Message_rect.x = x; //controls the rect's x coordinate + Message_rect.y = y; // controls the rect's y coordinte + Message_rect.w = surface->w; // controls the width of the rect + Message_rect.h = surface->h; // controls the height of the rect + + SDL_RenderCopy(game.renderer, Message, NULL, &Message_rect); //you put the renderer's name first, the Message, the crop size(you can ignore this if you don't want to dabble with cropping), and the rect which is the size and coordinate of your texture + + + SDL_FreeSurface(surface); + +} + + diff --git a/sdl1090/font.h b/sdl1090/font.h new file mode 100755 index 0000000..4447612 --- /dev/null +++ b/sdl1090/font.h @@ -0,0 +1,3 @@ +#include "structs.h" + +extern Game game; diff --git a/sdl1090/init.c b/sdl1090/init.c new file mode 100644 index 0000000..00884da --- /dev/null +++ b/sdl1090/init.c @@ -0,0 +1,56 @@ +#include "init.h" + +extern void closeFont(TTF_Font *); + + +void init(char *title) +{ + /* Initialise SDL */ + + if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_EVENTS) < 0) + { + printf("Could not initialize SDL: %s\n", SDL_GetError()); + + exit(1); + } + + /* Initialise SDL_TTF */ + + if (TTF_Init() < 0) + { + printf("Couldn't initialize SDL TTF: %s\n", SDL_GetError()); + + exit(1); + } + + + if (SDL_CreateWindowAndRenderer(SCREEN_WIDTH, SCREEN_HEIGHT, 0, &(game.window), &(game.renderer)) < 0) + { + printf("Couldn't initialize Renderer: %s\n", SDL_GetError()); + + exit(1); + } + + /* Set the screen title */ + + SDL_SetWindowTitle(game.window,title); +} + +void cleanup() +{ + /* Close the font */ + + closeFont(game.font); + + /* Close SDL_TTF */ + + TTF_Quit(); + + + SDL_DestroyWindow(game.window); + + + /* Shut down SDL */ + + SDL_Quit(); +} diff --git a/sdl1090/init.h b/sdl1090/init.h new file mode 100644 index 0000000..4447612 --- /dev/null +++ b/sdl1090/init.h @@ -0,0 +1,3 @@ +#include "structs.h" + +extern Game game; diff --git a/sdl1090/input.c b/sdl1090/input.c new file mode 100644 index 0000000..30cf050 --- /dev/null +++ b/sdl1090/input.c @@ -0,0 +1,32 @@ +#include "input.h" + +void getInput() +{ + SDL_Event event; + + /* Loop through waiting messages and process them */ + + while (SDL_PollEvent(&event)) + { + switch (event.type) + { + /* Closing the Window or pressing Escape will exit the program */ + + case SDL_QUIT: + exit(0); + break; + + case SDL_KEYDOWN: + switch (event.key.keysym.sym) + { + case SDLK_ESCAPE: + exit(0); + break; + + default: + break; + } + break; + } + } +} \ No newline at end of file diff --git a/sdl1090/input.h b/sdl1090/input.h new file mode 100644 index 0000000..31c69c6 --- /dev/null +++ b/sdl1090/input.h @@ -0,0 +1 @@ +#include "defs.h" diff --git a/sdl1090/interactive.c b/sdl1090/interactive.c new file mode 100644 index 0000000..fe8dc0d --- /dev/null +++ b/sdl1090/interactive.c @@ -0,0 +1,596 @@ +// dump1090, a Mode S messages decoder for RTLSDR devices. +// +// Copyright (C) 2012 by Salvatore Sanfilippo +// +// 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 "dump1090.h" +#include "structs.h" + +Game game; +extern void drawPlaneHeading(int , int , double, int, char *); +extern void drawPlane(int , int, int); +extern void drawGrid(); + + +// +// ============================= Utility functions ========================== +// +static uint64_t mstime(void) { + struct timeval tv; + uint64_t mst; + + gettimeofday(&tv, NULL); + mst = ((uint64_t)tv.tv_sec)*1000; + mst += tv.tv_usec/1000; + return mst; +} +// +//========================================================================= +// +// Add a new DF structure to the interactive mode linked list +// +void interactiveCreateDF(struct aircraft *a, struct modesMessage *mm) { + struct stDF *pDF = (struct stDF *) malloc(sizeof(*pDF)); + + if (pDF) { + // Default everything to zero/NULL + memset(pDF, 0, sizeof(*pDF)); + + // Now initialise things + pDF->seen = a->seen; + pDF->llTimestamp = mm->timestampMsg; + pDF->addr = mm->addr; + pDF->pAircraft = a; + memcpy(pDF->msg, mm->msg, MODES_LONG_MSG_BYTES); + + if (!pthread_mutex_lock(&Modes.pDF_mutex)) { + if ((pDF->pNext = Modes.pDF)) { + Modes.pDF->pPrev = pDF; + } + Modes.pDF = pDF; + pthread_mutex_unlock(&Modes.pDF_mutex); + } else { + free(pDF); + } + } +} +// +// Remove stale DF's from the interactive mode linked list +// +void interactiveRemoveStaleDF(time_t now) { + struct stDF *pDF = NULL; + struct stDF *prev = NULL; + + // Only fiddle with the DF list if we gain possession of the mutex + // If we fail to get the mutex we'll get another chance to tidy the + // DF list in a second or so. + if (!pthread_mutex_trylock(&Modes.pDF_mutex)) { + pDF = Modes.pDF; + while(pDF) { + if ((now - pDF->seen) > Modes.interactive_delete_ttl) { + if (Modes.pDF == pDF) { + Modes.pDF = NULL; + } else { + prev->pNext = NULL; + } + + // All DF's in the list from here onwards will be time + // expired, so delete them all + while (pDF) { + prev = pDF; pDF = pDF->pNext; + free(prev); + } + + } else { + prev = pDF; pDF = pDF->pNext; + } + } + pthread_mutex_unlock (&Modes.pDF_mutex); + } +} + +struct stDF *interactiveFindDF(uint32_t addr) { + struct stDF *pDF = NULL; + + if (!pthread_mutex_lock(&Modes.pDF_mutex)) { + pDF = Modes.pDF; + while(pDF) { + if (pDF->addr == addr) { + pthread_mutex_unlock (&Modes.pDF_mutex); + return (pDF); + } + pDF = pDF->pNext; + } + pthread_mutex_unlock (&Modes.pDF_mutex); + } + return (NULL); +} +// +//========================= Interactive mode =============================== +// +// Return a new aircraft structure for the interactive mode linked list +// of aircraft +// +struct aircraft *interactiveCreateAircraft(struct modesMessage *mm) { + struct aircraft *a = (struct aircraft *) malloc(sizeof(*a)); + + // Default everything to zero/NULL + memset(a, 0, sizeof(*a)); + + // Now initialise things that should not be 0/NULL to their defaults + a->addr = mm->addr; + a->lat = a->lon = 0.0; + memset(a->signalLevel, mm->signalLevel, 8); // First time, initialise everything + // to the first signal strength + + // mm->msgtype 32 is used to represent Mode A/C. These values can never change, so + // set them once here during initialisation, and don't bother to set them every + // time this ModeA/C is received again in the future + if (mm->msgtype == 32) { + int modeC = ModeAToModeC(mm->modeA | mm->fs); + a->modeACflags = MODEAC_MSG_FLAG; + if (modeC < -12) { + a->modeACflags |= MODEAC_MSG_MODEA_ONLY; + } else { + mm->altitude = modeC * 100; + mm->bFlags |= MODES_ACFLAGS_ALTITUDE_VALID; + } + } + return (a); +} +// +//========================================================================= +// +// Return the aircraft with the specified address, or NULL if no aircraft +// exists with this address. +// +struct aircraft *interactiveFindAircraft(uint32_t addr) { + struct aircraft *a = Modes.aircrafts; + + while(a) { + if (a->addr == addr) return (a); + a = a->next; + } + return (NULL); +} +// +//========================================================================= +// +// We have received a Mode A or C response. +// +// Search through the list of known Mode-S aircraft and tag them if this Mode A/C +// matches their known Mode S Squawks or Altitudes(+/- 50feet). +// +// A Mode S equipped aircraft may also respond to Mode A and Mode C SSR interrogations. +// We can't tell if this is a Mode A or C, so scan through the entire aircraft list +// looking for matches on Mode A (squawk) and Mode C (altitude). Flag in the Mode S +// records that we have had a potential Mode A or Mode C response from this aircraft. +// +// If an aircraft responds to Mode A then it's highly likely to be responding to mode C +// too, and vice verca. Therefore, once the mode S record is tagged with both a Mode A +// and a Mode C flag, we can be fairly confident that this Mode A/C frame relates to that +// Mode S aircraft. +// +// Mode C's are more likely to clash than Mode A's; There could be several aircraft +// cruising at FL370, but it's less likely (though not impossible) that there are two +// aircraft on the same squawk. Therefore, give precidence to Mode A record matches +// +// Note : It's theoretically possible for an aircraft to have the same value for Mode A +// and Mode C. Therefore we have to check BOTH A AND C for EVERY S. +// +void interactiveUpdateAircraftModeA(struct aircraft *a) { + struct aircraft *b = Modes.aircrafts; + + while(b) { + if ((b->modeACflags & MODEAC_MSG_FLAG) == 0) {// skip any fudged ICAO records + + // If both (a) and (b) have valid squawks... + if ((a->bFlags & b->bFlags) & MODES_ACFLAGS_SQUAWK_VALID) { + // ...check for Mode-A == Mode-S Squawk matches + if (a->modeA == b->modeA) { // If a 'real' Mode-S ICAO exists using this Mode-A Squawk + b->modeAcount = a->messages; + b->modeACflags |= MODEAC_MSG_MODEA_HIT; + a->modeACflags |= MODEAC_MSG_MODEA_HIT; + if ( (b->modeAcount > 0) && + ( (b->modeCcount > 1) + || (a->modeACflags & MODEAC_MSG_MODEA_ONLY)) ) // Allow Mode-A only matches if this Mode-A is invalid Mode-C + {a->modeACflags |= MODEAC_MSG_MODES_HIT;} // flag this ModeA/C probably belongs to a known Mode S + } + } + + // If both (a) and (b) have valid altitudes... + if ((a->bFlags & b->bFlags) & MODES_ACFLAGS_ALTITUDE_VALID) { + // ... check for Mode-C == Mode-S Altitude matches + if ( (a->modeC == b->modeC ) // If a 'real' Mode-S ICAO exists at this Mode-C Altitude + || (a->modeC == b->modeC + 1) // or this Mode-C - 100 ft + || (a->modeC + 1 == b->modeC ) ) { // or this Mode-C + 100 ft + b->modeCcount = a->messages; + b->modeACflags |= MODEAC_MSG_MODEC_HIT; + a->modeACflags |= MODEAC_MSG_MODEC_HIT; + if ( (b->modeAcount > 0) && + (b->modeCcount > 1) ) + {a->modeACflags |= (MODEAC_MSG_MODES_HIT | MODEAC_MSG_MODEC_OLD);} // flag this ModeA/C probably belongs to a known Mode S + } + } + } + b = b->next; + } +} +// +//========================================================================= +// +void interactiveUpdateAircraftModeS() { + struct aircraft *a = Modes.aircrafts; + + while(a) { + int flags = a->modeACflags; + if (flags & MODEAC_MSG_FLAG) { // find any fudged ICAO records + + // clear the current A,C and S hit bits ready for this attempt + a->modeACflags = flags & ~(MODEAC_MSG_MODEA_HIT | MODEAC_MSG_MODEC_HIT | MODEAC_MSG_MODES_HIT); + + interactiveUpdateAircraftModeA(a); // and attempt to match them with Mode-S + } + a = a->next; + } +} +// +//========================================================================= +// +// Receive new messages and populate the interactive mode with more info +// +struct aircraft *interactiveReceiveData(struct modesMessage *mm) { + struct aircraft *a, *aux; + + // Return if (checking crc) AND (not crcok) AND (not fixed) + if (Modes.check_crc && (mm->crcok == 0) && (mm->correctedbits == 0)) + return NULL; + + // Lookup our aircraft or create a new one + a = interactiveFindAircraft(mm->addr); + if (!a) { // If it's a currently unknown aircraft.... + a = interactiveCreateAircraft(mm); // ., create a new record for it, + a->next = Modes.aircrafts; // .. and put it at the head of the list + Modes.aircrafts = a; + } else { + /* If it is an already known aircraft, move it on head + * so we keep aircrafts ordered by received message time. + * + * However move it on head only if at least one second elapsed + * since the aircraft that is currently on head sent a message, + * othewise with multiple aircrafts at the same time we have an + * useless shuffle of positions on the screen. */ + if (0 && Modes.aircrafts != a && (time(NULL) - a->seen) >= 1) { + aux = Modes.aircrafts; + while(aux->next != a) aux = aux->next; + /* Now we are a node before the aircraft to remove. */ + aux->next = aux->next->next; /* removed. */ + /* Add on head */ + a->next = Modes.aircrafts; + Modes.aircrafts = a; + } + } + + a->signalLevel[a->messages & 7] = mm->signalLevel;// replace the 8th oldest signal strength + a->seen = time(NULL); + a->timestamp = mm->timestampMsg; + a->messages++; + + // If a (new) CALLSIGN has been received, copy it to the aircraft structure + if (mm->bFlags & MODES_ACFLAGS_CALLSIGN_VALID) { + memcpy(a->flight, mm->flight, sizeof(a->flight)); + } + + // If a (new) ALTITUDE has been received, copy it to the aircraft structure + if (mm->bFlags & MODES_ACFLAGS_ALTITUDE_VALID) { + if ( (a->modeCcount) // if we've a modeCcount already + && (a->altitude != mm->altitude ) ) // and Altitude has changed +// && (a->modeC != mm->modeC + 1) // and Altitude not changed by +100 feet +// && (a->modeC + 1 != mm->modeC ) ) // and Altitude not changes by -100 feet + { + a->modeCcount = 0; //....zero the hit count + a->modeACflags &= ~MODEAC_MSG_MODEC_HIT; + } + a->altitude = mm->altitude; + a->modeC = (mm->altitude + 49) / 100; + } + + // If a (new) SQUAWK has been received, copy it to the aircraft structure + if (mm->bFlags & MODES_ACFLAGS_SQUAWK_VALID) { + if (a->modeA != mm->modeA) { + a->modeAcount = 0; // Squawk has changed, so zero the hit count + a->modeACflags &= ~MODEAC_MSG_MODEA_HIT; + } + a->modeA = mm->modeA; + } + + // If a (new) HEADING has been received, copy it to the aircraft structure + if (mm->bFlags & MODES_ACFLAGS_HEADING_VALID) { + a->track = mm->heading; + } + + // If a (new) SPEED has been received, copy it to the aircraft structure + if (mm->bFlags & MODES_ACFLAGS_SPEED_VALID) { + a->speed = mm->velocity; + } + + // If a (new) Vertical Descent rate has been received, copy it to the aircraft structure + if (mm->bFlags & MODES_ACFLAGS_VERTRATE_VALID) { + a->vert_rate = mm->vert_rate; + } + + // if the Aircraft has landed or taken off since the last message, clear the even/odd CPR flags + if ((mm->bFlags & MODES_ACFLAGS_AOG_VALID) && ((a->bFlags ^ mm->bFlags) & MODES_ACFLAGS_AOG)) { + a->bFlags &= ~(MODES_ACFLAGS_LLBOTH_VALID | MODES_ACFLAGS_AOG); + } + + // If we've got a new cprlat or cprlon + if (mm->bFlags & MODES_ACFLAGS_LLEITHER_VALID) { + int location_ok = 0; + + if (mm->bFlags & MODES_ACFLAGS_LLODD_VALID) { + a->odd_cprlat = mm->raw_latitude; + a->odd_cprlon = mm->raw_longitude; + a->odd_cprtime = mstime(); + } else { + a->even_cprlat = mm->raw_latitude; + a->even_cprlon = mm->raw_longitude; + a->even_cprtime = mstime(); + } + + // If we have enough recent data, try global CPR + if (((mm->bFlags | a->bFlags) & MODES_ACFLAGS_LLEITHER_VALID) == MODES_ACFLAGS_LLBOTH_VALID && abs((int)(a->even_cprtime - a->odd_cprtime)) <= 10000) { + if (decodeCPR(a, (mm->bFlags & MODES_ACFLAGS_LLODD_VALID), (mm->bFlags & MODES_ACFLAGS_AOG)) == 0) { + location_ok = 1; + } + } + + // Otherwise try relative CPR. + if (!location_ok && decodeCPRrelative(a, (mm->bFlags & MODES_ACFLAGS_LLODD_VALID), (mm->bFlags & MODES_ACFLAGS_AOG)) == 0) { + location_ok = 1; + } + + //If we sucessfully decoded, back copy the results to mm so that we can print them in list output + if (location_ok) { + mm->bFlags |= MODES_ACFLAGS_LATLON_VALID; + mm->fLat = a->lat; + mm->fLon = a->lon; + } + } + + // Update the aircrafts a->bFlags to reflect the newly received mm->bFlags; + a->bFlags |= mm->bFlags; + + if (mm->msgtype == 32) { + int flags = a->modeACflags; + if ((flags & (MODEAC_MSG_MODEC_HIT | MODEAC_MSG_MODEC_OLD)) == MODEAC_MSG_MODEC_OLD) { + // + // This Mode-C doesn't currently hit any known Mode-S, but it used to because MODEAC_MSG_MODEC_OLD is + // set So the aircraft it used to match has either changed altitude, or gone out of our receiver range + // + // We've now received this Mode-A/C again, so it must be a new aircraft. It could be another aircraft + // at the same Mode-C altitude, or it could be a new airctraft with a new Mods-A squawk. + // + // To avoid masking this aircraft from the interactive display, clear the MODEAC_MSG_MODES_OLD flag + // and set messages to 1; + // + a->modeACflags = flags & ~MODEAC_MSG_MODEC_OLD; + a->messages = 1; + } + } + + // If we are Logging DF's, and it's not a Mode A/C + if ((Modes.bEnableDFLogging) && (mm->msgtype < 32)) { + interactiveCreateDF(a,mm); + } + + return (a); +} +// +//========================================================================= +// +// Show the currently captured interactive data on screen. +// +void interactiveShowData(void) { + struct aircraft *a = Modes.aircrafts; + time_t now = time(NULL); + int count = 0; + char progress; + char spinner[4] = "|/-\\"; + + // Refresh screen every (MODES_INTERACTIVE_REFRESH_TIME) miliseconde + if ((mstime() - Modes.interactive_last_update) < MODES_INTERACTIVE_REFRESH_TIME) + {return;} + + Modes.interactive_last_update = mstime(); + + // Attempt to reconsile any ModeA/C with known Mode-S + // We can't condition on Modes.modeac because ModeA/C could be comming + // in from a raw input port which we can't turn off. + interactiveUpdateAircraftModeS(); + + progress = spinner[time(NULL)%4]; + +#ifndef _WIN32 + printf("\x1b[H\x1b[2J"); // Clear the screen +#else + cls(); +#endif + + if (Modes.interactive_rtl1090 == 0) { + printf ( +"Hex Mode Sqwk Flight Alt Spd Hdg dx(km) dy(km) Sig Msgs Ti%c\n", progress); + } else { + printf ( +"Hex Flight Alt V/S GS TT SSR G*456^ Msgs Seen %c\n", progress); + } + printf( +"-------------------------------------------------------------------------------\n"); + SDL_SetRenderDrawColor(game.renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); + SDL_RenderClear(game.renderer); + drawGrid(); + + while(a && (count < Modes.interactive_rows)) { + + if ((now - a->seen) < Modes.interactive_display_ttl) + { + int msgs = a->messages; + int flags = a->modeACflags; + + if ( (((flags & (MODEAC_MSG_FLAG )) == 0 ) ) + || (((flags & (MODEAC_MSG_MODES_HIT | MODEAC_MSG_MODEA_ONLY)) == MODEAC_MSG_MODEA_ONLY) && (msgs > 4 ) ) + || (((flags & (MODEAC_MSG_MODES_HIT | MODEAC_MSG_MODEC_OLD )) == 0 ) && (msgs > 127) ) + ) { + int altitude = a->altitude, speed = a->speed; + char strSquawk[5] = " "; + char strFl[6] = " "; + char strTt[5] = " "; + char strGs[5] = " "; + + // Convert units to metric if --metric was specified + if (Modes.metric) { + altitude = (int) (altitude / 3.2828); + speed = (int) (speed * 1.852); + } + + if (a->bFlags & MODES_ACFLAGS_SQUAWK_VALID) { + snprintf(strSquawk,5,"%04x", a->modeA);} + + if (a->bFlags & MODES_ACFLAGS_SPEED_VALID) { + snprintf (strGs, 5,"%3d", speed);} + + if (a->bFlags & MODES_ACFLAGS_HEADING_VALID) { + snprintf (strTt, 5,"%03d", a->track);} + + if (msgs > 99999) { + msgs = 99999;} + + if (Modes.interactive_rtl1090) { // RTL1090 display mode + + if (a->bFlags & MODES_ACFLAGS_ALTITUDE_VALID) { + snprintf(strFl,6,"F%03d",(altitude/100)); + } + printf("%06x %-8s %-4s %-3s %-3s %4s %-6d %-2d\n", + a->addr, a->flight, strFl, strGs, strTt, strSquawk, msgs, (int)(now - a->seen)); + + } else { // Dump1090 display mode + char strMode[5] = " "; + char strLat[8] = " "; + char strLon[9] = " "; + unsigned char * pSig = a->signalLevel; + unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] + + pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 3; + + if ((flags & MODEAC_MSG_FLAG) == 0) { + strMode[0] = 'S'; + } else if (flags & MODEAC_MSG_MODEA_ONLY) { + strMode[0] = 'A'; + } + if (flags & MODEAC_MSG_MODEA_HIT) {strMode[2] = 'a';} + if (flags & MODEAC_MSG_MODEC_HIT) {strMode[3] = 'c';} + + if (a->bFlags & MODES_ACFLAGS_LATLON_VALID) { + double dLon = a->lon+87.6651033; + double dLat = a->lat-***REMOVED***; + + double x = 6371.0 * dLon * M_PI / 180.0f * cos(((a->lat+***REMOVED***)/2.0f) * M_PI / 180.0f); + double y = 6371.0 * dLat * M_PI / 180.0f; + // d = sqrt(x*x + y*y) * 6371.0; + + snprintf(strLat, 8,"%7.03f", x); + snprintf(strLon, 9,"%8.03f", y); + + int px = round(320.0 * (0.5 + (x / 64.0))); + int py = round(240.0 * (0.5 + (y / 48.0))); + + if(px >= 0 && px < 320 && py >= 0 && py < 240 ) { + + + if(MODES_ACFLAGS_HEADING_VALID) { + drawPlaneHeading(px, py,a->track, signalAverage, a->flight); + } else { + drawPlane(px, py, signalAverage); + } + } + + } + + if (a->bFlags & MODES_ACFLAGS_AOG) { + snprintf(strFl, 6," grnd"); + } else if (a->bFlags & MODES_ACFLAGS_ALTITUDE_VALID) { + snprintf(strFl, 6, "%5d", altitude); + } + + printf("%06X %-4s %-4s %-8s %5s %3s %3s %7s %8s %3d %5d %2d\n", + a->addr, strMode, strSquawk, a->flight, strFl, strGs, strTt, + strLat, strLon, signalAverage, msgs, (int)(now - a->seen)); + } + count++; + } + } + a = a->next; + } + + SDL_RenderPresent(game.renderer); + +} +// +//========================================================================= +// +// When in interactive mode If we don't receive new nessages within +// MODES_INTERACTIVE_DELETE_TTL seconds we remove the aircraft from the list. +// +void interactiveRemoveStaleAircrafts(void) { + struct aircraft *a = Modes.aircrafts; + struct aircraft *prev = NULL; + time_t now = time(NULL); + + // Only do cleanup once per second + if (Modes.last_cleanup_time != now) { + Modes.last_cleanup_time = now; + + interactiveRemoveStaleDF(now); + + while(a) { + if ((now - a->seen) > Modes.interactive_delete_ttl) { + // Remove the element from the linked list, with care + // if we are removing the first element + if (!prev) { + Modes.aircrafts = a->next; free(a); a = Modes.aircrafts; + } else { + prev->next = a->next; free(a); a = prev->next; + } + } else { + prev = a; a = a->next; + } + } + } +} +// +//========================================================================= +// diff --git a/sdl1090/mode_ac.c b/sdl1090/mode_ac.c new file mode 100644 index 0000000..881a428 --- /dev/null +++ b/sdl1090/mode_ac.c @@ -0,0 +1,386 @@ +// dump1090, a Mode S messages decoder for RTLSDR devices. +// +// Copyright (C) 2012 by Salvatore Sanfilippo +// +// 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 "dump1090.h" +// +// ===================== Mode A/C detection and decoding =================== +// +// +// This table is used to build the Mode A/C variable called ModeABits.Each +// bit period is inspected, and if it's value exceeds the threshold limit, +// then the value in this table is or-ed into ModeABits. +// +// At the end of message processing, ModeABits will be the decoded ModeA value. +// +// We can also flag noise in bits that should be zeros - the xx bits. Noise in +// these bits cause bits (31-16) in ModeABits to be set. Then at the end of message +// processing we can test for errors by looking at these bits. +// +uint32_t ModeABitTable[24] = { +0x00000000, // F1 = 1 +0x00000010, // C1 +0x00001000, // A1 +0x00000020, // C2 +0x00002000, // A2 +0x00000040, // C4 +0x00004000, // A4 +0x40000000, // xx = 0 Set bit 30 if we see this high +0x00000100, // B1 +0x00000001, // D1 +0x00000200, // B2 +0x00000002, // D2 +0x00000400, // B4 +0x00000004, // D4 +0x00000000, // F2 = 1 +0x08000000, // xx = 0 Set bit 27 if we see this high +0x04000000, // xx = 0 Set bit 26 if we see this high +0x00000080, // SPI +0x02000000, // xx = 0 Set bit 25 if we see this high +0x01000000, // xx = 0 Set bit 24 if we see this high +0x00800000, // xx = 0 Set bit 23 if we see this high +0x00400000, // xx = 0 Set bit 22 if we see this high +0x00200000, // xx = 0 Set bit 21 if we see this high +0x00100000, // xx = 0 Set bit 20 if we see this high +}; +// +// This table is used to produce an error variable called ModeAErrs.Each +// inter-bit period is inspected, and if it's value falls outside of the +// expected range, then the value in this table is or-ed into ModeAErrs. +// +// At the end of message processing, ModeAErrs will indicate if we saw +// any inter-bit anomolies, and the bits that are set will show which +// bits had them. +// +uint32_t ModeAMidTable[24] = { +0x80000000, // F1 = 1 Set bit 31 if we see F1_C1 error +0x00000010, // C1 Set bit 4 if we see C1_A1 error +0x00001000, // A1 Set bit 12 if we see A1_C2 error +0x00000020, // C2 Set bit 5 if we see C2_A2 error +0x00002000, // A2 Set bit 13 if we see A2_C4 error +0x00000040, // C4 Set bit 6 if we see C3_A4 error +0x00004000, // A4 Set bit 14 if we see A4_xx error +0x40000000, // xx = 0 Set bit 30 if we see xx_B1 error +0x00000100, // B1 Set bit 8 if we see B1_D1 error +0x00000001, // D1 Set bit 0 if we see D1_B2 error +0x00000200, // B2 Set bit 9 if we see B2_D2 error +0x00000002, // D2 Set bit 1 if we see D2_B4 error +0x00000400, // B4 Set bit 10 if we see B4_D4 error +0x00000004, // D4 Set bit 2 if we see D4_F2 error +0x20000000, // F2 = 1 Set bit 29 if we see F2_xx error +0x08000000, // xx = 0 Set bit 27 if we see xx_xx error +0x04000000, // xx = 0 Set bit 26 if we see xx_SPI error +0x00000080, // SPI Set bit 15 if we see SPI_xx error +0x02000000, // xx = 0 Set bit 25 if we see xx_xx error +0x01000000, // xx = 0 Set bit 24 if we see xx_xx error +0x00800000, // xx = 0 Set bit 23 if we see xx_xx error +0x00400000, // xx = 0 Set bit 22 if we see xx_xx error +0x00200000, // xx = 0 Set bit 21 if we see xx_xx error +0x00100000, // xx = 0 Set bit 20 if we see xx_xx error +}; +// +// The "off air" format is,, +// _F1_C1_A1_C2_A2_C4_A4_xx_B1_D1_B2_D2_B4_D4_F2_xx_xx_SPI_ +// +// Bit spacing is 1.45uS, with 0.45uS high, and 1.00us low. This is a problem +// because we ase sampling at 2Mhz (500nS) so we are below Nyquist. +// +// The bit spacings are.. +// F1 : 0.00, +// 1.45, 2.90, 4.35, 5.80, 7.25, 8.70, +// X : 10.15, +// : 11.60, 13.05, 14.50, 15.95, 17.40, 18.85, +// F2 : 20.30, +// X : 21.75, 23.20, 24.65 +// +// This equates to the following sample point centers at 2Mhz. +// [ 0.0], +// [ 2.9], [ 5.8], [ 8.7], [11.6], [14.5], [17.4], +// [20.3], +// [23.2], [26.1], [29.0], [31.9], [34.8], [37.7] +// [40.6] +// [43.5], [46.4], [49.3] +// +// We know that this is a supposed to be a binary stream, so the signal +// should either be a 1 or a 0. Therefore, any energy above the noise level +// in two adjacent samples must be from the same pulse, so we can simply +// add the values together.. +// +int detectModeA(uint16_t *m, struct modesMessage *mm) + { + int j, lastBitWasOne; + int ModeABits = 0; + int ModeAErrs = 0; + int byte, bit; + int thisSample, lastBit, lastSpace = 0; + int m0, m1, m2, m3, mPhase; + int n0, n1, n2 ,n3; + int F1_sig, F1_noise; + int F2_sig, F2_noise; + int fSig, fNoise, fLevel, fLoLo; + + // m[0] contains the energy from 0 -> 499 nS + // m[1] contains the energy from 500 -> 999 nS + // m[2] contains the energy from 1000 -> 1499 nS + // m[3] contains the energy from 1500 -> 1999 nS + // + // We are looking for a Frame bit (F1) whose width is 450nS, followed by + // 1000nS of quiet. + // + // The width of the frame bit is 450nS, which is 90% of our sample rate. + // Therefore, in an ideal world, all the energy for the frame bit will be + // in a single sample, preceeded by (at least) one zero, and followed by + // two zeros, Best case we can look for ... + // + // 0 - 1 - 0 - 0 + // + // However, our samples are not phase aligned, so some of the energy from + // each bit could be spread over two consecutive samples. Worst case is + // that we sample half in one bit, and half in the next. In that case, + // we're looking for + // + // 0 - 0.5 - 0.5 - 0. + + m0 = m[0]; m1 = m[1]; + + if (m0 >= m1) // m1 *must* be bigger than m0 for this to be F1 + {return (0);} + + m2 = m[2]; m3 = m[3]; + + // + // if (m2 <= m0), then assume the sample bob on (Phase == 0), so don't look at m3 + if ((m2 <= m0) || (m2 < m3)) + {m3 = m2; m2 = m0;} + + if ( (m3 >= m1) // m1 must be bigger than m3 + || (m0 > m2) // m2 can be equal to m0 if ( 0,1,0,0 ) + || (m3 > m2) ) // m2 can be equal to m3 if ( 0,1,0,0 ) + {return (0);} + + // m0 = noise + // m1 = noise + (signal * X)) + // m2 = noise + (signal * (1-X)) + // m3 = noise + // + // Hence, assuming all 4 samples have similar amounts of noise in them + // signal = (m1 + m2) - ((m0 + m3) * 2) + // noise = (m0 + m3) / 2 + // + F1_sig = (m1 + m2) - ((m0 + m3) << 1); + F1_noise = (m0 + m3) >> 1; + + if ( (F1_sig < MODEAC_MSG_SQUELCH_LEVEL) // minimum required F1 signal amplitude + || (F1_sig < (F1_noise << 2)) ) // minimum allowable Sig/Noise ratio 4:1 + {return (0);} + + // If we get here then we have a potential F1, so look for an equally valid F2 20.3uS later + // + // Our F1 is centered somewhere between samples m[1] and m[2]. We can guestimate where F2 is + // by comparing the ratio of m1 and m2, and adding on 20.3 uS (40.6 samples) + // + mPhase = ((m2 * 20) / (m1 + m2)); + byte = (mPhase + 812) / 20; + n0 = m[byte++]; n1 = m[byte++]; + + if (n0 >= n1) // n1 *must* be bigger than n0 for this to be F2 + {return (0);} + + n2 = m[byte++]; + // + // if the sample bob on (Phase == 0), don't look at n3 + // + if ((mPhase + 812) % 20) + {n3 = m[byte++];} + else + {n3 = n2; n2 = n0;} + + if ( (n3 >= n1) // n1 must be bigger than n3 + || (n0 > n2) // n2 can be equal to n0 ( 0,1,0,0 ) + || (n3 > n2) ) // n2 can be equal to n3 ( 0,1,0,0 ) + {return (0);} + + F2_sig = (n1 + n2) - ((n0 + n3) << 1); + F2_noise = (n0 + n3) >> 1; + + if ( (F2_sig < MODEAC_MSG_SQUELCH_LEVEL) // minimum required F2 signal amplitude + || (F2_sig < (F2_noise << 2)) ) // maximum allowable Sig/Noise ratio 4:1 + {return (0);} + + fSig = (F1_sig + F2_sig) >> 1; + fNoise = (F1_noise + F2_noise) >> 1; + fLoLo = fNoise + (fSig >> 2); // 1/2 + fLevel = fNoise + (fSig >> 1); + lastBitWasOne = 1; + lastBit = F1_sig; + // + // Now step by a half ModeA bit, 0.725nS, which is 1.45 samples, which is 29/20 + // No need to do bit 0 because we've already selected it as a valid F1 + // Do several bits past the SPI to increase error rejection + // + for (j = 1, mPhase += 29; j < 48; mPhase += 29, j ++) + { + byte = 1 + (mPhase / 20); + + thisSample = m[byte] - fNoise; + if (mPhase % 20) // If the bit is split over two samples... + {thisSample += (m[byte+1] - fNoise);} // add in the second sample's energy + + // If we're calculating a space value + if (j & 1) + {lastSpace = thisSample;} + + else + {// We're calculating a new bit value + bit = j >> 1; + if (thisSample >= fLevel) + {// We're calculating a new bit value, and its a one + ModeABits |= ModeABitTable[bit--]; // or in the correct bit + + if (lastBitWasOne) + { // This bit is one, last bit was one, so check the last space is somewhere less than one + if ( (lastSpace >= (thisSample>>1)) || (lastSpace >= lastBit) ) + {ModeAErrs |= ModeAMidTable[bit];} + } + + else + {// This bit,is one, last bit was zero, so check the last space is somewhere less than one + if (lastSpace >= (thisSample >> 1)) + {ModeAErrs |= ModeAMidTable[bit];} + } + + lastBitWasOne = 1; + } + + + else + {// We're calculating a new bit value, and its a zero + if (lastBitWasOne) + { // This bit is zero, last bit was one, so check the last space is somewhere in between + if (lastSpace >= lastBit) + {ModeAErrs |= ModeAMidTable[bit];} + } + + else + {// This bit,is zero, last bit was zero, so check the last space is zero too + if (lastSpace >= fLoLo) + {ModeAErrs |= ModeAMidTable[bit];} + } + + lastBitWasOne = 0; + } + + lastBit = (thisSample >> 1); + } + } + + // + // Output format is : 00:A4:A2:A1:00:B4:B2:B1:00:C4:C2:C1:00:D4:D2:D1 + // + if ((ModeABits < 3) || (ModeABits & 0xFFFF8808) || (ModeAErrs) ) + {return (ModeABits = 0);} + + fSig = (fSig + 0x7F) >> 8; + mm->signalLevel = ((fSig < 255) ? fSig : 255); + + return ModeABits; + } +// +//========================================================================= +// +// Input format is : 00:A4:A2:A1:00:B4:B2:B1:00:C4:C2:C1:00:D4:D2:D1 +// +int ModeAToModeC(unsigned int ModeA) + { + unsigned int FiveHundreds = 0; + unsigned int OneHundreds = 0; + + if ( (ModeA & 0xFFFF888B) // D1 set is illegal. D2 set is > 62700ft which is unlikely + || ((ModeA & 0x000000F0) == 0) ) // C1,,C4 cannot be Zero + {return -9999;} + + if (ModeA & 0x0010) {OneHundreds ^= 0x007;} // C1 + if (ModeA & 0x0020) {OneHundreds ^= 0x003;} // C2 + if (ModeA & 0x0040) {OneHundreds ^= 0x001;} // C4 + + // Remove 7s from OneHundreds (Make 7->5, snd 5->7). + if ((OneHundreds & 5) == 5) {OneHundreds ^= 2;} + + // Check for invalid codes, only 1 to 5 are valid + if (OneHundreds > 5) + {return -9999;} + +//if (ModeA & 0x0001) {FiveHundreds ^= 0x1FF;} // D1 never used for altitude + if (ModeA & 0x0002) {FiveHundreds ^= 0x0FF;} // D2 + if (ModeA & 0x0004) {FiveHundreds ^= 0x07F;} // D4 + + if (ModeA & 0x1000) {FiveHundreds ^= 0x03F;} // A1 + if (ModeA & 0x2000) {FiveHundreds ^= 0x01F;} // A2 + if (ModeA & 0x4000) {FiveHundreds ^= 0x00F;} // A4 + + if (ModeA & 0x0100) {FiveHundreds ^= 0x007;} // B1 + if (ModeA & 0x0200) {FiveHundreds ^= 0x003;} // B2 + if (ModeA & 0x0400) {FiveHundreds ^= 0x001;} // B4 + + // Correct order of OneHundreds. + if (FiveHundreds & 1) {OneHundreds = 6 - OneHundreds;} + + return ((FiveHundreds * 5) + OneHundreds - 13); + } +// +//========================================================================= +// +void decodeModeAMessage(struct modesMessage *mm, int ModeA) + { + mm->msgtype = 32; // Valid Mode S DF's are DF-00 to DF-31. + // so use 32 to indicate Mode A/C + + mm->msgbits = 16; // Fudge up a Mode S style data stream + mm->msg[0] = (ModeA >> 8); + mm->msg[1] = (ModeA); + + // Fudge an ICAO address based on Mode A (remove the Ident bit) + // Use an upper address byte of FF, since this is ICAO unallocated + mm->addr = 0x00FF0000 | (ModeA & 0x0000FF7F); + + // Set the Identity field to ModeA + mm->modeA = ModeA & 0x7777; + mm->bFlags |= MODES_ACFLAGS_SQUAWK_VALID; + + // Flag ident in flight status + mm->fs = ModeA & 0x0080; + + // Not much else we can tell from a Mode A/C reply. + // Just fudge up a few bits to keep other code happy + mm->crcok = 1; + mm->correctedbits = 0; + } +// +// ===================== Mode A/C detection and decoding =================== +// \ No newline at end of file diff --git a/sdl1090/mode_s.c.REMOVED.git-id b/sdl1090/mode_s.c.REMOVED.git-id new file mode 100644 index 0000000..4263876 --- /dev/null +++ b/sdl1090/mode_s.c.REMOVED.git-id @@ -0,0 +1 @@ +cd129a02b926ab42fbf9f41ab984f4bb2a3e5e59 \ No newline at end of file diff --git a/sdl1090/net_io.c b/sdl1090/net_io.c new file mode 100644 index 0000000..a979883 --- /dev/null +++ b/sdl1090/net_io.c @@ -0,0 +1,1006 @@ +// dump1090, a Mode S messages decoder for RTLSDR devices. +// +// Copyright (C) 2012 by Salvatore Sanfilippo +// +// 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 "dump1090.h" +// +// ============================= Networking ============================= +// +// Note: here we disregard any kind of good coding practice in favor of +// extreme simplicity, that is: +// +// 1) We only rely on the kernel buffers for our I/O without any kind of +// user space buffering. +// 2) We don't register any kind of event handler, from time to time a +// function gets called and we accept new connections. All the rest is +// handled via non-blocking I/O and manually polling clients to see if +// they have something new to share with us when reading is needed. +// +//========================================================================= +// +// Networking "stack" initialization +// +struct service { + char *descr; + int *socket; + int port; + int enabled; +}; + +struct service services[MODES_NET_SERVICES_NUM]; + +void modesInitNet(void) { + int j; + + struct service svc[MODES_NET_SERVICES_NUM] = { + {"Raw TCP output", &Modes.ros, Modes.net_output_raw_port, 1}, + {"Raw TCP input", &Modes.ris, Modes.net_input_raw_port, 1}, + {"Beast TCP output", &Modes.bos, Modes.net_output_beast_port, 1}, + {"Beast TCP input", &Modes.bis, Modes.net_input_beast_port, 1}, + {"HTTP server", &Modes.https, Modes.net_http_port, 1}, + {"Basestation TCP output", &Modes.sbsos, Modes.net_output_sbs_port, 1} + }; + + memcpy(&services, &svc, sizeof(svc));//services = svc; + + Modes.clients = NULL; + +#ifdef _WIN32 + if ( (!Modes.wsaData.wVersion) + && (!Modes.wsaData.wHighVersion) ) { + // Try to start the windows socket support + if (WSAStartup(MAKEWORD(2,1),&Modes.wsaData) != 0) + { + fprintf(stderr, "WSAStartup returned Error\n"); + } + } +#endif + + for (j = 0; j < MODES_NET_SERVICES_NUM; j++) { + services[j].enabled = (services[j].port != 0); + if (services[j].enabled) { + int s = anetTcpServer(Modes.aneterr, services[j].port, Modes.net_bind_address); + if (s == -1) { + fprintf(stderr, "Error opening the listening port %d (%s): %s\n", + services[j].port, services[j].descr, Modes.aneterr); + exit(1); + } + anetNonBlock(Modes.aneterr, s); + *services[j].socket = s; + } else { + if (Modes.debug & MODES_DEBUG_NET) printf("%s port is disabled\n", services[j].descr); + } + } + +#ifndef _WIN32 + signal(SIGPIPE, SIG_IGN); +#endif +} +// +//========================================================================= +// +// This function gets called from time to time when the decoding thread is +// awakened by new data arriving. This usually happens a few times every second +// +struct client * modesAcceptClients(void) { + int fd, port; + unsigned int j; + struct client *c; + + for (j = 0; j < MODES_NET_SERVICES_NUM; j++) { + if (services[j].enabled) { + fd = anetTcpAccept(Modes.aneterr, *services[j].socket, NULL, &port); + if (fd == -1) continue; + + anetNonBlock(Modes.aneterr, fd); + c = (struct client *) malloc(sizeof(*c)); + c->service = *services[j].socket; + c->next = Modes.clients; + c->fd = fd; + c->buflen = 0; + Modes.clients = c; + anetSetSendBuffer(Modes.aneterr,fd, (MODES_NET_SNDBUF_SIZE << Modes.net_sndbuf_size)); + + if (*services[j].socket == Modes.sbsos) Modes.stat_sbs_connections++; + if (*services[j].socket == Modes.ros) Modes.stat_raw_connections++; + if (*services[j].socket == Modes.bos) Modes.stat_beast_connections++; + + j--; // Try again with the same listening port + + if (Modes.debug & MODES_DEBUG_NET) + printf("Created new client %d\n", fd); + } + } + return Modes.clients; +} +// +//========================================================================= +// +// On error free the client, collect the structure, adjust maxfd if needed. +// +void modesFreeClient(struct client *c) { + + // Unhook this client from the linked list of clients + struct client *p = Modes.clients; + if (p) { + if (p == c) { + Modes.clients = c->next; + } else { + while ((p) && (p->next != c)) { + p = p->next; + } + if (p) { + p->next = c->next; + } + } + } + + free(c); +} +// +//========================================================================= +// +// Close the client connection and mark it as closed +// +void modesCloseClient(struct client *c) { + close(c->fd); + if (c->service == Modes.sbsos) { + if (Modes.stat_sbs_connections) Modes.stat_sbs_connections--; + } else if (c->service == Modes.ros) { + if (Modes.stat_raw_connections) Modes.stat_raw_connections--; + } else if (c->service == Modes.bos) { + if (Modes.stat_beast_connections) Modes.stat_beast_connections--; + } + + if (Modes.debug & MODES_DEBUG_NET) + printf("Closing client %d\n", c->fd); + + c->fd = -1; +} +// +//========================================================================= +// +// Send the specified message to all clients listening for a given service +// +void modesSendAllClients(int service, void *msg, int len) { + struct client *c = Modes.clients; + + while (c) { + // Read next before servicing client incase the service routine deletes the client! + struct client *next = c->next; + + if (c->fd != -1) { + if (c->service == service) { +#ifndef _WIN32 + int nwritten = write(c->fd, msg, len); +#else + int nwritten = send(c->fd, msg, len, 0 ); +#endif + if (nwritten != len) { + modesCloseClient(c); + } + } + } else { + modesFreeClient(c); + } + c = next; + } +} +// +//========================================================================= +// +// Write raw output in Beast Binary format with Timestamp to TCP clients +// +void modesSendBeastOutput(struct modesMessage *mm) { + char *p = &Modes.beastOut[Modes.beastOutUsed]; + int msgLen = mm->msgbits / 8; + char * pTimeStamp; + char ch; + int j; + int iOutLen = msgLen + 9; // Escape, msgtype, timestamp, sigLevel, msg + + *p++ = 0x1a; + if (msgLen == MODES_SHORT_MSG_BYTES) + {*p++ = '2';} + else if (msgLen == MODES_LONG_MSG_BYTES) + {*p++ = '3';} + else if (msgLen == MODEAC_MSG_BYTES) + {*p++ = '1';} + else + {return;} + + pTimeStamp = (char *) &mm->timestampMsg; + for (j = 5; j >= 0; j--) { + *p++ = (ch = pTimeStamp[j]); + if (0x1A == ch) {*p++ = ch; iOutLen++;} + } + + *p++ = (ch = mm->signalLevel); + if (0x1A == ch) {*p++ = ch; iOutLen++;} + + for (j = 0; j < msgLen; j++) { + *p++ = (ch = mm->msg[j]); + if (0x1A == ch) {*p++ = ch; iOutLen++;} + } + + Modes.beastOutUsed += iOutLen; + if (Modes.beastOutUsed >= Modes.net_output_raw_size) + { + modesSendAllClients(Modes.bos, Modes.beastOut, Modes.beastOutUsed); + Modes.beastOutUsed = 0; + Modes.net_output_raw_rate_count = 0; + } +} +// +//========================================================================= +// +// Write raw output to TCP clients +// +void modesSendRawOutput(struct modesMessage *mm) { + char *p = &Modes.rawOut[Modes.rawOutUsed]; + int msgLen = mm->msgbits / 8; + int j; + unsigned char * pTimeStamp; + + if (Modes.mlat && mm->timestampMsg) { + *p++ = '@'; + pTimeStamp = (unsigned char *) &mm->timestampMsg; + for (j = 5; j >= 0; j--) { + sprintf(p, "%02X", pTimeStamp[j]); + p += 2; + } + Modes.rawOutUsed += 12; // additional 12 characters for timestamp + } else + *p++ = '*'; + + for (j = 0; j < msgLen; j++) { + sprintf(p, "%02X", mm->msg[j]); + p += 2; + } + + *p++ = ';'; + *p++ = '\n'; + + Modes.rawOutUsed += ((msgLen*2) + 3); + if (Modes.rawOutUsed >= Modes.net_output_raw_size) + { + modesSendAllClients(Modes.ros, Modes.rawOut, Modes.rawOutUsed); + Modes.rawOutUsed = 0; + Modes.net_output_raw_rate_count = 0; + } +} +// +//========================================================================= +// +// Write SBS output to TCP clients +// The message structure mm->bFlags tells us what has been updated by this message +// +void modesSendSBSOutput(struct modesMessage *mm) { + char msg[256], *p = msg; + uint32_t offset; + struct timeb epocTime_receive, epocTime_now; + struct tm stTime_receive, stTime_now; + int msgType; + + // + // SBS BS style output checked against the following reference + // http://www.homepages.mcb.net/bones/SBS/Article/Barebones42_Socket_Data.htm - seems comprehensive + // + + // Decide on the basic SBS Message Type + if ((mm->msgtype == 4) || (mm->msgtype == 20)) { + msgType = 5; + } else if ((mm->msgtype == 5) || (mm->msgtype == 21)) { + msgType = 6; + } else if ((mm->msgtype == 0) || (mm->msgtype == 16)) { + msgType = 7; + } else if (mm->msgtype == 11) { + msgType = 8; + } else if ((mm->msgtype != 17) && (mm->msgtype != 18)) { + return; + } else if ((mm->metype >= 1) && (mm->metype <= 4)) { + msgType = 1; + } else if ((mm->metype >= 5) && (mm->metype <= 8)) { + if (mm->bFlags & MODES_ACFLAGS_LATLON_VALID) + {msgType = 2;} + else + {msgType = 7;} + } else if ((mm->metype >= 9) && (mm->metype <= 18)) { + if (mm->bFlags & MODES_ACFLAGS_LATLON_VALID) + {msgType = 3;} + else + {msgType = 7;} + } else if (mm->metype != 19) { + return; + } else if ((mm->mesub == 1) || (mm->mesub == 2)) { + msgType = 4; + } else { + return; + } + + // Fields 1 to 6 : SBS message type and ICAO address of the aircraft and some other stuff + p += sprintf(p, "MSG,%d,111,11111,%06X,111111,", msgType, mm->addr); + + // Find current system time + ftime(&epocTime_now); // get the current system time & date + stTime_now = *localtime(&epocTime_now.time); + + // Find message reception time + if (mm->timestampMsg && !mm->remote) { // Make sure the records' timestamp is valid before using it + epocTime_receive = Modes.stSystemTimeBlk; // This is the time of the start of the Block we're processing + offset = (int) (mm->timestampMsg - Modes.timestampBlk); // This is the time (in 12Mhz ticks) into the Block + offset = offset / 12000; // convert to milliseconds + epocTime_receive.millitm += offset; // add on the offset time to the Block start time + if (epocTime_receive.millitm > 999) { // if we've caused an overflow into the next second... + epocTime_receive.millitm -= 1000; + epocTime_receive.time ++; // ..correct the overflow + } + stTime_receive = *localtime(&epocTime_receive.time); + } else { + epocTime_receive = epocTime_now; // We don't have a usable reception time; use the current system time + stTime_receive = stTime_now; + } + + // Fields 7 & 8 are the message reception time and date + p += sprintf(p, "%04d/%02d/%02d,", (stTime_receive.tm_year+1900),(stTime_receive.tm_mon+1), stTime_receive.tm_mday); + p += sprintf(p, "%02d:%02d:%02d.%03d,", stTime_receive.tm_hour, stTime_receive.tm_min, stTime_receive.tm_sec, epocTime_receive.millitm); + + // Fields 9 & 10 are the current time and date + p += sprintf(p, "%04d/%02d/%02d,", (stTime_now.tm_year+1900),(stTime_now.tm_mon+1), stTime_now.tm_mday); + p += sprintf(p, "%02d:%02d:%02d.%03d", stTime_now.tm_hour, stTime_now.tm_min, stTime_now.tm_sec, epocTime_now.millitm); + + // Field 11 is the callsign (if we have it) + if (mm->bFlags & MODES_ACFLAGS_CALLSIGN_VALID) {p += sprintf(p, ",%s", mm->flight);} + else {p += sprintf(p, ",");} + + // Field 12 is the altitude (if we have it) - force to zero if we're on the ground + if ((mm->bFlags & MODES_ACFLAGS_AOG_GROUND) == MODES_ACFLAGS_AOG_GROUND) { + p += sprintf(p, ",0"); + } else if (mm->bFlags & MODES_ACFLAGS_ALTITUDE_VALID) { + p += sprintf(p, ",%d", mm->altitude); + } else { + p += sprintf(p, ","); + } + + // Field 13 is the ground Speed (if we have it) + if (mm->bFlags & MODES_ACFLAGS_SPEED_VALID) { + p += sprintf(p, ",%d", mm->velocity); + } else { + p += sprintf(p, ","); + } + + // Field 14 is the ground Heading (if we have it) + if (mm->bFlags & MODES_ACFLAGS_HEADING_VALID) { + p += sprintf(p, ",%d", mm->heading); + } else { + p += sprintf(p, ","); + } + + // Fields 15 and 16 are the Lat/Lon (if we have it) + if (mm->bFlags & MODES_ACFLAGS_LATLON_VALID) {p += sprintf(p, ",%1.5f,%1.5f", mm->fLat, mm->fLon);} + else {p += sprintf(p, ",,");} + + // Field 17 is the VerticalRate (if we have it) + if (mm->bFlags & MODES_ACFLAGS_VERTRATE_VALID) {p += sprintf(p, ",%d", mm->vert_rate);} + else {p += sprintf(p, ",");} + + // Field 18 is the Squawk (if we have it) + if (mm->bFlags & MODES_ACFLAGS_SQUAWK_VALID) {p += sprintf(p, ",%x", mm->modeA);} + else {p += sprintf(p, ",");} + + // Field 19 is the Squawk Changing Alert flag (if we have it) + if (mm->bFlags & MODES_ACFLAGS_FS_VALID) { + if ((mm->fs >= 2) && (mm->fs <= 4)) { + p += sprintf(p, ",-1"); + } else { + p += sprintf(p, ",0"); + } + } else { + p += sprintf(p, ","); + } + + // Field 20 is the Squawk Emergency flag (if we have it) + if (mm->bFlags & MODES_ACFLAGS_SQUAWK_VALID) { + if ((mm->modeA == 0x7500) || (mm->modeA == 0x7600) || (mm->modeA == 0x7700)) { + p += sprintf(p, ",-1"); + } else { + p += sprintf(p, ",0"); + } + } else { + p += sprintf(p, ","); + } + + // Field 21 is the Squawk Ident flag (if we have it) + if (mm->bFlags & MODES_ACFLAGS_FS_VALID) { + if ((mm->fs >= 4) && (mm->fs <= 5)) { + p += sprintf(p, ",-1"); + } else { + p += sprintf(p, ",0"); + } + } else { + p += sprintf(p, ","); + } + + // Field 22 is the OnTheGround flag (if we have it) + if (mm->bFlags & MODES_ACFLAGS_AOG_VALID) { + if (mm->bFlags & MODES_ACFLAGS_AOG) { + p += sprintf(p, ",-1"); + } else { + p += sprintf(p, ",0"); + } + } else { + p += sprintf(p, ","); + } + + p += sprintf(p, "\r\n"); + modesSendAllClients(Modes.sbsos, msg, p-msg); +} +// +//========================================================================= +// +void modesQueueOutput(struct modesMessage *mm) { + if (Modes.stat_sbs_connections) {modesSendSBSOutput(mm);} + if (Modes.stat_beast_connections) {modesSendBeastOutput(mm);} + if (Modes.stat_raw_connections) {modesSendRawOutput(mm);} +} +// +//========================================================================= +// +// This function decodes a Beast binary format message +// +// The message is passed to the higher level layers, so it feeds +// the selected screen output, the network output and so forth. +// +// If the message looks invalid it is silently discarded. +// +// The function always returns 0 (success) to the caller as there is no +// case where we want broken messages here to close the client connection. +// +int decodeBinMessage(struct client *c, char *p) { + int msgLen = 0; + int j; + char ch; + char * ptr; + unsigned char msg[MODES_LONG_MSG_BYTES]; + struct modesMessage mm; + MODES_NOTUSED(c); + memset(&mm, 0, sizeof(mm)); + + ch = *p++; /// Get the message type + if (0x1A == ch) {p++;} + + if ((ch == '1') && (Modes.mode_ac)) { // skip ModeA/C unless user enables --modes-ac + msgLen = MODEAC_MSG_BYTES; + } else if (ch == '2') { + msgLen = MODES_SHORT_MSG_BYTES; + } else if (ch == '3') { + msgLen = MODES_LONG_MSG_BYTES; + } + + if (msgLen) { + // Mark messages received over the internet as remote so that we don't try to + // pass them off as being received by this instance when forwarding them + mm.remote = 1; + + ptr = (char*) &mm.timestampMsg; + for (j = 0; j < 6; j++) { // Grab the timestamp (big endian format) + ptr[5-j] = ch = *p++; + if (0x1A == ch) {p++;} + } + + mm.signalLevel = ch = *p++; // Grab the signal level + if (0x1A == ch) {p++;} + + for (j = 0; j < msgLen; j++) { // and the data + msg[j] = ch = *p++; + if (0x1A == ch) {p++;} + } + + if (msgLen == MODEAC_MSG_BYTES) { // ModeA or ModeC + decodeModeAMessage(&mm, ((msg[0] << 8) | msg[1])); + } else { + decodeModesMessage(&mm, msg); + } + + useModesMessage(&mm); + } + return (0); +} +// +//========================================================================= +// +// Turn an hex digit into its 4 bit decimal value. +// Returns -1 if the digit is not in the 0-F range. +// +int hexDigitVal(int c) { + c = tolower(c); + if (c >= '0' && c <= '9') return c-'0'; + else if (c >= 'a' && c <= 'f') return c-'a'+10; + else return -1; +} +// +//========================================================================= +// +// This function decodes a string representing message in raw hex format +// like: *8D4B969699155600E87406F5B69F; The string is null-terminated. +// +// The message is passed to the higher level layers, so it feeds +// the selected screen output, the network output and so forth. +// +// If the message looks invalid it is silently discarded. +// +// The function always returns 0 (success) to the caller as there is no +// case where we want broken messages here to close the client connection. +// +int decodeHexMessage(struct client *c, char *hex) { + int l = strlen(hex), j; + unsigned char msg[MODES_LONG_MSG_BYTES]; + struct modesMessage mm; + MODES_NOTUSED(c); + memset(&mm, 0, sizeof(mm)); + + // Mark messages received over the internet as remote so that we don't try to + // pass them off as being received by this instance when forwarding them + mm.remote = 1; + mm.signalLevel = 0xFF; + + // Remove spaces on the left and on the right + while(l && isspace(hex[l-1])) { + hex[l-1] = '\0'; l--; + } + while(isspace(*hex)) { + hex++; l--; + } + + // Turn the message into binary. + // Accept *-AVR raw @-AVR/BEAST timeS+raw %-AVR timeS+raw (CRC good) <-BEAST timeS+sigL+raw + // and some AVR records that we can understand + if (hex[l-1] != ';') {return (0);} // not complete - abort + + switch(hex[0]) { + case '<': { + mm.signalLevel = (hexDigitVal(hex[13])<<4) | hexDigitVal(hex[14]); + hex += 15; l -= 16; // Skip <, timestamp and siglevel, and ; + break;} + + case '@': // No CRC check + case '%': { // CRC is OK + hex += 13; l -= 14; // Skip @,%, and timestamp, and ; + break;} + + case '*': + case ':': { + hex++; l-=2; // Skip * and ; + break;} + + default: { + return (0); // We don't know what this is, so abort + break;} + } + + if ( (l != (MODEAC_MSG_BYTES * 2)) + && (l != (MODES_SHORT_MSG_BYTES * 2)) + && (l != (MODES_LONG_MSG_BYTES * 2)) ) + {return (0);} // Too short or long message... broken + + if ( (0 == Modes.mode_ac) + && (l == (MODEAC_MSG_BYTES * 2)) ) + {return (0);} // Right length for ModeA/C, but not enabled + + for (j = 0; j < l; j += 2) { + int high = hexDigitVal(hex[j]); + int low = hexDigitVal(hex[j+1]); + + if (high == -1 || low == -1) return 0; + msg[j/2] = (high << 4) | low; + } + + if (l == (MODEAC_MSG_BYTES * 2)) { // ModeA or ModeC + decodeModeAMessage(&mm, ((msg[0] << 8) | msg[1])); + } else { // Assume ModeS + decodeModesMessage(&mm, msg); + } + + useModesMessage(&mm); + return (0); +} +// +//========================================================================= +// +// Return a description of planes in json. No metric conversion +// +char *aircraftsToJson(int *len) { + time_t now = time(NULL); + struct aircraft *a = Modes.aircrafts; + int buflen = 1024; // The initial buffer is incremented as needed + char *buf = (char *) malloc(buflen), *p = buf; + int l; + + l = snprintf(p,buflen,"[\n"); + p += l; buflen -= l; + while(a) { + int position = 0; + int track = 0; + + if (a->modeACflags & MODEAC_MSG_FLAG) { // skip any fudged ICAO records Mode A/C + a = a->next; + continue; + } + + if (a->bFlags & MODES_ACFLAGS_LATLON_VALID) { + position = 1; + } + + if (a->bFlags & MODES_ACFLAGS_HEADING_VALID) { + track = 1; + } + + // No metric conversion + l = snprintf(p,buflen, + "{\"hex\":\"%06x\", \"squawk\":\"%04x\", \"flight\":\"%s\", \"lat\":%f, " + "\"lon\":%f, \"validposition\":%d, \"altitude\":%d, \"vert_rate\":%d,\"track\":%d, \"validtrack\":%d," + "\"speed\":%d, \"messages\":%ld, \"seen\":%d},\n", + a->addr, a->modeA, a->flight, a->lat, a->lon, position, a->altitude, a->vert_rate, a->track, track, + a->speed, a->messages, (int)(now - a->seen)); + p += l; buflen -= l; + + //Resize if needed + if (buflen < 256) { + int used = p-buf; + buflen += 1024; // Our increment. + buf = (char *) realloc(buf,used+buflen); + p = buf+used; + } + + a = a->next; + } + + //Remove the final comma if any, and closes the json array. + if (*(p-2) == ',') { + *(p-2) = '\n'; + p--; + buflen++; + } + + l = snprintf(p,buflen,"]\n"); + p += l; buflen -= l; + + *len = p-buf; + return buf; +} +// +//========================================================================= +// +#define MODES_CONTENT_TYPE_HTML "text/html;charset=utf-8" +#define MODES_CONTENT_TYPE_CSS "text/css;charset=utf-8" +#define MODES_CONTENT_TYPE_JSON "application/json;charset=utf-8" +#define MODES_CONTENT_TYPE_JS "application/javascript;charset=utf-8" +// +// Get an HTTP request header and write the response to the client. +// gain here we assume that the socket buffer is enough without doing +// any kind of userspace buffering. +// +// Returns 1 on error to signal the caller the client connection should +// be closed. +// +int handleHTTPRequest(struct client *c, char *p) { + char hdr[512]; + int clen, hdrlen; + int httpver, keepalive; + int statuscode = 500; + char *url, *content; + char ctype[48]; + char getFile[1024]; + char *ext; + + if (Modes.debug & MODES_DEBUG_NET) + printf("\nHTTP request: %s\n", c->buf); + + // Minimally parse the request. + httpver = (strstr(p, "HTTP/1.1") != NULL) ? 11 : 10; + if (httpver == 10) { + // HTTP 1.0 defaults to close, unless otherwise specified. + //keepalive = strstr(p, "Connection: keep-alive") != NULL; + } else if (httpver == 11) { + // HTTP 1.1 defaults to keep-alive, unless close is specified. + //keepalive = strstr(p, "Connection: close") == NULL; + } + keepalive = 0; + + // Identify he URL. + p = strchr(p,' '); + if (!p) return 1; // There should be the method and a space + url = ++p; // Now this should point to the requested URL + p = strchr(p, ' '); + if (!p) return 1; // There should be a space before HTTP/ + *p = '\0'; + + if (Modes.debug & MODES_DEBUG_NET) { + printf("\nHTTP keep alive: %d\n", keepalive); + printf("HTTP requested URL: %s\n\n", url); + } + + if (strlen(url) < 2) { + snprintf(getFile, sizeof getFile, "%s/gmap.html", HTMLPATH); // Default file + } else { + snprintf(getFile, sizeof getFile, "%s/%s", HTMLPATH, url); + } + + // Select the content to send, we have just two so far: + // "/" -> Our google map application. + // "/data.json" -> Our ajax request to update planes. + if (strstr(url, "/data.json")) { + statuscode = 200; + content = aircraftsToJson(&clen); + //snprintf(ctype, sizeof ctype, MODES_CONTENT_TYPE_JSON); + } else { + struct stat sbuf; + int fd = -1; + char *rp, *hrp; + + rp = realpath(getFile, NULL); + hrp = realpath(HTMLPATH, NULL); + hrp = (hrp ? hrp : HTMLPATH); + clen = -1; + content = strdup("Server error occured"); + if (rp && (!strncmp(hrp, rp, strlen(hrp)))) { + if (stat(getFile, &sbuf) != -1 && (fd = open(getFile, O_RDONLY)) != -1) { + content = (char *) realloc(content, sbuf.st_size); + if (read(fd, content, sbuf.st_size) != -1) { + clen = sbuf.st_size; + statuscode = 200; + } + } + } else { + errno = ENOENT; + } + + if (clen < 0) { + content = realloc(content, 128); + clen = snprintf(content, 128,"Error opening HTML file: %s", strerror(errno)); + statuscode = 404; + } + + if (fd != -1) { + close(fd); + } + } + + // Get file extension and content type + snprintf(ctype, sizeof ctype, MODES_CONTENT_TYPE_HTML); // Default content type + ext = strrchr(getFile, '.'); + + if (strlen(ext) > 0) { + if (strstr(ext, ".json")) { + snprintf(ctype, sizeof ctype, MODES_CONTENT_TYPE_JSON); + } else if (strstr(ext, ".css")) { + snprintf(ctype, sizeof ctype, MODES_CONTENT_TYPE_CSS); + } else if (strstr(ext, ".js")) { + snprintf(ctype, sizeof ctype, MODES_CONTENT_TYPE_JS); + } + } + + // Create the header and send the reply + hdrlen = snprintf(hdr, sizeof(hdr), + "HTTP/1.1 %d \r\n" + "Server: Dump1090\r\n" + "Content-Type: %s\r\n" + "Connection: %s\r\n" + "Content-Length: %d\r\n" + "Cache-Control: no-cache, must-revalidate\r\n" + "Expires: Sat, 26 Jul 1997 05:00:00 GMT\r\n" + "\r\n", + statuscode, + ctype, + keepalive ? "keep-alive" : "close", + clen); + + if (Modes.debug & MODES_DEBUG_NET) { + printf("HTTP Reply header:\n%s", hdr); + } + + // Send header and content. +#ifndef _WIN32 + if ( (write(c->fd, hdr, hdrlen) != hdrlen) + || (write(c->fd, content, clen) != clen) ) { +#else + if ( (send(c->fd, hdr, hdrlen, 0) != hdrlen) + || (send(c->fd, content, clen, 0) != clen) ) { +#endif + free(content); + return 1; + } + free(content); + Modes.stat_http_requests++; + return !keepalive; +} +// +//========================================================================= +// +// This function polls the clients using read() in order to receive new +// messages from the net. +// +// The message is supposed to be separated from the next message by the +// separator 'sep', which is a null-terminated C string. +// +// Every full message received is decoded and passed to the higher layers +// calling the function's 'handler'. +// +// The handler returns 0 on success, or 1 to signal this function we should +// close the connection with the client in case of non-recoverable errors. +// +void modesReadFromClient(struct client *c, char *sep, + int(*handler)(struct client *, char *)) { + int left; + int nread; + int fullmsg; + int bContinue = 1; + char *s, *e, *p; + + while(bContinue) { + + fullmsg = 0; + left = MODES_CLIENT_BUF_SIZE - c->buflen; + // If our buffer is full discard it, this is some badly formatted shit + if (left <= 0) { + c->buflen = 0; + left = MODES_CLIENT_BUF_SIZE; + // If there is garbage, read more to discard it ASAP + } +#ifndef _WIN32 + nread = read(c->fd, c->buf+c->buflen, left); +#else + nread = recv(c->fd, c->buf+c->buflen, left, 0); + if (nread < 0) {errno = WSAGetLastError();} +#endif + if (nread == 0) { + modesCloseClient(c); + return; + } + + // If we didn't get all the data we asked for, then return once we've processed what we did get. + if (nread != left) { + bContinue = 0; + } +#ifndef _WIN32 + if ( (nread < 0 && errno != EAGAIN && errno != EWOULDBLOCK) || nread == 0 ) { // Error, or end of file +#else + if ( (nread < 0) && (errno != EWOULDBLOCK)) { // Error, or end of file +#endif + modesCloseClient(c); + return; + } + if (nread <= 0) { + break; // Serve next client + } + c->buflen += nread; + + // Always null-term so we are free to use strstr() (it won't affect binary case) + c->buf[c->buflen] = '\0'; + + e = s = c->buf; // Start with the start of buffer, first message + + if (c->service == Modes.bis) { + // This is the Beast Binary scanning case. + // If there is a complete message still in the buffer, there must be the separator 'sep' + // in the buffer, note that we full-scan the buffer at every read for simplicity. + + left = c->buflen; // Length of valid search for memchr() + while (left && ((s = memchr(e, (char) 0x1a, left)) != NULL)) { // The first byte of buffer 'should' be 0x1a + s++; // skip the 0x1a + if (*s == '1') { + e = s + MODEAC_MSG_BYTES + 8; // point past remainder of message + } else if (*s == '2') { + e = s + MODES_SHORT_MSG_BYTES + 8; + } else if (*s == '3') { + e = s + MODES_LONG_MSG_BYTES + 8; + } else { + e = s; // Not a valid beast message, skip + left = &(c->buf[c->buflen]) - e; + continue; + } + // we need to be careful of double escape characters in the message body + for (p = s; p < e; p++) { + if (0x1A == *p) { + p++; e++; + if (e > &(c->buf[c->buflen])) { + break; + } + } + } + left = &(c->buf[c->buflen]) - e; + if (left < 0) { // Incomplete message in buffer + e = s - 1; // point back at last found 0x1a. + break; + } + // Have a 0x1a followed by 1, 2 or 3 - pass message less 0x1a to handler. + if (handler(c, s)) { + modesCloseClient(c); + return; + } + fullmsg = 1; + } + s = e; // For the buffer remainder below + + } else { + // + // This is the ASCII scanning case, AVR RAW or HTTP at present + // If there is a complete message still in the buffer, there must be the separator 'sep' + // in the buffer, note that we full-scan the buffer at every read for simplicity. + // + while ((e = strstr(s, sep)) != NULL) { // end of first message if found + *e = '\0'; // The handler expects null terminated strings + if (handler(c, s)) { // Pass message to handler. + modesCloseClient(c); // Handler returns 1 on error to signal we . + return; // should close the client connection + } + s = e + strlen(sep); // Move to start of next message + fullmsg = 1; + } + } + + if (fullmsg) { // We processed something - so + c->buflen = &(c->buf[c->buflen]) - s; // Update the unprocessed buffer length + memmove(c->buf, s, c->buflen); // Move what's remaining to the start of the buffer + } else { // If no message was decoded process the next client + break; + } + } +} +// +//========================================================================= +// +// Read data from clients. This function actually delegates a lower-level +// function that depends on the kind of service (raw, http, ...). +// +void modesReadFromClients(void) { + + struct client *c = modesAcceptClients(); + + while (c) { + // Read next before servicing client incase the service routine deletes the client! + struct client *next = c->next; + + if (c->fd >= 0) { + if (c->service == Modes.ris) { + modesReadFromClient(c,"\n",decodeHexMessage); + } else if (c->service == Modes.bis) { + modesReadFromClient(c,"",decodeBinMessage); + } else if (c->service == Modes.https) { + modesReadFromClient(c,"\r\n\r\n",handleHTTPRequest); + } + } else { + modesFreeClient(c); + } + c = next; + } +} +// +// =============================== Network IO =========================== +// diff --git a/sdl1090/parula.h b/sdl1090/parula.h new file mode 100644 index 0000000..b5bdf41 --- /dev/null +++ b/sdl1090/parula.h @@ -0,0 +1,130 @@ +int parula[128][3] = { + {53, 42, 135}, + {54, 45, 141}, + {54, 48, 147}, + {54, 51, 153}, + {54, 54, 160}, + {54, 58, 166}, + {53, 61, 172}, + {52, 64, 179}, + {50, 67, 185}, + {47, 71, 192}, + {44, 74, 198}, + {39, 78, 205}, + {33, 82, 211}, + {25, 87, 217}, + {16, 91, 221}, + {8, 95, 224}, + {3, 98, 225}, + {1, 101, 225}, + {1, 104, 225}, + {2, 106, 225}, + {4, 108, 224}, + {6, 111, 223}, + {8, 113, 223}, + {10, 115, 222}, + {12, 117, 221}, + {14, 119, 219}, + {16, 120, 218}, + {17, 122, 217}, + {18, 124, 216}, + {19, 126, 215}, + {20, 128, 214}, + {20, 130, 213}, + {20, 132, 212}, + {20, 134, 211}, + {19, 136, 211}, + {18, 139, 210}, + {17, 141, 210}, + {15, 144, 210}, + {13, 146, 210}, + {11, 149, 210}, + {9, 151, 209}, + {8, 154, 209}, + {7, 156, 208}, + {6, 158, 207}, + {6, 160, 205}, + {6, 161, 204}, + {6, 163, 202}, + {6, 165, 201}, + {6, 166, 199}, + {6, 167, 197}, + {6, 169, 195}, + {7, 170, 193}, + {9, 171, 191}, + {11, 173, 188}, + {14, 174, 186}, + {17, 175, 184}, + {20, 176, 181}, + {23, 177, 179}, + {27, 178, 176}, + {31, 179, 173}, + {35, 181, 171}, + {39, 182, 168}, + {44, 183, 165}, + {48, 183, 162}, + {53, 184, 159}, + {58, 185, 156}, + {63, 186, 153}, + {68, 187, 150}, + {74, 188, 147}, + {80, 188, 144}, + {85, 189, 141}, + {91, 190, 138}, + {97, 190, 135}, + {103, 190, 133}, + {109, 191, 130}, + {115, 191, 127}, + {121, 191, 125}, + {126, 191, 122}, + {132, 191, 120}, + {137, 191, 118}, + {142, 191, 116}, + {147, 191, 114}, + {152, 191, 112}, + {157, 190, 110}, + {162, 190, 108}, + {167, 190, 106}, + {171, 190, 104}, + {176, 190, 103}, + {180, 189, 101}, + {185, 189, 99}, + {189, 189, 97}, + {193, 188, 96}, + {197, 188, 94}, + {202, 187, 92}, + {206, 187, 90}, + {210, 187, 89}, + {214, 186, 87}, + {218, 186, 85}, + {222, 186, 83}, + {226, 185, 82}, + {230, 185, 80}, + {234, 185, 78}, + {238, 185, 76}, + {242, 185, 73}, + {245, 186, 70}, + {249, 187, 67}, + {252, 188, 64}, + {254, 190, 61}, + {255, 193, 58}, + {255, 196, 55}, + {254, 198, 52}, + {254, 201, 50}, + {253, 203, 48}, + {252, 206, 46}, + {251, 209, 43}, + {249, 211, 41}, + {248, 214, 39}, + {247, 216, 37}, + {246, 219, 35}, + {245, 222, 33}, + {245, 225, 31}, + {245, 228, 29}, + {244, 232, 26}, + {245, 235, 24}, + {245, 239, 22}, + {246, 243, 19}, + {248, 247, 17}, + {249, 251, 14} +}; \ No newline at end of file diff --git a/sdl1090/pthreads/pthread.h b/sdl1090/pthreads/pthread.h new file mode 100644 index 0000000..b4072f7 --- /dev/null +++ b/sdl1090/pthreads/pthread.h @@ -0,0 +1,1368 @@ +/* This is an implementation of the threads API of POSIX 1003.1-2001. + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#if !defined( PTHREAD_H ) +#define PTHREAD_H + +/* + * See the README file for an explanation of the pthreads-win32 version + * numbering scheme and how the DLL is named etc. + */ +#define PTW32_VERSION 2,9,1,0 +#define PTW32_VERSION_STRING "2, 9, 1, 0\0" + +/* There are three implementations of cancel cleanup. + * Note that pthread.h is included in both application + * compilation units and also internally for the library. + * The code here and within the library aims to work + * for all reasonable combinations of environments. + * + * The three implementations are: + * + * WIN32 SEH + * C + * C++ + * + * Please note that exiting a push/pop block via + * "return", "exit", "break", or "continue" will + * lead to different behaviour amongst applications + * depending upon whether the library was built + * using SEH, C++, or C. For example, a library built + * with SEH will call the cleanup routine, while both + * C++ and C built versions will not. + */ + +/* + * Define defaults for cleanup code. + * Note: Unless the build explicitly defines one of the following, then + * we default to standard C style cleanup. This style uses setjmp/longjmp + * in the cancelation and thread exit implementations and therefore won't + * do stack unwinding if linked to applications that have it (e.g. + * C++ apps). This is currently consistent with most/all commercial Unix + * POSIX threads implementations. + */ +#if !defined( __CLEANUP_SEH ) && !defined( __CLEANUP_CXX ) && !defined( __CLEANUP_C ) +# define __CLEANUP_C +#endif + +#if defined( __CLEANUP_SEH ) && ( !defined( _MSC_VER ) && !defined(PTW32_RC_MSC)) +#error ERROR [__FILE__, line __LINE__]: SEH is not supported for this compiler. +#endif + +/* + * Stop here if we are being included by the resource compiler. + */ +#if !defined(RC_INVOKED) + +#undef PTW32_LEVEL + +#if defined(_POSIX_SOURCE) +#define PTW32_LEVEL 0 +/* Early POSIX */ +#endif + +#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 +#undef PTW32_LEVEL +#define PTW32_LEVEL 1 +/* Include 1b, 1c and 1d */ +#endif + +#if defined(INCLUDE_NP) +#undef PTW32_LEVEL +#define PTW32_LEVEL 2 +/* Include Non-Portable extensions */ +#endif + +#define PTW32_LEVEL_MAX 3 + +#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_LEVEL) +#define PTW32_LEVEL PTW32_LEVEL_MAX +/* Include everything */ +#endif + +#if defined(_UWIN) +# define HAVE_STRUCT_TIMESPEC 1 +# define HAVE_SIGNAL_H 1 +# undef HAVE_PTW32_CONFIG_H +# pragma comment(lib, "pthread") +#endif + +/* + * ------------------------------------------------------------- + * + * + * Module: pthread.h + * + * Purpose: + * Provides an implementation of PThreads based upon the + * standard: + * + * POSIX 1003.1-2001 + * and + * The Single Unix Specification version 3 + * + * (these two are equivalent) + * + * in order to enhance code portability between Windows, + * various commercial Unix implementations, and Linux. + * + * See the ANNOUNCE file for a full list of conforming + * routines and defined constants, and a list of missing + * routines and constants not defined in this implementation. + * + * Authors: + * There have been many contributors to this library. + * The initial implementation was contributed by + * John Bossom, and several others have provided major + * sections or revisions of parts of the implementation. + * Often significant effort has been contributed to + * find and fix important bugs and other problems to + * improve the reliability of the library, which sometimes + * is not reflected in the amount of code which changed as + * result. + * As much as possible, the contributors are acknowledged + * in the ChangeLog file in the source code distribution + * where their changes are noted in detail. + * + * Contributors are listed in the CONTRIBUTORS file. + * + * As usual, all bouquets go to the contributors, and all + * brickbats go to the project maintainer. + * + * Maintainer: + * The code base for this project is coordinated and + * eventually pre-tested, packaged, and made available by + * + * Ross Johnson + * + * QA Testers: + * Ultimately, the library is tested in the real world by + * a host of competent and demanding scientists and + * engineers who report bugs and/or provide solutions + * which are then fixed or incorporated into subsequent + * versions of the library. Each time a bug is fixed, a + * test case is written to prove the fix and ensure + * that later changes to the code don't reintroduce the + * same error. The number of test cases is slowly growing + * and therefore so is the code reliability. + * + * Compliance: + * See the file ANNOUNCE for the list of implemented + * and not-implemented routines and defined options. + * Of course, these are all defined is this file as well. + * + * Web site: + * The source code and other information about this library + * are available from + * + * http://sources.redhat.com/pthreads-win32/ + * + * ------------------------------------------------------------- + */ + +/* Try to avoid including windows.h */ +#if (defined(__MINGW64__) || defined(__MINGW32__)) && defined(__cplusplus) +#define PTW32_INCLUDE_WINDOWS_H +#endif + +#if defined(PTW32_INCLUDE_WINDOWS_H) +#include +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1300 || defined(__DMC__) +/* + * VC++6.0 or early compiler's header has no DWORD_PTR type. + */ +typedef unsigned long DWORD_PTR; +typedef unsigned long ULONG_PTR; +#endif +/* + * ----------------- + * autoconf switches + * ----------------- + */ + +#if defined(HAVE_PTW32_CONFIG_H) +#include "config.h" +#endif /* HAVE_PTW32_CONFIG_H */ + +#if !defined(NEED_FTIME) +#include +#else /* NEED_FTIME */ +/* use native WIN32 time API */ +#endif /* NEED_FTIME */ + +#if defined(HAVE_SIGNAL_H) +#include +#endif /* HAVE_SIGNAL_H */ + +#include + +/* + * Boolean values to make us independent of system includes. + */ +enum { + PTW32_FALSE = 0, + PTW32_TRUE = (! PTW32_FALSE) +}; + +/* + * This is a duplicate of what is in the autoconf config.h, + * which is only used when building the pthread-win32 libraries. + */ + +#if !defined(PTW32_CONFIG_H) +# if defined(WINCE) +# define NEED_ERRNO +# define NEED_SEM +# endif +# if defined(__MINGW64__) +# define HAVE_STRUCT_TIMESPEC +# define HAVE_MODE_T +# elif defined(_UWIN) || defined(__MINGW32__) +# define HAVE_MODE_T +# endif +#endif + +/* + * + */ + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX +#if defined(NEED_ERRNO) +#include "need_errno.h" +#else +#include +#endif +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +/* + * Several systems don't define some error numbers. + */ +#if !defined(ENOTSUP) +# define ENOTSUP 48 /* This is the value in Solaris. */ +#endif + +#if !defined(ETIMEDOUT) +# define ETIMEDOUT 10060 /* Same as WSAETIMEDOUT */ +#endif + +#if !defined(ENOSYS) +# define ENOSYS 140 /* Semi-arbitrary value */ +#endif + +#if !defined(EDEADLK) +# if defined(EDEADLOCK) +# define EDEADLK EDEADLOCK +# else +# define EDEADLK 36 /* This is the value in MSVC. */ +# endif +#endif + +/* POSIX 2008 - related to robust mutexes */ +#if !defined(EOWNERDEAD) +# define EOWNERDEAD 43 +#endif +#if !defined(ENOTRECOVERABLE) +# define ENOTRECOVERABLE 44 +#endif + +#include + +/* + * To avoid including windows.h we define only those things that we + * actually need from it. + */ +#if !defined(PTW32_INCLUDE_WINDOWS_H) +#if !defined(HANDLE) +# define PTW32__HANDLE_DEF +# define HANDLE void * +#endif +#if !defined(DWORD) +# define PTW32__DWORD_DEF +# define DWORD unsigned long +#endif +#endif + +#if !defined(HAVE_STRUCT_TIMESPEC) +#define HAVE_STRUCT_TIMESPEC +#if !defined(_TIMESPEC_DEFINED) +#define _TIMESPEC_DEFINED +struct timespec { + time_t tv_sec; + long tv_nsec; +}; +#endif /* _TIMESPEC_DEFINED */ +#endif /* HAVE_STRUCT_TIMESPEC */ + +#if !defined(SIG_BLOCK) +#define SIG_BLOCK 0 +#endif /* SIG_BLOCK */ + +#if !defined(SIG_UNBLOCK) +#define SIG_UNBLOCK 1 +#endif /* SIG_UNBLOCK */ + +#if !defined(SIG_SETMASK) +#define SIG_SETMASK 2 +#endif /* SIG_SETMASK */ + +#if defined(__cplusplus) +extern "C" +{ +#endif /* __cplusplus */ + +/* + * ------------------------------------------------------------- + * + * POSIX 1003.1-2001 Options + * ========================= + * + * Options are normally set in , which is not provided + * with pthreads-win32. + * + * For conformance with the Single Unix Specification (version 3), all of the + * options below are defined, and have a value of either -1 (not supported) + * or 200112L (supported). + * + * These options can neither be left undefined nor have a value of 0, because + * either indicates that sysconf(), which is not implemented, may be used at + * runtime to check the status of the option. + * + * _POSIX_THREADS (== 200112L) + * If == 200112L, you can use threads + * + * _POSIX_THREAD_ATTR_STACKSIZE (== 200112L) + * If == 200112L, you can control the size of a thread's + * stack + * pthread_attr_getstacksize + * pthread_attr_setstacksize + * + * _POSIX_THREAD_ATTR_STACKADDR (== -1) + * If == 200112L, you can allocate and control a thread's + * stack. If not supported, the following functions + * will return ENOSYS, indicating they are not + * supported: + * pthread_attr_getstackaddr + * pthread_attr_setstackaddr + * + * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1) + * If == 200112L, you can use realtime scheduling. + * This option indicates that the behaviour of some + * implemented functions conforms to the additional TPS + * requirements in the standard. E.g. rwlocks favour + * writers over readers when threads have equal priority. + * + * _POSIX_THREAD_PRIO_INHERIT (== -1) + * If == 200112L, you can create priority inheritance + * mutexes. + * pthread_mutexattr_getprotocol + + * pthread_mutexattr_setprotocol + + * + * _POSIX_THREAD_PRIO_PROTECT (== -1) + * If == 200112L, you can create priority ceiling mutexes + * Indicates the availability of: + * pthread_mutex_getprioceiling + * pthread_mutex_setprioceiling + * pthread_mutexattr_getprioceiling + * pthread_mutexattr_getprotocol + + * pthread_mutexattr_setprioceiling + * pthread_mutexattr_setprotocol + + * + * _POSIX_THREAD_PROCESS_SHARED (== -1) + * If set, you can create mutexes and condition + * variables that can be shared with another + * process.If set, indicates the availability + * of: + * pthread_mutexattr_getpshared + * pthread_mutexattr_setpshared + * pthread_condattr_getpshared + * pthread_condattr_setpshared + * + * _POSIX_THREAD_SAFE_FUNCTIONS (== 200112L) + * If == 200112L you can use the special *_r library + * functions that provide thread-safe behaviour + * + * _POSIX_READER_WRITER_LOCKS (== 200112L) + * If == 200112L, you can use read/write locks + * + * _POSIX_SPIN_LOCKS (== 200112L) + * If == 200112L, you can use spin locks + * + * _POSIX_BARRIERS (== 200112L) + * If == 200112L, you can use barriers + * + * + These functions provide both 'inherit' and/or + * 'protect' protocol, based upon these macro + * settings. + * + * ------------------------------------------------------------- + */ + +/* + * POSIX Options + */ +#undef _POSIX_THREADS +#define _POSIX_THREADS 200809L + +#undef _POSIX_READER_WRITER_LOCKS +#define _POSIX_READER_WRITER_LOCKS 200809L + +#undef _POSIX_SPIN_LOCKS +#define _POSIX_SPIN_LOCKS 200809L + +#undef _POSIX_BARRIERS +#define _POSIX_BARRIERS 200809L + +#undef _POSIX_THREAD_SAFE_FUNCTIONS +#define _POSIX_THREAD_SAFE_FUNCTIONS 200809L + +#undef _POSIX_THREAD_ATTR_STACKSIZE +#define _POSIX_THREAD_ATTR_STACKSIZE 200809L + +/* + * The following options are not supported + */ +#undef _POSIX_THREAD_ATTR_STACKADDR +#define _POSIX_THREAD_ATTR_STACKADDR -1 + +#undef _POSIX_THREAD_PRIO_INHERIT +#define _POSIX_THREAD_PRIO_INHERIT -1 + +#undef _POSIX_THREAD_PRIO_PROTECT +#define _POSIX_THREAD_PRIO_PROTECT -1 + +/* TPS is not fully supported. */ +#undef _POSIX_THREAD_PRIORITY_SCHEDULING +#define _POSIX_THREAD_PRIORITY_SCHEDULING -1 + +#undef _POSIX_THREAD_PROCESS_SHARED +#define _POSIX_THREAD_PROCESS_SHARED -1 + + +/* + * POSIX 1003.1-2001 Limits + * =========================== + * + * These limits are normally set in , which is not provided with + * pthreads-win32. + * + * PTHREAD_DESTRUCTOR_ITERATIONS + * Maximum number of attempts to destroy + * a thread's thread-specific data on + * termination (must be at least 4) + * + * PTHREAD_KEYS_MAX + * Maximum number of thread-specific data keys + * available per process (must be at least 128) + * + * PTHREAD_STACK_MIN + * Minimum supported stack size for a thread + * + * PTHREAD_THREADS_MAX + * Maximum number of threads supported per + * process (must be at least 64). + * + * SEM_NSEMS_MAX + * The maximum number of semaphores a process can have. + * (must be at least 256) + * + * SEM_VALUE_MAX + * The maximum value a semaphore can have. + * (must be at least 32767) + * + */ +#undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS +#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4 + +#undef PTHREAD_DESTRUCTOR_ITERATIONS +#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS + +#undef _POSIX_THREAD_KEYS_MAX +#define _POSIX_THREAD_KEYS_MAX 128 + +#undef PTHREAD_KEYS_MAX +#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX + +#undef PTHREAD_STACK_MIN +#define PTHREAD_STACK_MIN 0 + +#undef _POSIX_THREAD_THREADS_MAX +#define _POSIX_THREAD_THREADS_MAX 64 + + /* Arbitrary value */ +#undef PTHREAD_THREADS_MAX +#define PTHREAD_THREADS_MAX 2019 + +#undef _POSIX_SEM_NSEMS_MAX +#define _POSIX_SEM_NSEMS_MAX 256 + + /* Arbitrary value */ +#undef SEM_NSEMS_MAX +#define SEM_NSEMS_MAX 1024 + +#undef _POSIX_SEM_VALUE_MAX +#define _POSIX_SEM_VALUE_MAX 32767 + +#undef SEM_VALUE_MAX +#define SEM_VALUE_MAX INT_MAX + + +#if defined(__GNUC__) && !defined(__declspec) +# error Please upgrade your GNU compiler to one that supports __declspec. +#endif + +/* + * When building the library, you should define PTW32_BUILD so that + * the variables/functions are exported correctly. When using the library, + * do NOT define PTW32_BUILD, and then the variables/functions will + * be imported correctly. + */ +#if !defined(PTW32_STATIC_LIB) +# if defined(PTW32_BUILD) +# define PTW32_DLLPORT __declspec (dllexport) +# else +# define PTW32_DLLPORT __declspec (dllimport) +# endif +#else +# define PTW32_DLLPORT +#endif + +/* + * The Open Watcom C/C++ compiler uses a non-standard calling convention + * that passes function args in registers unless __cdecl is explicitly specified + * in exposed function prototypes. + * + * We force all calls to cdecl even though this could slow Watcom code down + * slightly. If you know that the Watcom compiler will be used to build both + * the DLL and application, then you can probably define this as a null string. + * Remember that pthread.h (this file) is used for both the DLL and application builds. + */ +#define PTW32_CDECL __cdecl + +#if defined(_UWIN) && PTW32_LEVEL >= PTW32_LEVEL_MAX +# include +#else +/* + * Generic handle type - intended to extend uniqueness beyond + * that available with a simple pointer. It should scale for either + * IA-32 or IA-64. + */ +typedef struct { + void * p; /* Pointer to actual object */ + unsigned int x; /* Extra information - reuse count etc */ +} ptw32_handle_t; + +typedef ptw32_handle_t pthread_t; +typedef struct pthread_attr_t_ * pthread_attr_t; +typedef struct pthread_once_t_ pthread_once_t; +typedef struct pthread_key_t_ * pthread_key_t; +typedef struct pthread_mutex_t_ * pthread_mutex_t; +typedef struct pthread_mutexattr_t_ * pthread_mutexattr_t; +typedef struct pthread_cond_t_ * pthread_cond_t; +typedef struct pthread_condattr_t_ * pthread_condattr_t; +#endif +typedef struct pthread_rwlock_t_ * pthread_rwlock_t; +typedef struct pthread_rwlockattr_t_ * pthread_rwlockattr_t; +typedef struct pthread_spinlock_t_ * pthread_spinlock_t; +typedef struct pthread_barrier_t_ * pthread_barrier_t; +typedef struct pthread_barrierattr_t_ * pthread_barrierattr_t; + +/* + * ==================== + * ==================== + * POSIX Threads + * ==================== + * ==================== + */ + +enum { +/* + * pthread_attr_{get,set}detachstate + */ + PTHREAD_CREATE_JOINABLE = 0, /* Default */ + PTHREAD_CREATE_DETACHED = 1, + +/* + * pthread_attr_{get,set}inheritsched + */ + PTHREAD_INHERIT_SCHED = 0, + PTHREAD_EXPLICIT_SCHED = 1, /* Default */ + +/* + * pthread_{get,set}scope + */ + PTHREAD_SCOPE_PROCESS = 0, + PTHREAD_SCOPE_SYSTEM = 1, /* Default */ + +/* + * pthread_setcancelstate paramters + */ + PTHREAD_CANCEL_ENABLE = 0, /* Default */ + PTHREAD_CANCEL_DISABLE = 1, + +/* + * pthread_setcanceltype parameters + */ + PTHREAD_CANCEL_ASYNCHRONOUS = 0, + PTHREAD_CANCEL_DEFERRED = 1, /* Default */ + +/* + * pthread_mutexattr_{get,set}pshared + * pthread_condattr_{get,set}pshared + */ + PTHREAD_PROCESS_PRIVATE = 0, + PTHREAD_PROCESS_SHARED = 1, + +/* + * pthread_mutexattr_{get,set}robust + */ + PTHREAD_MUTEX_STALLED = 0, /* Default */ + PTHREAD_MUTEX_ROBUST = 1, + +/* + * pthread_barrier_wait + */ + PTHREAD_BARRIER_SERIAL_THREAD = -1 +}; + +/* + * ==================== + * ==================== + * Cancelation + * ==================== + * ==================== + */ +#define PTHREAD_CANCELED ((void *)(size_t) -1) + + +/* + * ==================== + * ==================== + * Once Key + * ==================== + * ==================== + */ +#define PTHREAD_ONCE_INIT { PTW32_FALSE, 0, 0, 0} + +struct pthread_once_t_ +{ + int done; /* indicates if user function has been executed */ + void * lock; + int reserved1; + int reserved2; +}; + + +/* + * ==================== + * ==================== + * Object initialisers + * ==================== + * ==================== + */ +#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -1) +#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -2) +#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -3) + +/* + * Compatibility with LinuxThreads + */ +#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER +#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER + +#define PTHREAD_COND_INITIALIZER ((pthread_cond_t)(size_t) -1) + +#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t)(size_t) -1) + +#define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t)(size_t) -1) + + +/* + * Mutex types. + */ +enum +{ + /* Compatibility with LinuxThreads */ + PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP, + /* For compatibility with POSIX */ + PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP, + PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, + PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, + PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL +}; + + +typedef struct ptw32_cleanup_t ptw32_cleanup_t; + +#if defined(_MSC_VER) +/* Disable MSVC 'anachronism used' warning */ +#pragma warning( disable : 4229 ) +#endif + +typedef void (* PTW32_CDECL ptw32_cleanup_callback_t)(void *); + +#if defined(_MSC_VER) +#pragma warning( default : 4229 ) +#endif + +struct ptw32_cleanup_t +{ + ptw32_cleanup_callback_t routine; + void *arg; + struct ptw32_cleanup_t *prev; +}; + +#if defined(__CLEANUP_SEH) + /* + * WIN32 SEH version of cancel cleanup. + */ + +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + ptw32_cleanup_t _cleanup; \ + \ + _cleanup.routine = (ptw32_cleanup_callback_t)(_rout); \ + _cleanup.arg = (_arg); \ + __try \ + { \ + +#define pthread_cleanup_pop( _execute ) \ + } \ + __finally \ + { \ + if( _execute || AbnormalTermination()) \ + { \ + (*(_cleanup.routine))( _cleanup.arg ); \ + } \ + } \ + } + +#else /* __CLEANUP_SEH */ + +#if defined(__CLEANUP_C) + + /* + * C implementation of PThreads cancel cleanup + */ + +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + ptw32_cleanup_t _cleanup; \ + \ + ptw32_push_cleanup( &_cleanup, (ptw32_cleanup_callback_t) (_rout), (_arg) ); \ + +#define pthread_cleanup_pop( _execute ) \ + (void) ptw32_pop_cleanup( _execute ); \ + } + +#else /* __CLEANUP_C */ + +#if defined(__CLEANUP_CXX) + + /* + * C++ version of cancel cleanup. + * - John E. Bossom. + */ + + class PThreadCleanup { + /* + * PThreadCleanup + * + * Purpose + * This class is a C++ helper class that is + * used to implement pthread_cleanup_push/ + * pthread_cleanup_pop. + * The destructor of this class automatically + * pops the pushed cleanup routine regardless + * of how the code exits the scope + * (i.e. such as by an exception) + */ + ptw32_cleanup_callback_t cleanUpRout; + void * obj; + int executeIt; + + public: + PThreadCleanup() : + cleanUpRout( 0 ), + obj( 0 ), + executeIt( 0 ) + /* + * No cleanup performed + */ + { + } + + PThreadCleanup( + ptw32_cleanup_callback_t routine, + void * arg ) : + cleanUpRout( routine ), + obj( arg ), + executeIt( 1 ) + /* + * Registers a cleanup routine for 'arg' + */ + { + } + + ~PThreadCleanup() + { + if ( executeIt && ((void *) cleanUpRout != (void *) 0) ) + { + (void) (*cleanUpRout)( obj ); + } + } + + void execute( int exec ) + { + executeIt = exec; + } + }; + + /* + * C++ implementation of PThreads cancel cleanup; + * This implementation takes advantage of a helper + * class who's destructor automatically calls the + * cleanup routine if we exit our scope weirdly + */ +#define pthread_cleanup_push( _rout, _arg ) \ + { \ + PThreadCleanup cleanup((ptw32_cleanup_callback_t)(_rout), \ + (void *) (_arg) ); + +#define pthread_cleanup_pop( _execute ) \ + cleanup.execute( _execute ); \ + } + +#else + +#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined. + +#endif /* __CLEANUP_CXX */ + +#endif /* __CLEANUP_C */ + +#endif /* __CLEANUP_SEH */ + +/* + * =============== + * =============== + * Methods + * =============== + * =============== + */ + +/* + * PThread Attribute Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getdetachstate (const pthread_attr_t * attr, + int *detachstate); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstackaddr (const pthread_attr_t * attr, + void **stackaddr); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstacksize (const pthread_attr_t * attr, + size_t * stacksize); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setdetachstate (pthread_attr_t * attr, + int detachstate); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstackaddr (pthread_attr_t * attr, + void *stackaddr); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstacksize (pthread_attr_t * attr, + size_t stacksize); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedparam (const pthread_attr_t *attr, + struct sched_param *param); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedparam (pthread_attr_t *attr, + const struct sched_param *param); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedpolicy (pthread_attr_t *, + int); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedpolicy (const pthread_attr_t *, + int *); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setinheritsched(pthread_attr_t * attr, + int inheritsched); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getinheritsched(const pthread_attr_t * attr, + int * inheritsched); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_setscope (pthread_attr_t *, + int); + +PTW32_DLLPORT int PTW32_CDECL pthread_attr_getscope (const pthread_attr_t *, + int *); + +/* + * PThread Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid, + const pthread_attr_t * attr, + void *(PTW32_CDECL *start) (void *), + void *arg); + +PTW32_DLLPORT int PTW32_CDECL pthread_detach (pthread_t tid); + +PTW32_DLLPORT int PTW32_CDECL pthread_equal (pthread_t t1, + pthread_t t2); + +PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr); + +PTW32_DLLPORT int PTW32_CDECL pthread_join (pthread_t thread, + void **value_ptr); + +PTW32_DLLPORT pthread_t PTW32_CDECL pthread_self (void); + +PTW32_DLLPORT int PTW32_CDECL pthread_cancel (pthread_t thread); + +PTW32_DLLPORT int PTW32_CDECL pthread_setcancelstate (int state, + int *oldstate); + +PTW32_DLLPORT int PTW32_CDECL pthread_setcanceltype (int type, + int *oldtype); + +PTW32_DLLPORT void PTW32_CDECL pthread_testcancel (void); + +PTW32_DLLPORT int PTW32_CDECL pthread_once (pthread_once_t * once_control, + void (PTW32_CDECL *init_routine) (void)); + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX +PTW32_DLLPORT ptw32_cleanup_t * PTW32_CDECL ptw32_pop_cleanup (int execute); + +PTW32_DLLPORT void PTW32_CDECL ptw32_push_cleanup (ptw32_cleanup_t * cleanup, + ptw32_cleanup_callback_t routine, + void *arg); +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +/* + * Thread Specific Data Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_key_create (pthread_key_t * key, + void (PTW32_CDECL *destructor) (void *)); + +PTW32_DLLPORT int PTW32_CDECL pthread_key_delete (pthread_key_t key); + +PTW32_DLLPORT int PTW32_CDECL pthread_setspecific (pthread_key_t key, + const void *value); + +PTW32_DLLPORT void * PTW32_CDECL pthread_getspecific (pthread_key_t key); + + +/* + * Mutex Attribute Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_init (pthread_mutexattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_destroy (pthread_mutexattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getpshared (const pthread_mutexattr_t + * attr, + int *pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, + int pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_gettype (const pthread_mutexattr_t * attr, int *kind); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setrobust( + pthread_mutexattr_t *attr, + int robust); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getrobust( + const pthread_mutexattr_t * attr, + int * robust); + +/* + * Barrier Attribute Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_init (pthread_barrierattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_destroy (pthread_barrierattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_getpshared (const pthread_barrierattr_t + * attr, + int *pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_setpshared (pthread_barrierattr_t * attr, + int pshared); + +/* + * Mutex Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex, + const pthread_mutexattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_timedlock(pthread_mutex_t * mutex, + const struct timespec *abstime); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_mutex_consistent (pthread_mutex_t * mutex); + +/* + * Spinlock Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_spin_init (pthread_spinlock_t * lock, int pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_spin_destroy (pthread_spinlock_t * lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_spin_lock (pthread_spinlock_t * lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_spin_trylock (pthread_spinlock_t * lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_spin_unlock (pthread_spinlock_t * lock); + +/* + * Barrier Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_barrier_init (pthread_barrier_t * barrier, + const pthread_barrierattr_t * attr, + unsigned int count); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrier_destroy (pthread_barrier_t * barrier); + +PTW32_DLLPORT int PTW32_CDECL pthread_barrier_wait (pthread_barrier_t * barrier); + +/* + * Condition Variable Attribute Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_init (pthread_condattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_destroy (pthread_condattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_getpshared (const pthread_condattr_t * attr, + int *pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_condattr_setpshared (pthread_condattr_t * attr, + int pshared); + +/* + * Condition Variable Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_cond_init (pthread_cond_t * cond, + const pthread_condattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_destroy (pthread_cond_t * cond); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_wait (pthread_cond_t * cond, + pthread_mutex_t * mutex); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_timedwait (pthread_cond_t * cond, + pthread_mutex_t * mutex, + const struct timespec *abstime); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_signal (pthread_cond_t * cond); + +PTW32_DLLPORT int PTW32_CDECL pthread_cond_broadcast (pthread_cond_t * cond); + +/* + * Scheduling + */ +PTW32_DLLPORT int PTW32_CDECL pthread_setschedparam (pthread_t thread, + int policy, + const struct sched_param *param); + +PTW32_DLLPORT int PTW32_CDECL pthread_getschedparam (pthread_t thread, + int *policy, + struct sched_param *param); + +PTW32_DLLPORT int PTW32_CDECL pthread_setconcurrency (int); + +PTW32_DLLPORT int PTW32_CDECL pthread_getconcurrency (void); + +/* + * Read-Write Lock Functions + */ +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_init(pthread_rwlock_t *lock, + const pthread_rwlockattr_t *attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_destroy(pthread_rwlock_t *lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_tryrdlock(pthread_rwlock_t *); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_trywrlock(pthread_rwlock_t *); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_rdlock(pthread_rwlock_t *lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedrdlock(pthread_rwlock_t *lock, + const struct timespec *abstime); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_wrlock(pthread_rwlock_t *lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedwrlock(pthread_rwlock_t *lock, + const struct timespec *abstime); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_unlock(pthread_rwlock_t *lock); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_init (pthread_rwlockattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr, + int *pshared); + +PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr, + int pshared); + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 + +/* + * Signal Functions. Should be defined in but MSVC and MinGW32 + * already have signal.h that don't define these. + */ +PTW32_DLLPORT int PTW32_CDECL pthread_kill(pthread_t thread, int sig); + +/* + * Non-portable functions + */ + +/* + * Compatibility with Linux. + */ +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, + int kind); +PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, + int *kind); + +/* + * Possibly supported by other POSIX threads implementations + */ +PTW32_DLLPORT int PTW32_CDECL pthread_delay_np (struct timespec * interval); +PTW32_DLLPORT int PTW32_CDECL pthread_num_processors_np(void); +PTW32_DLLPORT unsigned __int64 PTW32_CDECL pthread_getunique_np(pthread_t thread); + +/* + * Useful if an application wants to statically link + * the lib rather than load the DLL at run-time. + */ +PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_attach_np(void); +PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_detach_np(void); +PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_attach_np(void); +PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_detach_np(void); + +/* + * Features that are auto-detected at load/run time. + */ +PTW32_DLLPORT int PTW32_CDECL pthread_win32_test_features_np(int); +enum ptw32_features { + PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE = 0x0001, /* System provides it. */ + PTW32_ALERTABLE_ASYNC_CANCEL = 0x0002 /* Can cancel blocked threads. */ +}; + +/* + * Register a system time change with the library. + * Causes the library to perform various functions + * in response to the change. Should be called whenever + * the application's top level window receives a + * WM_TIMECHANGE message. It can be passed directly to + * pthread_create() as a new thread if desired. + */ +PTW32_DLLPORT void * PTW32_CDECL pthread_timechange_handler_np(void *); + +#endif /*PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 */ + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX + +/* + * Returns the Win32 HANDLE for the POSIX thread. + */ +PTW32_DLLPORT HANDLE PTW32_CDECL pthread_getw32threadhandle_np(pthread_t thread); +/* + * Returns the win32 thread ID for POSIX thread. + */ +PTW32_DLLPORT DWORD PTW32_CDECL pthread_getw32threadid_np (pthread_t thread); + + +/* + * Protected Methods + * + * This function blocks until the given WIN32 handle + * is signaled or pthread_cancel had been called. + * This function allows the caller to hook into the + * PThreads cancel mechanism. It is implemented using + * + * WaitForMultipleObjects + * + * on 'waitHandle' and a manually reset WIN32 Event + * used to implement pthread_cancel. The 'timeout' + * argument to TimedWait is simply passed to + * WaitForMultipleObjects. + */ +PTW32_DLLPORT int PTW32_CDECL pthreadCancelableWait (HANDLE waitHandle); +PTW32_DLLPORT int PTW32_CDECL pthreadCancelableTimedWait (HANDLE waitHandle, + DWORD timeout); + +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +/* + * Thread-Safe C Runtime Library Mappings. + */ +#if !defined(_UWIN) +# if defined(NEED_ERRNO) + PTW32_DLLPORT int * PTW32_CDECL _errno( void ); +# else +# if !defined(errno) +# if (defined(_MT) || defined(_DLL)) + __declspec(dllimport) extern int * __cdecl _errno(void); +# define errno (*_errno()) +# endif +# endif +# endif +#endif + +/* + * Some compiler environments don't define some things. + */ +#if defined(__BORLANDC__) +# define _ftime ftime +# define _timeb timeb +#endif + +#if defined(__cplusplus) + +/* + * Internal exceptions + */ +class ptw32_exception {}; +class ptw32_exception_cancel : public ptw32_exception {}; +class ptw32_exception_exit : public ptw32_exception {}; + +#endif + +#if PTW32_LEVEL >= PTW32_LEVEL_MAX + +/* FIXME: This is only required if the library was built using SEH */ +/* + * Get internal SEH tag + */ +PTW32_DLLPORT DWORD PTW32_CDECL ptw32_get_exception_services_code(void); + +#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ + +#if !defined(PTW32_BUILD) + +#if defined(__CLEANUP_SEH) + +/* + * Redefine the SEH __except keyword to ensure that applications + * propagate our internal exceptions up to the library's internal handlers. + */ +#define __except( E ) \ + __except( ( GetExceptionCode() == ptw32_get_exception_services_code() ) \ + ? EXCEPTION_CONTINUE_SEARCH : ( E ) ) + +#endif /* __CLEANUP_SEH */ + +#if defined(__CLEANUP_CXX) + +/* + * Redefine the C++ catch keyword to ensure that applications + * propagate our internal exceptions up to the library's internal handlers. + */ +#if defined(_MSC_VER) + /* + * WARNING: Replace any 'catch( ... )' with 'PtW32CatchAll' + * if you want Pthread-Win32 cancelation and pthread_exit to work. + */ + +#if !defined(PtW32NoCatchWarn) + +#pragma message("Specify \"/DPtW32NoCatchWarn\" compiler flag to skip this message.") +#pragma message("------------------------------------------------------------------") +#pragma message("When compiling applications with MSVC++ and C++ exception handling:") +#pragma message(" Replace any 'catch( ... )' in routines called from POSIX threads") +#pragma message(" with 'PtW32CatchAll' or 'CATCHALL' if you want POSIX thread") +#pragma message(" cancelation and pthread_exit to work. For example:") +#pragma message("") +#pragma message(" #if defined(PtW32CatchAll)") +#pragma message(" PtW32CatchAll") +#pragma message(" #else") +#pragma message(" catch(...)") +#pragma message(" #endif") +#pragma message(" {") +#pragma message(" /* Catchall block processing */") +#pragma message(" }") +#pragma message("------------------------------------------------------------------") + +#endif + +#define PtW32CatchAll \ + catch( ptw32_exception & ) { throw; } \ + catch( ... ) + +#else /* _MSC_VER */ + +#define catch( E ) \ + catch( ptw32_exception & ) { throw; } \ + catch( E ) + +#endif /* _MSC_VER */ + +#endif /* __CLEANUP_CXX */ + +#endif /* ! PTW32_BUILD */ + +#if defined(__cplusplus) +} /* End of extern "C" */ +#endif /* __cplusplus */ + +#if defined(PTW32__HANDLE_DEF) +# undef HANDLE +#endif +#if defined(PTW32__DWORD_DEF) +# undef DWORD +#endif + +#undef PTW32_LEVEL +#undef PTW32_LEVEL_MAX + +#endif /* ! RC_INVOKED */ + +#endif /* PTHREAD_H */ diff --git a/sdl1090/pthreads/sched.h b/sdl1090/pthreads/sched.h new file mode 100644 index 0000000..f36a97a --- /dev/null +++ b/sdl1090/pthreads/sched.h @@ -0,0 +1,183 @@ +/* + * Module: sched.h + * + * Purpose: + * Provides an implementation of POSIX realtime extensions + * as defined in + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ +#if !defined(_SCHED_H) +#define _SCHED_H + +#undef PTW32_SCHED_LEVEL + +#if defined(_POSIX_SOURCE) +#define PTW32_SCHED_LEVEL 0 +/* Early POSIX */ +#endif + +#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 +#undef PTW32_SCHED_LEVEL +#define PTW32_SCHED_LEVEL 1 +/* Include 1b, 1c and 1d */ +#endif + +#if defined(INCLUDE_NP) +#undef PTW32_SCHED_LEVEL +#define PTW32_SCHED_LEVEL 2 +/* Include Non-Portable extensions */ +#endif + +#define PTW32_SCHED_LEVEL_MAX 3 + +#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_SCHED_LEVEL) +#define PTW32_SCHED_LEVEL PTW32_SCHED_LEVEL_MAX +/* Include everything */ +#endif + + +#if defined(__GNUC__) && !defined(__declspec) +# error Please upgrade your GNU compiler to one that supports __declspec. +#endif + +/* + * When building the library, you should define PTW32_BUILD so that + * the variables/functions are exported correctly. When using the library, + * do NOT define PTW32_BUILD, and then the variables/functions will + * be imported correctly. + */ +#if !defined(PTW32_STATIC_LIB) +# if defined(PTW32_BUILD) +# define PTW32_DLLPORT __declspec (dllexport) +# else +# define PTW32_DLLPORT __declspec (dllimport) +# endif +#else +# define PTW32_DLLPORT +#endif + +/* + * This is a duplicate of what is in the autoconf config.h, + * which is only used when building the pthread-win32 libraries. + */ + +#if !defined(PTW32_CONFIG_H) +# if defined(WINCE) +# define NEED_ERRNO +# define NEED_SEM +# endif +# if defined(__MINGW64__) +# define HAVE_STRUCT_TIMESPEC +# define HAVE_MODE_T +# elif defined(_UWIN) || defined(__MINGW32__) +# define HAVE_MODE_T +# endif +#endif + +/* + * + */ + +#if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX +#if defined(NEED_ERRNO) +#include "need_errno.h" +#else +#include +#endif +#endif /* PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX */ + +#if (defined(__MINGW64__) || defined(__MINGW32__)) || defined(_UWIN) +# if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX +/* For pid_t */ +# include +/* Required by Unix 98 */ +# include +# else + typedef int pid_t; +# endif +#else + typedef int pid_t; +#endif + +/* Thread scheduling policies */ + +enum { + SCHED_OTHER = 0, + SCHED_FIFO, + SCHED_RR, + SCHED_MIN = SCHED_OTHER, + SCHED_MAX = SCHED_RR +}; + +struct sched_param { + int sched_priority; +}; + +#if defined(__cplusplus) +extern "C" +{ +#endif /* __cplusplus */ + +PTW32_DLLPORT int __cdecl sched_yield (void); + +PTW32_DLLPORT int __cdecl sched_get_priority_min (int policy); + +PTW32_DLLPORT int __cdecl sched_get_priority_max (int policy); + +PTW32_DLLPORT int __cdecl sched_setscheduler (pid_t pid, int policy); + +PTW32_DLLPORT int __cdecl sched_getscheduler (pid_t pid); + +/* + * Note that this macro returns ENOTSUP rather than + * ENOSYS as might be expected. However, returning ENOSYS + * should mean that sched_get_priority_{min,max} are + * not implemented as well as sched_rr_get_interval. + * This is not the case, since we just don't support + * round-robin scheduling. Therefore I have chosen to + * return the same value as sched_setscheduler when + * SCHED_RR is passed to it. + */ +#define sched_rr_get_interval(_pid, _interval) \ + ( errno = ENOTSUP, (int) -1 ) + + +#if defined(__cplusplus) +} /* End of extern "C" */ +#endif /* __cplusplus */ + +#undef PTW32_SCHED_LEVEL +#undef PTW32_SCHED_LEVEL_MAX + +#endif /* !_SCHED_H */ + diff --git a/sdl1090/pthreads/semaphore.h b/sdl1090/pthreads/semaphore.h new file mode 100644 index 0000000..c6e9407 --- /dev/null +++ b/sdl1090/pthreads/semaphore.h @@ -0,0 +1,169 @@ +/* + * Module: semaphore.h + * + * Purpose: + * Semaphores aren't actually part of the PThreads standard. + * They are defined by the POSIX Standard: + * + * POSIX 1003.1b-1993 (POSIX.1b) + * + * -------------------------------------------------------------------------- + * + * Pthreads-win32 - POSIX Threads Library for Win32 + * Copyright(C) 1998 John E. Bossom + * Copyright(C) 1999,2005 Pthreads-win32 contributors + * + * Contact Email: rpj@callisto.canberra.edu.au + * + * The current list of contributors is contained + * in the file CONTRIBUTORS included with the source + * code distribution. The list can also be seen at the + * following World Wide Web location: + * http://sources.redhat.com/pthreads-win32/contributors.html + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library in the file COPYING.LIB; + * if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ +#if !defined( SEMAPHORE_H ) +#define SEMAPHORE_H + +#undef PTW32_SEMAPHORE_LEVEL + +#if defined(_POSIX_SOURCE) +#define PTW32_SEMAPHORE_LEVEL 0 +/* Early POSIX */ +#endif + +#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 +#undef PTW32_SEMAPHORE_LEVEL +#define PTW32_SEMAPHORE_LEVEL 1 +/* Include 1b, 1c and 1d */ +#endif + +#if defined(INCLUDE_NP) +#undef PTW32_SEMAPHORE_LEVEL +#define PTW32_SEMAPHORE_LEVEL 2 +/* Include Non-Portable extensions */ +#endif + +#define PTW32_SEMAPHORE_LEVEL_MAX 3 + +#if !defined(PTW32_SEMAPHORE_LEVEL) +#define PTW32_SEMAPHORE_LEVEL PTW32_SEMAPHORE_LEVEL_MAX +/* Include everything */ +#endif + +#if defined(__GNUC__) && ! defined (__declspec) +# error Please upgrade your GNU compiler to one that supports __declspec. +#endif + +/* + * When building the library, you should define PTW32_BUILD so that + * the variables/functions are exported correctly. When using the library, + * do NOT define PTW32_BUILD, and then the variables/functions will + * be imported correctly. + */ +#if !defined(PTW32_STATIC_LIB) +# if defined(PTW32_BUILD) +# define PTW32_DLLPORT __declspec (dllexport) +# else +# define PTW32_DLLPORT __declspec (dllimport) +# endif +#else +# define PTW32_DLLPORT +#endif + +/* + * This is a duplicate of what is in the autoconf config.h, + * which is only used when building the pthread-win32 libraries. + */ + +#if !defined(PTW32_CONFIG_H) +# if defined(WINCE) +# define NEED_ERRNO +# define NEED_SEM +# endif +# if defined(__MINGW64__) +# define HAVE_STRUCT_TIMESPEC +# define HAVE_MODE_T +# elif defined(_UWIN) || defined(__MINGW32__) +# define HAVE_MODE_T +# endif +#endif + +/* + * + */ + +#if PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX +#if defined(NEED_ERRNO) +#include "need_errno.h" +#else +#include +#endif +#endif /* PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX */ + +#define _POSIX_SEMAPHORES + +#if defined(__cplusplus) +extern "C" +{ +#endif /* __cplusplus */ + +#if !defined(HAVE_MODE_T) +typedef unsigned int mode_t; +#endif + + +typedef struct sem_t_ * sem_t; + +PTW32_DLLPORT int __cdecl sem_init (sem_t * sem, + int pshared, + unsigned int value); + +PTW32_DLLPORT int __cdecl sem_destroy (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_trywait (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_wait (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_timedwait (sem_t * sem, + const struct timespec * abstime); + +PTW32_DLLPORT int __cdecl sem_post (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_post_multiple (sem_t * sem, + int count); + +PTW32_DLLPORT int __cdecl sem_open (const char * name, + int oflag, + mode_t mode, + unsigned int value); + +PTW32_DLLPORT int __cdecl sem_close (sem_t * sem); + +PTW32_DLLPORT int __cdecl sem_unlink (const char * name); + +PTW32_DLLPORT int __cdecl sem_getvalue (sem_t * sem, + int * sval); + +#if defined(__cplusplus) +} /* End of extern "C" */ +#endif /* __cplusplus */ + +#undef PTW32_SEMAPHORE_LEVEL +#undef PTW32_SEMAPHORE_LEVEL_MAX + +#endif /* !SEMAPHORE_H */ diff --git a/sdl1090/public_html/config.js b/sdl1090/public_html/config.js new file mode 100644 index 0000000..f7d8e2e --- /dev/null +++ b/sdl1090/public_html/config.js @@ -0,0 +1,34 @@ +// -------------------------------------------------------- +// +// This file is to configure the configurable settings. +// Load this file before script.js file at gmap.html. +// +// -------------------------------------------------------- + +// -- Output Settings ------------------------------------- +// Show metric values +Metric = false; // true or false + +// -- Map settings ---------------------------------------- +// The Latitude and Longitude in decimal format +CONST_CENTERLAT = 45.0; +CONST_CENTERLON = 9.0; +// The google maps zoom level, 0 - 16, lower is further out +CONST_ZOOMLVL = 5; + +// -- Marker settings ------------------------------------- +// The default marker color +MarkerColor = "rgb(127, 127, 127)"; +SelectedColor = "rgb(225, 225, 225)"; +StaleColor = "rgb(190, 190, 190)"; + +// -- Site Settings --------------------------------------- +SiteShow = false; // true or false +// The Latitude and Longitude in decimal format +SiteLat = 45.0; +SiteLon = 9.0; + +SiteCircles = true; // true or false (Only shown if SiteShow is true) +// In nautical miles or km (depending settings value 'Metric') +SiteCirclesDistances = new Array(100,150,200); + diff --git a/sdl1090/public_html/coolclock/coolclock.js b/sdl1090/public_html/coolclock/coolclock.js new file mode 100644 index 0000000..4411974 --- /dev/null +++ b/sdl1090/public_html/coolclock/coolclock.js @@ -0,0 +1,318 @@ +/** + * CoolClock 2.1.4 + * Copyright 2010, Simon Baird + * Released under the BSD License. + * + * Display an analog clock using canvas. + * http://randomibis.com/coolclock/ + * + */ + +// Constructor for CoolClock objects +window.CoolClock = function(options) { + return this.init(options); +} + +// Config contains some defaults, and clock skins +CoolClock.config = { + tickDelay: 1000, + longTickDelay: 15000, + defaultRadius: 85, + renderRadius: 100, + defaultSkin: "chunkySwiss", + // Should be in skin probably... + // (TODO: allow skinning of digital display) + showSecs: true, + showAmPm: true, + + skins: { + // There are more skins in moreskins.js + // Try making your own skin by copy/pasting one of these and tweaking it + swissRail: { + outerBorder: { lineWidth: 2, radius:95, color: "black", alpha: 1 }, + smallIndicator: { lineWidth: 2, startAt: 88, endAt: 92, color: "black", alpha: 1 }, + largeIndicator: { lineWidth: 4, startAt: 79, endAt: 92, color: "black", alpha: 1 }, + hourHand: { lineWidth: 8, startAt: -15, endAt: 50, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 7, startAt: -15, endAt: 75, color: "black", alpha: 1 }, + secondHand: { lineWidth: 1, startAt: -20, endAt: 85, color: "red", alpha: 1 }, + secondDecoration: { lineWidth: 1, startAt: 70, radius: 4, fillColor: "red", color: "red", alpha: 1 } + }, + chunkySwiss: { + outerBorder: { lineWidth: 4, radius:97, color: "black", alpha: 1 }, + smallIndicator: { lineWidth: 4, startAt: 89, endAt: 93, color: "black", alpha: 1 }, + largeIndicator: { lineWidth: 8, startAt: 80, endAt: 93, color: "black", alpha: 1 }, + hourHand: { lineWidth: 12, startAt: -15, endAt: 60, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 10, startAt: -15, endAt: 85, color: "black", alpha: 1 }, + secondHand: { lineWidth: 4, startAt: -20, endAt: 85, color: "red", alpha: 1 }, + secondDecoration: { lineWidth: 2, startAt: 70, radius: 8, fillColor: "red", color: "red", alpha: 1 } + }, + chunkySwissOnBlack: { + outerBorder: { lineWidth: 4, radius:97, color: "white", alpha: 1 }, + smallIndicator: { lineWidth: 4, startAt: 89, endAt: 93, color: "white", alpha: 1 }, + largeIndicator: { lineWidth: 8, startAt: 80, endAt: 93, color: "white", alpha: 1 }, + hourHand: { lineWidth: 12, startAt: -15, endAt: 60, color: "white", alpha: 1 }, + minuteHand: { lineWidth: 10, startAt: -15, endAt: 85, color: "white", alpha: 1 }, + secondHand: { lineWidth: 4, startAt: -20, endAt: 85, color: "red", alpha: 1 }, + secondDecoration: { lineWidth: 2, startAt: 70, radius: 8, fillColor: "red", color: "red", alpha: 1 } + } + + }, + + // Test for IE so we can nurse excanvas in a couple of places + isIE: !!document.all, + + // Will store (a reference to) each clock here, indexed by the id of the canvas element + clockTracker: {}, + + // For giving a unique id to coolclock canvases with no id + noIdCount: 0 +}; + +// Define the CoolClock object's methods +CoolClock.prototype = { + + // Initialise using the parameters parsed from the colon delimited class + init: function(options) { + // Parse and store the options + this.canvasId = options.canvasId; + this.skinId = options.skinId || CoolClock.config.defaultSkin; + this.displayRadius = options.displayRadius || CoolClock.config.defaultRadius; + this.showSecondHand = typeof options.showSecondHand == "boolean" ? options.showSecondHand : true; + this.gmtOffset = (options.gmtOffset != null && options.gmtOffset != '') ? parseFloat(options.gmtOffset) : null; + this.showDigital = typeof options.showDigital == "boolean" ? options.showDigital : false; + this.logClock = typeof options.logClock == "boolean" ? options.logClock : false; + this.logClockRev = typeof options.logClock == "boolean" ? options.logClockRev : false; + + this.tickDelay = CoolClock.config[ this.showSecondHand ? "tickDelay" : "longTickDelay" ]; + + // Get the canvas element + this.canvas = document.getElementById(this.canvasId); + + // Make the canvas the requested size. It's always square. + this.canvas.setAttribute("width",this.displayRadius*2); + this.canvas.setAttribute("height",this.displayRadius*2); + this.canvas.style.width = this.displayRadius*2 + "px"; + this.canvas.style.height = this.displayRadius*2 + "px"; + + // Explain me please...? + this.renderRadius = CoolClock.config.renderRadius; + this.scale = this.displayRadius / this.renderRadius; + + // Initialise canvas context + this.ctx = this.canvas.getContext("2d"); + this.ctx.scale(this.scale,this.scale); + + // Keep track of this object + CoolClock.config.clockTracker[this.canvasId] = this; + + // Start the clock going + this.tick(); + + return this; + }, + + // Draw a circle at point x,y with params as defined in skin + fullCircleAt: function(x,y,skin) { + this.ctx.save(); + this.ctx.globalAlpha = skin.alpha; + this.ctx.lineWidth = skin.lineWidth; + + if (!CoolClock.config.isIE) { + this.ctx.beginPath(); + } + + if (CoolClock.config.isIE) { + // excanvas doesn't scale line width so we will do it here + this.ctx.lineWidth = this.ctx.lineWidth * this.scale; + } + + this.ctx.arc(x, y, skin.radius, 0, 2*Math.PI, false); + + if (CoolClock.config.isIE) { + // excanvas doesn't close the circle so let's fill in the tiny gap + this.ctx.arc(x, y, skin.radius, -0.1, 0.1, false); + } + + if (skin.fillColor) { + this.ctx.fillStyle = skin.fillColor + this.ctx.fill(); + } + else { + // XXX why not stroke and fill + this.ctx.strokeStyle = skin.color; + this.ctx.stroke(); + } + this.ctx.restore(); + }, + + // Draw some text centered vertically and horizontally + drawTextAt: function(theText,x,y) { + this.ctx.save(); + this.ctx.font = '15px sans-serif'; + var tSize = this.ctx.measureText(theText); + if (!tSize.height) tSize.height = 15; // no height in firefox.. :( + this.ctx.fillText(theText,x - tSize.width/2,y - tSize.height/2); + this.ctx.restore(); + }, + + lpad2: function(num) { + return (num < 10 ? '0' : '') + num; + }, + + tickAngle: function(second) { + // Log algorithm by David Bradshaw + var tweak = 3; // If it's lower the one second mark looks wrong (?) + if (this.logClock) { + return second == 0 ? 0 : (Math.log(second*tweak) / Math.log(60*tweak)); + } + else if (this.logClockRev) { + // Flip the seconds then flip the angle (trickiness) + second = (60 - second) % 60; + return 1.0 - (second == 0 ? 0 : (Math.log(second*tweak) / Math.log(60*tweak))); + } + else { + return second/60.0; + } + }, + + timeText: function(hour,min,sec) { + var c = CoolClock.config; + return '' + + (c.showAmPm ? ((hour%12)==0 ? 12 : (hour%12)) : hour) + ':' + + this.lpad2(min) + + (c.showSecs ? ':' + this.lpad2(sec) : '') + + (c.showAmPm ? (hour < 12 ? ' am' : ' pm') : '') + ; + }, + + // Draw a radial line by rotating then drawing a straight line + // Ha ha, I think I've accidentally used Taus, (see http://tauday.com/) + radialLineAtAngle: function(angleFraction,skin) { + this.ctx.save(); + this.ctx.translate(this.renderRadius,this.renderRadius); + this.ctx.rotate(Math.PI * (2.0 * angleFraction - 0.5)); + this.ctx.globalAlpha = skin.alpha; + this.ctx.strokeStyle = skin.color; + this.ctx.lineWidth = skin.lineWidth; + + if (CoolClock.config.isIE) + // excanvas doesn't scale line width so we will do it here + this.ctx.lineWidth = this.ctx.lineWidth * this.scale; + + if (skin.radius) { + this.fullCircleAt(skin.startAt,0,skin) + } + else { + this.ctx.beginPath(); + this.ctx.moveTo(skin.startAt,0) + this.ctx.lineTo(skin.endAt,0); + this.ctx.stroke(); + } + this.ctx.restore(); + }, + + render: function(hour,min,sec) { + // Get the skin + var skin = CoolClock.config.skins[this.skinId]; + if (!skin) skin = CoolClock.config.skins[CoolClock.config.defaultSkin]; + + // Clear + this.ctx.clearRect(0,0,this.renderRadius*2,this.renderRadius*2); + + // Draw the outer edge of the clock + if (skin.outerBorder) + this.fullCircleAt(this.renderRadius,this.renderRadius,skin.outerBorder); + + // Draw the tick marks. Every 5th one is a big one + for (var i=0;i<60;i++) { + (i%5) && skin.smallIndicator && this.radialLineAtAngle(this.tickAngle(i),skin.smallIndicator); + !(i%5) && skin.largeIndicator && this.radialLineAtAngle(this.tickAngle(i),skin.largeIndicator); + } + + // Write the time + if (this.showDigital) { + this.drawTextAt( + this.timeText(hour,min,sec), + this.renderRadius, + this.renderRadius+this.renderRadius/2 + ); + } + + // Draw the hands + if (skin.hourHand) + this.radialLineAtAngle(this.tickAngle(((hour%12)*5 + min/12.0)),skin.hourHand); + + if (skin.minuteHand) + this.radialLineAtAngle(this.tickAngle((min + sec/60.0)),skin.minuteHand); + + if (this.showSecondHand && skin.secondHand) + this.radialLineAtAngle(this.tickAngle(sec),skin.secondHand); + + // Second hand decoration doesn't render right in IE so lets turn it off + if (!CoolClock.config.isIE && this.showSecondHand && skin.secondDecoration) + this.radialLineAtAngle(this.tickAngle(sec),skin.secondDecoration); + }, + + // Check the time and display the clock + refreshDisplay: function() { + var now = new Date(); + if (this.gmtOffset != null) { + // Use GMT + gmtOffset + var offsetNow = new Date(now.valueOf() + (this.gmtOffset * 1000 * 60 * 60)); + this.render(offsetNow.getUTCHours(),offsetNow.getUTCMinutes(),offsetNow.getUTCSeconds()); + } + else { + // Use local time + this.render(now.getHours(),now.getMinutes(),now.getSeconds()); + } + }, + + // Set timeout to trigger a tick in the future + nextTick: function() { + setTimeout("CoolClock.config.clockTracker['"+this.canvasId+"'].tick()",this.tickDelay); + }, + + // Check the canvas element hasn't been removed + stillHere: function() { + return document.getElementById(this.canvasId) != null; + }, + + // Main tick handler. Refresh the clock then setup the next tick + tick: function() { + if (this.stillHere()) { + this.refreshDisplay() + this.nextTick(); + } + } +}; + +// Find all canvas elements that have the CoolClock class and turns them into clocks +CoolClock.findAndCreateClocks = function() { + // (Let's not use a jQuery selector here so it's easier to use frameworks other than jQuery) + var canvases = document.getElementsByTagName("canvas"); + for (var i=0;i +// If you do have jQuery and it's loaded already then we can do it right now +if (window.jQuery) jQuery(document).ready(CoolClock.findAndCreateClocks); diff --git a/sdl1090/public_html/coolclock/excanvas.js b/sdl1090/public_html/coolclock/excanvas.js new file mode 100644 index 0000000..3e1aedf --- /dev/null +++ b/sdl1090/public_html/coolclock/excanvas.js @@ -0,0 +1,785 @@ +// Copyright 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// Known Issues: +// +// * Patterns are not implemented. +// * Radial gradient are not implemented. The VML version of these look very +// different from the canvas one. +// * Clipping paths are not implemented. +// * Coordsize. The width and height attribute have higher priority than the +// width and height style values which isn't correct. +// * Painting mode isn't implemented. +// * Canvas width/height should is using content-box by default. IE in +// Quirks mode will draw the canvas using border-box. Either change your +// doctype to HTML5 +// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) +// or use Box Sizing Behavior from WebFX +// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) +// * Optimize. There is always room for speed improvements. + +// only add this code if we do not already have a canvas implementation +if (!window.CanvasRenderingContext2D) { + +(function () { + + // alias some functions to make (compiled) code shorter + var m = Math; + var mr = m.round; + var ms = m.sin; + var mc = m.cos; + + // this is used for sub pixel precision + var Z = 10; + var Z2 = Z / 2; + + var G_vmlCanvasManager_ = { + init: function (opt_doc) { + var doc = opt_doc || document; + if (/MSIE/.test(navigator.userAgent) && !window.opera) { + var self = this; + doc.attachEvent("onreadystatechange", function () { + self.init_(doc); + }); + } + }, + + init_: function (doc) { + if (doc.readyState == "complete") { + // create xmlns + if (!doc.namespaces["g_vml_"]) { + doc.namespaces.add("g_vml_", "urn:schemas-microsoft-com:vml"); + } + + // setup default css + var ss = doc.createStyleSheet(); + ss.cssText = "canvas{display:inline-block;overflow:hidden;" + + // default size is 300x150 in Gecko and Opera + "text-align:left;width:300px;height:150px}" + + "g_vml_\\:*{behavior:url(#default#VML)}"; + + // find all canvas elements + var els = doc.getElementsByTagName("canvas"); + for (var i = 0; i < els.length; i++) { + if (!els[i].getContext) { + this.initElement(els[i]); + } + } + } + }, + + fixElement_: function (el) { + // in IE before version 5.5 we would need to add HTML: to the tag name + // but we do not care about IE before version 6 + var outerHTML = el.outerHTML; + + var newEl = el.ownerDocument.createElement(outerHTML); + // if the tag is still open IE has created the children as siblings and + // it has also created a tag with the name "/FOO" + if (outerHTML.slice(-2) != "/>") { + var tagName = "/" + el.tagName; + var ns; + // remove content + while ((ns = el.nextSibling) && ns.tagName != tagName) { + ns.removeNode(); + } + // remove the incorrect closing tag + if (ns) { + ns.removeNode(); + } + } + el.parentNode.replaceChild(newEl, el); + return newEl; + }, + + /** + * Public initializes a canvas element so that it can be used as canvas + * element from now on. This is called automatically before the page is + * loaded but if you are creating elements using createElement you need to + * make sure this is called on the element. + * @param {HTMLElement} el The canvas element to initialize. + * @return {HTMLElement} the element that was created. + */ + initElement: function (el) { + el = this.fixElement_(el); + el.getContext = function () { + if (this.context_) { + return this.context_; + } + return this.context_ = new CanvasRenderingContext2D_(this); + }; + + // do not use inline function because that will leak memory + el.attachEvent('onpropertychange', onPropertyChange); + el.attachEvent('onresize', onResize); + + var attrs = el.attributes; + if (attrs.width && attrs.width.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setWidth_(attrs.width.nodeValue); + el.style.width = attrs.width.nodeValue + "px"; + } else { + el.width = el.clientWidth; + } + if (attrs.height && attrs.height.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setHeight_(attrs.height.nodeValue); + el.style.height = attrs.height.nodeValue + "px"; + } else { + el.height = el.clientHeight; + } + //el.getContext().setCoordsize_() + return el; + } + }; + + function onPropertyChange(e) { + var el = e.srcElement; + + switch (e.propertyName) { + case 'width': + el.style.width = el.attributes.width.nodeValue + "px"; + el.getContext().clearRect(); + break; + case 'height': + el.style.height = el.attributes.height.nodeValue + "px"; + el.getContext().clearRect(); + break; + } + } + + function onResize(e) { + var el = e.srcElement; + if (el.firstChild) { + el.firstChild.style.width = el.clientWidth + 'px'; + el.firstChild.style.height = el.clientHeight + 'px'; + } + } + + G_vmlCanvasManager_.init(); + + // precompute "00" to "FF" + var dec2hex = []; + for (var i = 0; i < 16; i++) { + for (var j = 0; j < 16; j++) { + dec2hex[i * 16 + j] = i.toString(16) + j.toString(16); + } + } + + function createMatrixIdentity() { + return [ + [1, 0, 0], + [0, 1, 0], + [0, 0, 1] + ]; + } + + function matrixMultiply(m1, m2) { + var result = createMatrixIdentity(); + + for (var x = 0; x < 3; x++) { + for (var y = 0; y < 3; y++) { + var sum = 0; + + for (var z = 0; z < 3; z++) { + sum += m1[x][z] * m2[z][y]; + } + + result[x][y] = sum; + } + } + return result; + } + + function copyState(o1, o2) { + o2.fillStyle = o1.fillStyle; + o2.lineCap = o1.lineCap; + o2.lineJoin = o1.lineJoin; + o2.lineWidth = o1.lineWidth; + o2.miterLimit = o1.miterLimit; + o2.shadowBlur = o1.shadowBlur; + o2.shadowColor = o1.shadowColor; + o2.shadowOffsetX = o1.shadowOffsetX; + o2.shadowOffsetY = o1.shadowOffsetY; + o2.strokeStyle = o1.strokeStyle; + o2.arcScaleX_ = o1.arcScaleX_; + o2.arcScaleY_ = o1.arcScaleY_; + } + + function processStyle(styleString) { + var str, alpha = 1; + + styleString = String(styleString); + if (styleString.substring(0, 3) == "rgb") { + var start = styleString.indexOf("(", 3); + var end = styleString.indexOf(")", start + 1); + var guts = styleString.substring(start + 1, end).split(","); + + str = "#"; + for (var i = 0; i < 3; i++) { + str += dec2hex[Number(guts[i])]; + } + + if ((guts.length == 4) && (styleString.substr(3, 1) == "a")) { + alpha = guts[3]; + } + } else { + str = styleString; + } + + return [str, alpha]; + } + + function processLineCap(lineCap) { + switch (lineCap) { + case "butt": + return "flat"; + case "round": + return "round"; + case "square": + default: + return "square"; + } + } + + /** + * This class implements CanvasRenderingContext2D interface as described by + * the WHATWG. + * @param {HTMLElement} surfaceElement The element that the 2D context should + * be associated with + */ + function CanvasRenderingContext2D_(surfaceElement) { + this.m_ = createMatrixIdentity(); + + this.mStack_ = []; + this.aStack_ = []; + this.currentPath_ = []; + + // Canvas context properties + this.strokeStyle = "#000"; + this.fillStyle = "#000"; + + this.lineWidth = 1; + this.lineJoin = "miter"; + this.lineCap = "butt"; + this.miterLimit = Z * 1; + this.globalAlpha = 1; + this.canvas = surfaceElement; + + var el = surfaceElement.ownerDocument.createElement('div'); + el.style.width = surfaceElement.clientWidth + 'px'; + el.style.height = surfaceElement.clientHeight + 'px'; + el.style.overflow = 'hidden'; + el.style.position = 'absolute'; + surfaceElement.appendChild(el); + + this.element_ = el; + this.arcScaleX_ = 1; + this.arcScaleY_ = 1; + }; + + var contextPrototype = CanvasRenderingContext2D_.prototype; + contextPrototype.clearRect = function() { + this.element_.innerHTML = ""; + this.currentPath_ = []; + }; + + contextPrototype.beginPath = function() { + // TODO: Branch current matrix so that save/restore has no effect + // as per safari docs. + + this.currentPath_ = []; + }; + + contextPrototype.moveTo = function(aX, aY) { + this.currentPath_.push({type: "moveTo", x: aX, y: aY}); + this.currentX_ = aX; + this.currentY_ = aY; + }; + + contextPrototype.lineTo = function(aX, aY) { + this.currentPath_.push({type: "lineTo", x: aX, y: aY}); + this.currentX_ = aX; + this.currentY_ = aY; + }; + + contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, + aCP2x, aCP2y, + aX, aY) { + this.currentPath_.push({type: "bezierCurveTo", + cp1x: aCP1x, + cp1y: aCP1y, + cp2x: aCP2x, + cp2y: aCP2y, + x: aX, + y: aY}); + this.currentX_ = aX; + this.currentY_ = aY; + }; + + contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { + // the following is lifted almost directly from + // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes + var cp1x = this.currentX_ + 2.0 / 3.0 * (aCPx - this.currentX_); + var cp1y = this.currentY_ + 2.0 / 3.0 * (aCPy - this.currentY_); + var cp2x = cp1x + (aX - this.currentX_) / 3.0; + var cp2y = cp1y + (aY - this.currentY_) / 3.0; + this.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, aX, aY); + }; + + contextPrototype.arc = function(aX, aY, aRadius, + aStartAngle, aEndAngle, aClockwise) { + aRadius *= Z; + var arcType = aClockwise ? "at" : "wa"; + + var xStart = aX + (mc(aStartAngle) * aRadius) - Z2; + var yStart = aY + (ms(aStartAngle) * aRadius) - Z2; + + var xEnd = aX + (mc(aEndAngle) * aRadius) - Z2; + var yEnd = aY + (ms(aEndAngle) * aRadius) - Z2; + + // IE won't render arches drawn counter clockwise if xStart == xEnd. + if (xStart == xEnd && !aClockwise) { + xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something + // that can be represented in binary + } + + this.currentPath_.push({type: arcType, + x: aX, + y: aY, + radius: aRadius, + xStart: xStart, + yStart: yStart, + xEnd: xEnd, + yEnd: yEnd}); + + }; + + contextPrototype.rect = function(aX, aY, aWidth, aHeight) { + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + }; + + contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { + // Will destroy any existing path (same as FF behaviour) + this.beginPath(); + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.stroke(); + }; + + contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { + // Will destroy any existing path (same as FF behaviour) + this.beginPath(); + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.fill(); + }; + + contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { + var gradient = new CanvasGradient_("gradient"); + return gradient; + }; + + contextPrototype.createRadialGradient = function(aX0, aY0, + aR0, aX1, + aY1, aR1) { + var gradient = new CanvasGradient_("gradientradial"); + gradient.radius1_ = aR0; + gradient.radius2_ = aR1; + gradient.focus_.x = aX0; + gradient.focus_.y = aY0; + return gradient; + }; + + contextPrototype.drawImage = function (image, var_args) { + var dx, dy, dw, dh, sx, sy, sw, sh; + + // to find the original width we overide the width and height + var oldRuntimeWidth = image.runtimeStyle.width; + var oldRuntimeHeight = image.runtimeStyle.height; + image.runtimeStyle.width = 'auto'; + image.runtimeStyle.height = 'auto'; + + // get the original size + var w = image.width; + var h = image.height; + + // and remove overides + image.runtimeStyle.width = oldRuntimeWidth; + image.runtimeStyle.height = oldRuntimeHeight; + + if (arguments.length == 3) { + dx = arguments[1]; + dy = arguments[2]; + sx = sy = 0; + sw = dw = w; + sh = dh = h; + } else if (arguments.length == 5) { + dx = arguments[1]; + dy = arguments[2]; + dw = arguments[3]; + dh = arguments[4]; + sx = sy = 0; + sw = w; + sh = h; + } else if (arguments.length == 9) { + sx = arguments[1]; + sy = arguments[2]; + sw = arguments[3]; + sh = arguments[4]; + dx = arguments[5]; + dy = arguments[6]; + dw = arguments[7]; + dh = arguments[8]; + } else { + throw "Invalid number of arguments"; + } + + var d = this.getCoords_(dx, dy); + + var w2 = sw / 2; + var h2 = sh / 2; + + var vmlStr = []; + + var W = 10; + var H = 10; + + // For some reason that I've now forgotten, using divs didn't work + vmlStr.push(' ' , + '', + ''); + + this.element_.insertAdjacentHTML("BeforeEnd", + vmlStr.join("")); + }; + + contextPrototype.stroke = function(aFill) { + var lineStr = []; + var lineOpen = false; + var a = processStyle(aFill ? this.fillStyle : this.strokeStyle); + var color = a[0]; + var opacity = a[1] * this.globalAlpha; + + var W = 10; + var H = 10; + + lineStr.push(' max.x) { + max.x = c.x; + } + if (min.y == null || c.y < min.y) { + min.y = c.y; + } + if (max.y == null || c.y > max.y) { + max.y = c.y; + } + } + } + lineStr.push(' ">'); + + if (typeof this.fillStyle == "object") { + var focus = {x: "50%", y: "50%"}; + var width = (max.x - min.x); + var height = (max.y - min.y); + var dimension = (width > height) ? width : height; + + focus.x = mr((this.fillStyle.focus_.x / width) * 100 + 50) + "%"; + focus.y = mr((this.fillStyle.focus_.y / height) * 100 + 50) + "%"; + + var colors = []; + + // inside radius (%) + if (this.fillStyle.type_ == "gradientradial") { + var inside = (this.fillStyle.radius1_ / dimension * 100); + + // percentage that outside radius exceeds inside radius + var expansion = (this.fillStyle.radius2_ / dimension * 100) - inside; + } else { + var inside = 0; + var expansion = 100; + } + + var insidecolor = {offset: null, color: null}; + var outsidecolor = {offset: null, color: null}; + + // We need to sort 'colors' by percentage, from 0 > 100 otherwise ie + // won't interpret it correctly + this.fillStyle.colors_.sort(function (cs1, cs2) { + return cs1.offset - cs2.offset; + }); + + for (var i = 0; i < this.fillStyle.colors_.length; i++) { + var fs = this.fillStyle.colors_[i]; + + colors.push( (fs.offset * expansion) + inside, "% ", fs.color, ","); + + if (fs.offset > insidecolor.offset || insidecolor.offset == null) { + insidecolor.offset = fs.offset; + insidecolor.color = fs.color; + } + + if (fs.offset < outsidecolor.offset || outsidecolor.offset == null) { + outsidecolor.offset = fs.offset; + outsidecolor.color = fs.color; + } + } + colors.pop(); + + lineStr.push(''); + } else if (aFill) { + lineStr.push(''); + } else { + lineStr.push( + '' + ); + } + + lineStr.push(""); + + this.element_.insertAdjacentHTML("beforeEnd", lineStr.join("")); + + this.currentPath_ = []; + }; + + contextPrototype.fill = function() { + this.stroke(true); + } + + contextPrototype.closePath = function() { + this.currentPath_.push({type: "close"}); + }; + + /** + * @private + */ + contextPrototype.getCoords_ = function(aX, aY) { + return { + x: Z * (aX * this.m_[0][0] + aY * this.m_[1][0] + this.m_[2][0]) - Z2, + y: Z * (aX * this.m_[0][1] + aY * this.m_[1][1] + this.m_[2][1]) - Z2 + } + }; + + contextPrototype.save = function() { + var o = {}; + copyState(this, o); + this.aStack_.push(o); + this.mStack_.push(this.m_); + this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); + }; + + contextPrototype.restore = function() { + copyState(this.aStack_.pop(), this); + this.m_ = this.mStack_.pop(); + }; + + contextPrototype.translate = function(aX, aY) { + var m1 = [ + [1, 0, 0], + [0, 1, 0], + [aX, aY, 1] + ]; + + this.m_ = matrixMultiply(m1, this.m_); + }; + + contextPrototype.rotate = function(aRot) { + var c = mc(aRot); + var s = ms(aRot); + + var m1 = [ + [c, s, 0], + [-s, c, 0], + [0, 0, 1] + ]; + + this.m_ = matrixMultiply(m1, this.m_); + }; + + contextPrototype.scale = function(aX, aY) { + this.arcScaleX_ *= aX; + this.arcScaleY_ *= aY; + var m1 = [ + [aX, 0, 0], + [0, aY, 0], + [0, 0, 1] + ]; + + this.m_ = matrixMultiply(m1, this.m_); + }; + + /******** STUBS ********/ + contextPrototype.clip = function() { + // TODO: Implement + }; + + contextPrototype.arcTo = function() { + // TODO: Implement + }; + + contextPrototype.createPattern = function() { + return new CanvasPattern_; + }; + + // Gradient / Pattern Stubs + function CanvasGradient_(aType) { + this.type_ = aType; + this.radius1_ = 0; + this.radius2_ = 0; + this.colors_ = []; + this.focus_ = {x: 0, y: 0}; + } + + CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { + aColor = processStyle(aColor); + this.colors_.push({offset: 1-aOffset, color: aColor}); + }; + + function CanvasPattern_() {} + + // set up externs + G_vmlCanvasManager = G_vmlCanvasManager_; + CanvasRenderingContext2D = CanvasRenderingContext2D_; + CanvasGradient = CanvasGradient_; + CanvasPattern = CanvasPattern_; + +})(); + +} // if diff --git a/sdl1090/public_html/coolclock/moreskins.js b/sdl1090/public_html/coolclock/moreskins.js new file mode 100644 index 0000000..e316181 --- /dev/null +++ b/sdl1090/public_html/coolclock/moreskins.js @@ -0,0 +1,212 @@ +CoolClock.config.skins = { + + swissRail: { + outerBorder: { lineWidth: 2, radius: 95, color: "black", alpha: 1 }, + smallIndicator: { lineWidth: 2, startAt: 88, endAt: 92, color: "black", alpha: 1 }, + largeIndicator: { lineWidth: 4, startAt: 79, endAt: 92, color: "black", alpha: 1 }, + hourHand: { lineWidth: 8, startAt: -15, endAt: 50, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 7, startAt: -15, endAt: 75, color: "black", alpha: 1 }, + secondHand: { lineWidth: 1, startAt: -20, endAt: 85, color: "red", alpha: 1 }, + secondDecoration: { lineWidth: 1, startAt: 70, radius: 4, fillColor: "red", color: "red", alpha: 1 } + }, + + chunkySwiss: { + outerBorder: { lineWidth: 4, radius: 97, color: "black", alpha: 1 }, + smallIndicator: { lineWidth: 4, startAt: 89, endAt: 93, color: "black", alpha: 1 }, + largeIndicator: { lineWidth: 8, startAt: 80, endAt: 93, color: "black", alpha: 1 }, + hourHand: { lineWidth: 12, startAt: -15, endAt: 60, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 10, startAt: -15, endAt: 85, color: "black", alpha: 1 }, + secondHand: { lineWidth: 4, startAt: -20, endAt: 85, color: "red", alpha: 1 }, + secondDecoration: { lineWidth: 2, startAt: 70, radius: 8, fillColor: "red", color: "red", alpha: 1 } + }, + + chunkySwissOnBlack: { + outerBorder: { lineWidth: 4, radius: 97, color: "white", alpha: 1 }, + smallIndicator: { lineWidth: 4, startAt: 89, endAt: 93, color: "white", alpha: 1 }, + largeIndicator: { lineWidth: 8, startAt: 80, endAt: 93, color: "white", alpha: 1 }, + hourHand: { lineWidth: 12, startAt: -15, endAt: 60, color: "white", alpha: 1 }, + minuteHand: { lineWidth: 10, startAt: -15, endAt: 85, color: "white", alpha: 1 }, + secondHand: { lineWidth: 4, startAt: -20, endAt: 85, color: "red", alpha: 1 }, + secondDecoration: { lineWidth: 2, startAt: 70, radius: 8, fillColor: "red", color: "red", alpha: 1 } + }, + + fancy: { + outerBorder: { lineWidth: 5, radius: 95, color: "green", alpha: 0.7 }, + smallIndicator: { lineWidth: 1, startAt: 80, endAt: 93, color: "black", alpha: 0.4 }, + largeIndicator: { lineWidth: 1, startAt: 30, endAt: 93, color: "black", alpha: 0.5 }, + hourHand: { lineWidth: 8, startAt: -15, endAt: 50, color: "blue", alpha: 0.7 }, + minuteHand: { lineWidth: 7, startAt: -15, endAt: 92, color: "red", alpha: 0.7 }, + secondHand: { lineWidth: 10, startAt: 80, endAt: 85, color: "blue", alpha: 0.3 }, + secondDecoration: { lineWidth: 1, startAt: 30, radius: 50, fillColor: "blue", color: "red", alpha: 0.15 } + }, + + machine: { + outerBorder: { lineWidth: 60, radius: 55, color: "#dd6655", alpha: 1 }, + smallIndicator: { lineWidth: 4, startAt: 80, endAt: 95, color: "white", alpha: 1 }, + largeIndicator: { lineWidth: 14, startAt: 77, endAt: 92, color: "#dd6655", alpha: 1 }, + hourHand: { lineWidth: 18, startAt: -15, endAt: 40, color: "white", alpha: 1 }, + minuteHand: { lineWidth: 14, startAt: 24, endAt: 100, color: "#771100", alpha: 0.5 }, + secondHand: { lineWidth: 3, startAt: 22, endAt: 83, color: "green", alpha: 0 }, + secondDecoration: { lineWidth: 1, startAt: 52, radius: 26, fillColor: "#ffcccc", color: "red", alpha: 0.5 } + }, + + simonbaird_com: { + hourHand: { lineWidth: 80, startAt: -15, endAt: 35, color: 'magenta', alpha: 0.5 }, + minuteHand: { lineWidth: 80, startAt: -15, endAt: 65, color: 'cyan', alpha: 0.5 }, + secondDecoration: { lineWidth: 1, startAt: 40, radius: 40, color: "#fff", fillColor: 'yellow', alpha: 0.5 } + }, + + // by bonstio, http://bonstio.net + classic/*was gIG*/: { + outerBorder: { lineWidth: 185, radius: 1, color: "#E5ECF9", alpha: 1 }, + smallIndicator: { lineWidth: 2, startAt: 89, endAt: 94, color: "#3366CC", alpha: 1 }, + largeIndicator: { lineWidth: 4, startAt: 83, endAt: 94, color: "#3366CC", alpha: 1 }, + hourHand: { lineWidth: 5, startAt: 0, endAt: 60, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 4, startAt: 0, endAt: 80, color: "black", alpha: 1 }, + secondHand: { lineWidth: 1, startAt: -20, endAt: 85, color: "red", alpha: .85 }, + secondDecoration: { lineWidth: 3, startAt: 0, radius: 2, fillColor: "black", color: "black", alpha: 1 } + }, + + modern/*was gIG2*/: { + outerBorder: { lineWidth: 185, radius: 1, color: "#E5ECF9", alpha: 1 }, + smallIndicator: { lineWidth: 5, startAt: 88, endAt: 94, color: "#3366CC", alpha: 1 }, + largeIndicator: { lineWidth: 5, startAt: 88, endAt: 94, color: "#3366CC", alpha: 1 }, + hourHand: { lineWidth: 8, startAt: 0, endAt: 60, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 8, startAt: 0, endAt: 80, color: "black", alpha: 1 }, + secondHand: { lineWidth: 5, startAt: 80, endAt: 85, color: "red", alpha: .85 }, + secondDecoration: { lineWidth: 3, startAt: 0, radius: 4, fillColor: "black", color: "black", alpha: 1 } + }, + + simple/*was gIG3*/: { + outerBorder: { lineWidth: 185, radius: 1, color: "#E5ECF9", alpha: 1 }, + smallIndicator: { lineWidth: 10, startAt: 90, endAt: 94, color: "#3366CC", alpha: 1 }, + largeIndicator: { lineWidth: 10, startAt: 90, endAt: 94, color: "#3366CC", alpha: 1 }, + hourHand: { lineWidth: 8, startAt: 0, endAt: 60, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 8, startAt: 0, endAt: 80, color: "black", alpha: 1 }, + secondHand: { lineWidth: 5, startAt: 80, endAt: 85, color: "red", alpha: .85 }, + secondDecoration: { lineWidth: 3, startAt: 0, radius: 4, fillColor: "black", color: "black", alpha: 1 } + }, + + // by securephp + securephp: { + outerBorder: { lineWidth: 100, radius: 0.45, color: "#669900", alpha: 0.3 }, + smallIndicator: { lineWidth: 2, startAt: 80, endAt: 90 , color: "green", alpha: 1 }, + largeIndicator: { lineWidth: 8.5, startAt: 20, endAt: 40 , color: "green", alpha: 0.4 }, + hourHand: { lineWidth: 3, startAt: 0, endAt: 60, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 2, startAt: 0, endAt: 75, color: "black", alpha: 1 }, + secondHand: { lineWidth: 1, startAt: -10, endAt: 80, color: "blue", alpha: 0.8 }, + secondDecoration: { lineWidth: 1, startAt: 70, radius: 4, fillColor: "blue", color: "red", alpha: 1 } + }, + + Tes2: { + outerBorder: { lineWidth: 4, radius: 95, color: "black", alpha: 0.5 }, + smallIndicator: { lineWidth: 1, startAt: 10, endAt: 50 , color: "#66CCFF", alpha: 1 }, + largeIndicator: { lineWidth: 8.5, startAt: 60, endAt: 70, color: "#6699FF", alpha: 1 }, + hourHand: { lineWidth: 5, startAt: -15, endAt: 60, color: "black", alpha: 0.7 }, + minuteHand: { lineWidth: 3, startAt: -25, endAt: 75, color: "black", alpha: 0.7 }, + secondHand: { lineWidth: 1.5, startAt: -20, endAt: 88, color: "red", alpha: 1 }, + secondDecoration: { lineWidth: 1, startAt: 20, radius: 4, fillColor: "blue", color: "red", alpha: 1 } + }, + + + Lev: { + outerBorder: { lineWidth: 10, radius: 95, color: "#CCFF33", alpha: 0.65 }, + smallIndicator: { lineWidth: 5, startAt: 84, endAt: 90, color: "#996600", alpha: 1 }, + largeIndicator: { lineWidth: 40, startAt: 25, endAt: 95, color: "#336600", alpha: 0.55 }, + hourHand: { lineWidth: 4, startAt: 0, endAt: 65, color: "black", alpha: 0.9 }, + minuteHand: { lineWidth: 3, startAt: 0, endAt: 80, color: "black", alpha: 0.85 }, + secondHand: { lineWidth: 1, startAt: 0, endAt: 85, color: "black", alpha: 1 }, + secondDecoration: { lineWidth: 2, startAt: 5, radius: 10, fillColor: "black", color: "black", alpha: 1 } + }, + + Sand: { + outerBorder: { lineWidth: 1, radius: 70, color: "black", alpha: 0.5 }, + smallIndicator: { lineWidth: 3, startAt: 50, endAt: 70, color: "#0066FF", alpha: 0.5 }, + largeIndicator: { lineWidth: 200, startAt: 80, endAt: 95, color: "#996600", alpha: 0.75 }, + hourHand: { lineWidth: 4, startAt: 0, endAt: 65, color: "black", alpha: 0.9 }, + minuteHand: { lineWidth: 3, startAt: 0, endAt: 80, color: "black", alpha: 0.85 }, + secondHand: { lineWidth: 1, startAt: 0, endAt: 85, color: "black", alpha: 1 }, + secondDecoration: { lineWidth: 2, startAt: 5, radius: 10, fillColor: "black", color: "black", alpha: 1 } + }, + + Sun: { + outerBorder: { lineWidth: 100, radius: 140, color: "#99FFFF", alpha: 0.2 }, + smallIndicator: { lineWidth: 300, startAt: 50, endAt: 70, color: "black", alpha: 0.1 }, + largeIndicator: { lineWidth: 5, startAt: 80, endAt: 95, color: "black", alpha: 0.65 }, + hourHand: { lineWidth: 4, startAt: 0, endAt: 65, color: "black", alpha: 0.9 }, + minuteHand: { lineWidth: 3, startAt: 0, endAt: 80, color: "black", alpha: 0.85 }, + secondHand: { lineWidth: 1, startAt: 0, endAt: 90, color: "black", alpha: 1 }, + secondDecoration: { lineWidth: 2, startAt: 5, radius: 10, fillColor: "black", color: "black", alpha: 1 } + }, + + Tor: { + outerBorder: { lineWidth: 10, radius: 88, color: "#996600", alpha: 0.9 }, + smallIndicator: { lineWidth: 6, startAt: -10, endAt: 73, color: "green", alpha: 0.3 }, + largeIndicator: { lineWidth: 6, startAt: 73, endAt: 100, color: "black", alpha: 0.65 }, + hourHand: { lineWidth: 4, startAt: 0, endAt: 65, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 3, startAt: 0, endAt: 80, color: "black", alpha: 1 }, + secondHand: { lineWidth: 1, startAt: -73, endAt: 73, color: "black", alpha: 0.8 }, + secondDecoration: { lineWidth: 2, startAt: 5, radius: 10, fillColor: "black", color: "black", alpha: 1 } + }, + + Cold: { + outerBorder: { lineWidth: 15, radius: 90, color: "black", alpha: 0.3 }, + smallIndicator: { lineWidth: 15, startAt: -10, endAt: 95, color: "blue", alpha: 0.1 }, + largeIndicator: { lineWidth: 3, startAt: 80, endAt: 95, color: "blue", alpha: 0.65 }, + hourHand: { lineWidth: 4, startAt: 0, endAt: 65, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 3, startAt: 0, endAt: 80, color: "black", alpha: 1 }, + secondHand: { lineWidth: 1, startAt: 0, endAt: 85, color: "black", alpha: 0.8 }, + secondDecoration: { lineWidth: 5, startAt: 30, radius: 10, fillColor: "black", color: "black", alpha: 1 } + }, + + Babosa: { + outerBorder: { lineWidth: 100, radius: 25, color: "blue", alpha: 0.25 }, + smallIndicator: { lineWidth: 3, startAt: 90, endAt: 95, color: "#3366CC", alpha: 1 }, + largeIndicator: { lineWidth: 4, startAt: 75, endAt: 95, color: "#3366CC", alpha: 1 }, + hourHand: { lineWidth: 4, startAt: 0, endAt: 60, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 3, startAt: 0, endAt: 85, color: "black", alpha: 1 }, + secondHand: { lineWidth: 12, startAt: 75, endAt: 90, color: "red", alpha: 0.8 }, + secondDecoration: { lineWidth: 3, startAt: 0, radius: 4, fillColor: "black", color: "black", alpha: 1 } + }, + + Tumb: { + outerBorder: { lineWidth: 105, radius: 5, color: "green", alpha: 0.4 }, + smallIndicator: { lineWidth: 1, startAt: 93, endAt: 98, color: "green", alpha: 1 }, + largeIndicator: { lineWidth: 50, startAt: 0, endAt: 89, color: "red", alpha: 0.14 }, + hourHand: { lineWidth: 4, startAt: 0, endAt: 65, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 3, startAt: 0, endAt: 80, color: "black", alpha: 1 }, + secondHand: { lineWidth: 1, startAt: 0, endAt: 85, color: "black", alpha: 0.8 }, + secondDecoration: { lineWidth: 5, startAt: 50, radius: 90, fillColor: "black", color: "black", alpha: 0.05 } + }, + + Stone: { + outerBorder: { lineWidth: 15, radius: 80, color: "#339933", alpha: 0.5 }, + smallIndicator: { lineWidth: 2, startAt: 70, endAt: 90, color: "#FF3300", alpha: 0.7 }, + largeIndicator: { lineWidth: 15, startAt: 0, endAt: 29, color: "#FF6600", alpha: 0.3 }, + hourHand: { lineWidth: 4, startAt: 0, endAt: 65, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 3, startAt: 0, endAt: 75, color: "black", alpha: 1 }, + secondHand: { lineWidth: 1, startAt: 0, endAt: 85, color: "black", alpha: 0.8 }, + secondDecoration: { lineWidth: 5, startAt: 50, radius: 90, fillColor: "black", color: "black", alpha: 0.05 } + }, + + Disc: { + outerBorder: { lineWidth: 105, radius: 1, color: "#666600", alpha: 0.2 }, + smallIndicator: { lineWidth: 1, startAt: 58, endAt: 95, color: "#669900", alpha: 0.8 }, + largeIndicator: { lineWidth: 6, startAt: 25, endAt: 35, color: "#666600", alpha: 1 }, + hourHand: { lineWidth: 4, startAt: 0, endAt: 65, color: "black", alpha: 1 }, + minuteHand: { lineWidth: 3, startAt: 0, endAt: 75, color: "black", alpha: 1 }, + secondHand: { lineWidth: 1, startAt: -75, endAt: 75, color: "#99CC00", alpha: 0.8 }, + secondDecoration: { lineWidth: 5, startAt: 50, radius: 90, fillColor: "#00FF00", color: "green", alpha: 0.05 } + }, + + // By Yoo Nhe + watermelon: { + outerBorder: { lineWidth: 100, radius: 1.7, color: "#d93d04", alpha: 5 }, + smallIndicator: { lineWidth: 2, startAt: 50, endAt: 70, color: "#d93d04", alpha: 5 }, + largeIndicator: { lineWidth: 2, startAt: 45, endAt: 94, color: "#a9bf04", alpha: 1 }, + hourHand: { lineWidth: 5, startAt: -20, endAt: 80, color: "#8c0d17", alpha: 1 }, + minuteHand: { lineWidth: 2, startAt: -20, endAt: 80, color: "#7c8c03", alpha: .9 }, + secondHand: { lineWidth: 2, startAt: 70, endAt: 94, color: "#d93d04", alpha: .85 }, + secondDecoration: { lineWidth: 1, startAt: 70, radius: 3, fillColor: "red", color: "black", alpha: .7 } + } +}; diff --git a/sdl1090/public_html/extension.js b/sdl1090/public_html/extension.js new file mode 100644 index 0000000..f71fe17 --- /dev/null +++ b/sdl1090/public_html/extension.js @@ -0,0 +1,19 @@ +// ----------------------------------------------------- +// +// This file is so users can modify how the page acts +// without diving to deep in the code. This way we can +// also try out or hold custom code for ourselves and +// not check it into the repo. +// +// There is a div id'ed as plane_extension for use with +// this javascript file. +// ----------------------------------------------------- + +function extendedInitalize() { + // Write your initalization here + // Gets called just before the 1-sec function call loop is setup +} + +function extendedPulse() { + // This will get called every second after all the main functions +} diff --git a/sdl1090/public_html/gmap.html b/sdl1090/public_html/gmap.html new file mode 100644 index 0000000..9ab2dc2 --- /dev/null +++ b/sdl1090/public_html/gmap.html @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + DUMP1090 + + +

+
+
+
+ +
+ Squak 7x00 is reported and shown.
+ This is most likely an error in reciving or decoding.
+ Please do not call the local authorities, they already know about it if it is valid squak. +
+
+ + diff --git a/sdl1090/public_html/options.js b/sdl1090/public_html/options.js new file mode 100644 index 0000000..f4e3627 --- /dev/null +++ b/sdl1090/public_html/options.js @@ -0,0 +1,17 @@ +var listKMLType = ['Approch', 'Departure', 'Transit', 'Custom1', 'Custom2']; +var listKMLs = localStorage['listKMLs'] || []; + +function optionsInitalize() { + // Write your initalization here + // Gets called just before the 1-sec function call loop is setup + $( "#dialog-modal" ).dialog({ + height: 140, + modal: true, + autoOpen: false, + closeOnEscape: false + }); +} + +function optionsModal() { + $( "#dialog-modal" ).dialog( "open"); +} diff --git a/sdl1090/public_html/planeObject.js b/sdl1090/public_html/planeObject.js new file mode 100644 index 0000000..98153fd --- /dev/null +++ b/sdl1090/public_html/planeObject.js @@ -0,0 +1,260 @@ +var planeObject = { + oldlat : null, + oldlon : null, + oldalt : null, + + // Basic location information + altitude : null, + speed : null, + track : null, + latitude : null, + longitude : null, + + // Info about the plane + flight : null, + squawk : null, + icao : null, + is_selected : false, + + // Data packet numbers + messages : null, + seen : null, + + // Vaild... + vPosition : false, + vTrack : false, + + // GMap Details + marker : null, + markerColor : MarkerColor, + lines : [], + trackdata : new Array(), + trackline : new Array(), + + // When was this last updated? + updated : null, + reapable : false, + + // Appends data to the running track so we can get a visual tail on the plane + // Only useful for a long running browser session. + funcAddToTrack : function(){ + // TODO: Write this function out + this.trackdata.push([this.latitude, this.longitude, this.altitude, this.track, this.speed]); + this.trackline.push(new google.maps.LatLng(this.latitude, this.longitude)); + }, + + // This is to remove the line from the screen if we deselect the plane + funcClearLine : function() { + if (this.line) { + this.line.setMap(null); + this.line = null; + } + }, + + // Should create an icon for us to use on the map... + funcGetIcon : function() { + this.markerColor = MarkerColor; + // If this marker is selected we should make it lighter than the rest. + if (this.is_selected == true) { + this.markerColor = SelectedColor; + } + + // If we have not seen a recent update, change color + if (this.seen > 15) { + this.markerColor = StaleColor; + } + + // Plane marker + var baseSvg = { + planeData : "M 1.9565564,41.694305 C 1.7174505,40.497708 1.6419973,38.448747 " + + "1.8096508,37.70494 1.8936398,37.332056 2.0796653,36.88191 2.222907,36.70461 " + + "2.4497603,36.423844 4.087816,35.47248 14.917931,29.331528 l 12.434577," + + "-7.050718 -0.04295,-7.613412 c -0.03657,-6.4844888 -0.01164,-7.7625804 " + + "0.168134,-8.6194061 0.276129,-1.3160905 0.762276,-2.5869575 1.347875," + + "-3.5235502 l 0.472298,-0.7553719 1.083746,-0.6085497 c 1.194146,-0.67053522 " + + "1.399524,-0.71738842 2.146113,-0.48960552 1.077005,0.3285939 2.06344," + + "1.41299352 2.797602,3.07543322 0.462378,1.0469993 0.978731,2.7738408 " + + "1.047635,3.5036272 0.02421,0.2570284 0.06357,3.78334 0.08732,7.836246 0.02375," + + "4.052905 0.0658,7.409251 0.09345,7.458546 0.02764,0.04929 5.600384,3.561772 " + + "12.38386,7.805502 l 12.333598,7.715871 0.537584,0.959688 c 0.626485,1.118378 " + + "0.651686,1.311286 0.459287,3.516442 -0.175469,2.011604 -0.608966,2.863924 " + + "-1.590344,3.127136 -0.748529,0.200763 -1.293144,0.03637 -10.184829,-3.07436 " + + "C 48.007733,41.72562 44.793806,40.60197 43.35084,40.098045 l -2.623567," + + "-0.916227 -1.981212,-0.06614 c -1.089663,-0.03638 -1.985079,-0.05089 -1.989804," + + "-0.03225 -0.0052,0.01863 -0.02396,2.421278 -0.04267,5.339183 -0.0395,6.147742 " + + "-0.143635,7.215456 -0.862956,8.845475 l -0.300457,0.680872 2.91906,1.361455 " + + "c 2.929379,1.366269 3.714195,1.835385 4.04589,2.41841 0.368292,0.647353 " + + "0.594634,2.901439 0.395779,3.941627 -0.0705,0.368571 -0.106308,0.404853 " + + "-0.765159,0.773916 L 41.4545,62.83158 39.259237,62.80426 c -6.030106,-0.07507 " + + "-16.19508,-0.495041 -16.870991,-0.697033 -0.359409,-0.107405 -0.523792," + + "-0.227482 -0.741884,-0.541926 -0.250591,-0.361297 -0.28386,-0.522402 -0.315075," + + "-1.52589 -0.06327,-2.03378 0.23288,-3.033615 1.077963,-3.639283 0.307525," + + "-0.2204 4.818478,-2.133627 6.017853,-2.552345 0.247872,-0.08654 0.247455," + + "-0.102501 -0.01855,-0.711959 -0.330395,-0.756986 -0.708622,-2.221756 -0.832676," + + "-3.224748 -0.05031,-0.406952 -0.133825,-3.078805 -0.185533,-5.937448 -0.0517," + + "-2.858644 -0.145909,-5.208974 -0.209316,-5.222958 -0.06341,-0.01399 -0.974464," + + "-0.0493 -2.024551,-0.07845 L 23.247235,38.61921 18.831373,39.8906 C 4.9432155," + + "43.88916 4.2929558,44.057819 3.4954426,43.86823 2.7487826,43.690732 2.2007966," + + "42.916622 1.9565564,41.694305 z" + }; + + // If the squawk code is one of the international emergency codes, + // match the info window alert color. + if (this.squawk == 7500) { + this.markerColor = "rgb(255, 85, 85)"; + } + if (this.squawk == 7600) { + this.markerColor = "rgb(0, 255, 255)"; + } + if (this.squawk == 7700) { + this.markerColor = "rgb(255, 255, 0)"; + } + + // If we have not overwritten color by now, an extension still could but + // just keep on trucking. :) + + return { + strokeWeight: (this.is_selected ? 2 : 1), + path: "M 0,0 "+ baseSvg["planeData"], + scale: 0.4, + fillColor: this.markerColor, + fillOpacity: 0.9, + anchor: new google.maps.Point(32, 32), // Set anchor to middle of plane. + rotation: this.track + }; + }, + + // TODO: Trigger actions of a selecting a plane + funcSelectPlane : function(selectedPlane){ + selectPlaneByHex(this.icao); + }, + + // Update our data + funcUpdateData : function(data){ + // So we can find out if we moved + var oldlat = this.latitude; + var oldlon = this.longitude; + var oldalt = this.altitude; + + // Update all of our data + this.updated = new Date().getTime(); + this.altitude = data.altitude; + this.speed = data.speed; + this.track = data.track; + this.latitude = data.lat; + this.longitude = data.lon; + this.flight = data.flight; + this.squawk = data.squawk; + this.icao = data.hex; + this.messages = data.messages; + this.seen = data.seen; + + // If no packet in over 58 seconds, consider the plane reapable + // This way we can hold it, but not show it just in case the plane comes back + if (this.seen > 58) { + this.reapable = true; + if (this.marker) { + this.marker.setMap(null); + this.marker = null; + } + if (this.line) { + this.line.setMap(null); + this.line = null; + } + if (SelectedPlane == this.icao) { + if (this.is_selected) { + this.is_selected = false; + } + SelectedPlane = null; + } + } else { + if (this.reapable == true) { + } + this.reapable = false; + } + + // Is the position valid? + if ((data.validposition == 1) && (this.reapable == false)) { + this.vPosition = true; + + // Detech if the plane has moved + changeLat = false; + changeLon = false; + changeAlt = false; + if (oldlat != this.latitude) { + changeLat = true; + } + if (oldlon != this.longitude) { + changeLon = true; + } + if (oldalt != this.altitude) { + changeAlt = true; + } + // Right now we only care about lat/long, if alt is updated only, oh well + if ((changeLat == true) || (changeLon == true)) { + this.funcAddToTrack(); + if (this.is_selected) { + this.line = this.funcUpdateLines(); + } + } + this.marker = this.funcUpdateMarker(); + PlanesOnMap++; + } else { + this.vPosition = false; + } + + // Do we have a valid track for the plane? + if (data.validtrack == 1) + this.vTrack = true; + else + this.vTrack = false; + }, + + // Update our marker on the map + funcUpdateMarker: function() { + if (this.marker) { + this.marker.setPosition(new google.maps.LatLng(this.latitude, this.longitude)); + this.marker.setIcon(this.funcGetIcon()); + } else { + this.marker = new google.maps.Marker({ + position: new google.maps.LatLng(this.latitude, this.longitude), + map: GoogleMap, + icon: this.funcGetIcon(), + visable: true + }); + + // This is so we can match icao address + this.marker.icao = this.icao; + + // Trap clicks for this marker. + google.maps.event.addListener(this.marker, 'click', this.funcSelectPlane); + } + + // Setting the marker title + if (this.flight.length == 0) { + this.marker.setTitle(this.hex); + } else { + this.marker.setTitle(this.flight+' ('+this.icao+')'); + } + return this.marker; + }, + + // Update our planes tail line, + // TODO: Make this multi colored based on options + // altitude (default) or speed + funcUpdateLines: function() { + if (this.line) { + var path = this.line.getPath(); + path.push(new google.maps.LatLng(this.latitude, this.longitude)); + } else { + this.line = new google.maps.Polyline({ + strokeColor: '#000000', + strokeOpacity: 1.0, + strokeWeight: 3, + map: GoogleMap, + path: this.trackline + }); + } + return this.line; + } +}; diff --git a/sdl1090/public_html/script.js b/sdl1090/public_html/script.js new file mode 100644 index 0000000..8212e50 --- /dev/null +++ b/sdl1090/public_html/script.js @@ -0,0 +1,658 @@ +// Define our global variables +var GoogleMap = null; +var Planes = {}; +var PlanesOnMap = 0; +var PlanesOnTable = 0; +var PlanesToReap = 0; +var SelectedPlane = null; +var SpecialSquawk = false; + +var iSortCol=-1; +var bSortASC=true; +var bDefaultSortASC=true; +var iDefaultSortCol=3; + +// Get current map settings +CenterLat = Number(localStorage['CenterLat']) || CONST_CENTERLAT; +CenterLon = Number(localStorage['CenterLon']) || CONST_CENTERLON; +ZoomLvl = Number(localStorage['ZoomLvl']) || CONST_ZOOMLVL; + +function fetchData() { + $.getJSON('/dump1090/data.json', function(data) { + PlanesOnMap = 0 + SpecialSquawk = false; + + // Loop through all the planes in the data packet + for (var j=0; j < data.length; j++) { + // Do we already have this plane object in Planes? + // If not make it. + if (Planes[data[j].hex]) { + var plane = Planes[data[j].hex]; + } else { + var plane = jQuery.extend(true, {}, planeObject); + } + + /* For special squawk tests + if (data[j].hex == '48413x') { + data[j].squawk = '7700'; + } //*/ + + // Set SpecialSquawk-value + if (data[j].squawk == '7500' || data[j].squawk == '7600' || data[j].squawk == '7700') { + SpecialSquawk = true; + } + + // Call the function update + plane.funcUpdateData(data[j]); + + // Copy the plane into Planes + Planes[plane.icao] = plane; + } + + PlanesOnTable = data.length; + }); +} + +// Initalizes the map and starts up our timers to call various functions +function initialize() { + // Make a list of all the available map IDs + var mapTypeIds = []; + for(var type in google.maps.MapTypeId) { + mapTypeIds.push(google.maps.MapTypeId[type]); + } + // Push OSM on to the end + mapTypeIds.push("OSM"); + mapTypeIds.push("dark_map"); + + // Styled Map to outline airports and highways + var styles = [ + { + "featureType": "administrative", + "stylers": [ + { "visibility": "off" } + ] + },{ + "featureType": "landscape", + "stylers": [ + { "visibility": "off" } + ] + },{ + "featureType": "poi", + "stylers": [ + { "visibility": "off" } + ] + },{ + "featureType": "road", + "stylers": [ + { "visibility": "off" } + ] + },{ + "featureType": "transit", + "stylers": [ + { "visibility": "off" } + ] + },{ + "featureType": "landscape", + "stylers": [ + { "visibility": "on" }, + { "weight": 8 }, + { "color": "#000000" } + ] + },{ + "featureType": "water", + "stylers": [ + { "lightness": -74 } + ] + },{ + "featureType": "transit.station.airport", + "stylers": [ + { "visibility": "on" }, + { "weight": 8 }, + { "invert_lightness": true }, + { "lightness": 27 } + ] + },{ + "featureType": "road.highway", + "stylers": [ + { "visibility": "simplified" }, + { "invert_lightness": true }, + { "gamma": 0.3 } + ] + },{ + "featureType": "road", + "elementType": "labels", + "stylers": [ + { "visibility": "off" } + ] + } + ] + + // Add our styled map + var styledMap = new google.maps.StyledMapType(styles, {name: "Dark Map"}); + + // Define the Google Map + var mapOptions = { + center: new google.maps.LatLng(CenterLat, CenterLon), + zoom: ZoomLvl, + mapTypeId: google.maps.MapTypeId.ROADMAP, + mapTypeControl: true, + streetViewControl: false, + mapTypeControlOptions: { + mapTypeIds: mapTypeIds, + position: google.maps.ControlPosition.TOP_LEFT, + style: google.maps.MapTypeControlStyle.DROPDOWN_MENU + } + }; + + GoogleMap = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); + + //Define OSM map type pointing at the OpenStreetMap tile server + GoogleMap.mapTypes.set("OSM", new google.maps.ImageMapType({ + getTileUrl: function(coord, zoom) { + return "http://tile.openstreetmap.org/" + zoom + "/" + coord.x + "/" + coord.y + ".png"; + }, + tileSize: new google.maps.Size(256, 256), + name: "OpenStreetMap", + maxZoom: 18 + })); + + GoogleMap.mapTypes.set("dark_map", styledMap); + + // Listeners for newly created Map + google.maps.event.addListener(GoogleMap, 'center_changed', function() { + localStorage['CenterLat'] = GoogleMap.getCenter().lat(); + localStorage['CenterLon'] = GoogleMap.getCenter().lng(); + }); + + google.maps.event.addListener(GoogleMap, 'zoom_changed', function() { + localStorage['ZoomLvl'] = GoogleMap.getZoom(); + }); + + // Add home marker if requested + if (SiteShow && (typeof SiteLat !== 'undefined' || typeof SiteLon !== 'undefined')) { + var siteMarker = new google.maps.LatLng(SiteLat, SiteLon); + var markerImage = new google.maps.MarkerImage( + 'http://maps.google.com/mapfiles/kml/pal4/icon57.png', + new google.maps.Size(32, 32), // Image size + new google.maps.Point(0, 0), // Origin point of image + new google.maps.Point(16, 16)); // Position where marker should point + var marker = new google.maps.Marker({ + position: siteMarker, + map: GoogleMap, + icon: markerImage, + title: 'My Radar Site', + zIndex: -99999 + }); + + if (SiteCircles) { + for (var i=0;i
uoe$MQ3Gp6EChOW_?GyA-Z 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 diff --git a/dump1090/mode_ac.o b/dump1090/mode_ac.o deleted file mode 100644 index b5745f4adb45ceea8bda12779e2a3c708cb667a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14044 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 N^=%E*@?YIB_P;7Fkk|kK diff --git a/dump1090/mode_s.o.REMOVED.git-id b/dump1090/mode_s.o.REMOVED.git-id deleted file mode 100644 index d8d6079..0000000 --- a/dump1090/mode_s.o.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -bdd60b55bc0624ff84544a794ae21d71eaf0adc8 \ No newline at end of file diff --git a/dump1090/net_io.o b/dump1090/net_io.o deleted file mode 100644 index 92db651b18a0a541bc6f2cf06ece0028e86706dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40816 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

sd8o@(3inYDA80g!c-6<;vxpF^)5; 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 WZt)XvWW$$LI_JXTk_qFeYyBT;gTVO! diff --git a/dump1090/view1090.REMOVED.git-id b/dump1090/view1090.REMOVED.git-id deleted file mode 100644 index cd5a2a1..0000000 --- a/dump1090/view1090.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -18958032218e1a8e0ef5b79733e5e4b9dd540f61 \ No newline at end of file diff --git a/dump1090/view1090.o b/dump1090/view1090.o deleted file mode 100644 index a9231fc001b09429d43ac3e03493b9f8bdb459f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19276 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 F{|BT8g&Y6? diff --git a/sdl1090/font.c b/font.c similarity index 100% rename from sdl1090/font.c rename to font.c diff --git a/sdl1090/font.h b/font.h similarity index 100% rename from sdl1090/font.h rename to font.h diff --git a/font.o b/font.o new file mode 100644 index 0000000000000000000000000000000000000000..2f5a7e047d9a29cddc5328e7f25f41da180e50d4 GIT binary patch literal 33952 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 DE&mh> literal 0 HcmV?d00001 diff --git a/sdl1090/font/DroidSansMono.ttf.REMOVED.git-id b/font/DroidSansMono.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/DroidSansMono.ttf.REMOVED.git-id rename to font/DroidSansMono.ttf.REMOVED.git-id diff --git a/sdl1090/font/Envy Code R Bold.ttf.REMOVED.git-id b/font/Envy Code R Bold.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Envy Code R Bold.ttf.REMOVED.git-id rename to font/Envy Code R Bold.ttf.REMOVED.git-id diff --git a/sdl1090/font/Envy Code R Italic.ttf.REMOVED.git-id b/font/Envy Code R Italic.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Envy Code R Italic.ttf.REMOVED.git-id rename to font/Envy Code R Italic.ttf.REMOVED.git-id diff --git a/sdl1090/font/Envy Code R.ttf.REMOVED.git-id b/font/Envy Code R.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Envy Code R.ttf.REMOVED.git-id rename to font/Envy Code R.ttf.REMOVED.git-id diff --git a/sdl1090/font/Monoid-Bold.ttf.REMOVED.git-id b/font/Monoid-Bold.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Monoid-Bold.ttf.REMOVED.git-id rename to font/Monoid-Bold.ttf.REMOVED.git-id diff --git a/sdl1090/font/Monoid-Italic.ttf.REMOVED.git-id b/font/Monoid-Italic.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Monoid-Italic.ttf.REMOVED.git-id rename to font/Monoid-Italic.ttf.REMOVED.git-id diff --git a/sdl1090/font/Monoid-Regular.ttf.REMOVED.git-id b/font/Monoid-Regular.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Monoid-Regular.ttf.REMOVED.git-id rename to font/Monoid-Regular.ttf.REMOVED.git-id diff --git a/sdl1090/font/Monoid-Retina.ttf.REMOVED.git-id b/font/Monoid-Retina.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Monoid-Retina.ttf.REMOVED.git-id rename to font/Monoid-Retina.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_AmstradPC1512-2y.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_AmstradPC1512-2y.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_AmstradPC1512-2y.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_AmstradPC1512-2y.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_AmstradPC1512.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_AmstradPC1512.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_AmstradPC1512.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_AmstradPC1512.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_BIOS-2x.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_BIOS-2x.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_BIOS-2x.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_BIOS-2x.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_BIOS-2y.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_BIOS-2y.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_BIOS-2y.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_BIOS-2y.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_BIOS.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_BIOS.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_BIOS.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_BIOS.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_CGA-2y.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_CGA-2y.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_CGA-2y.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_CGA-2y.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_CGA.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_CGA.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_CGA.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_CGA.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_CGAthin-2y.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_CGAthin-2y.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_CGAthin-2y.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_CGAthin-2y.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_CGAthin.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_CGAthin.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_CGAthin.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_CGAthin.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_EGA8-2x.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_EGA8-2x.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_EGA8-2x.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_EGA8-2x.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_EGA8.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_EGA8.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_EGA8.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_EGA8.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_EGA9-2x.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_EGA9-2x.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_EGA9-2x.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_EGA9-2x.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_EGA9.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_EGA9.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_EGA9.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_EGA9.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_MDA.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_MDA.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_MDA.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_MDA.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_VGA8-2x.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_VGA8-2x.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_VGA8-2x.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_VGA8-2x.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_VGA8.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_VGA8.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_VGA8.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_VGA8.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_VGA9-2x.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_VGA9-2x.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_VGA9-2x.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_VGA9-2x.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_IBM_VGA9.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_VGA9.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_IBM_VGA9.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_IBM_VGA9.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_TandyNew_225-2y.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_TandyNew_225-2y.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_TandyNew_225-2y.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_TandyNew_225-2y.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_TandyNew_225.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_TandyNew_225.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_TandyNew_225.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_TandyNew_225.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_TandyNew_TV-2y.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_TandyNew_TV-2y.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_TandyNew_TV-2y.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_TandyNew_TV-2y.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_TandyNew_TV.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_TandyNew_TV.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_TandyNew_TV.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_TandyNew_TV.ttf.REMOVED.git-id diff --git a/sdl1090/font/PxPlus/PxPlus_VGA_SquarePx.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_VGA_SquarePx.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/PxPlus/PxPlus_VGA_SquarePx.ttf.REMOVED.git-id rename to font/PxPlus/PxPlus_VGA_SquarePx.ttf.REMOVED.git-id diff --git a/sdl1090/font/TerminusTTF-4.46.0.ttf.REMOVED.git-id b/font/TerminusTTF-4.46.0.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/TerminusTTF-4.46.0.ttf.REMOVED.git-id rename to font/TerminusTTF-4.46.0.ttf.REMOVED.git-id diff --git a/sdl1090/font/TerminusTTF-Bold-4.46.0.ttf.REMOVED.git-id b/font/TerminusTTF-Bold-4.46.0.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/TerminusTTF-Bold-4.46.0.ttf.REMOVED.git-id rename to font/TerminusTTF-Bold-4.46.0.ttf.REMOVED.git-id diff --git a/sdl1090/font/Ubuntu-B.ttf.REMOVED.git-id b/font/Ubuntu-B.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Ubuntu-B.ttf.REMOVED.git-id rename to font/Ubuntu-B.ttf.REMOVED.git-id diff --git a/sdl1090/font/Ubuntu-BI.ttf.REMOVED.git-id b/font/Ubuntu-BI.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Ubuntu-BI.ttf.REMOVED.git-id rename to font/Ubuntu-BI.ttf.REMOVED.git-id diff --git a/sdl1090/font/Ubuntu-C.ttf.REMOVED.git-id b/font/Ubuntu-C.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Ubuntu-C.ttf.REMOVED.git-id rename to font/Ubuntu-C.ttf.REMOVED.git-id diff --git a/sdl1090/font/Ubuntu-L.ttf.REMOVED.git-id b/font/Ubuntu-L.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Ubuntu-L.ttf.REMOVED.git-id rename to font/Ubuntu-L.ttf.REMOVED.git-id diff --git a/sdl1090/font/Ubuntu-LI.ttf.REMOVED.git-id b/font/Ubuntu-LI.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Ubuntu-LI.ttf.REMOVED.git-id rename to font/Ubuntu-LI.ttf.REMOVED.git-id diff --git a/sdl1090/font/Ubuntu-M.ttf.REMOVED.git-id b/font/Ubuntu-M.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Ubuntu-M.ttf.REMOVED.git-id rename to font/Ubuntu-M.ttf.REMOVED.git-id diff --git a/sdl1090/font/Ubuntu-MI.ttf.REMOVED.git-id b/font/Ubuntu-MI.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Ubuntu-MI.ttf.REMOVED.git-id rename to font/Ubuntu-MI.ttf.REMOVED.git-id diff --git a/sdl1090/font/Ubuntu-R.ttf.REMOVED.git-id b/font/Ubuntu-R.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Ubuntu-R.ttf.REMOVED.git-id rename to font/Ubuntu-R.ttf.REMOVED.git-id diff --git a/sdl1090/font/Ubuntu-RI.ttf.REMOVED.git-id b/font/Ubuntu-RI.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/Ubuntu-RI.ttf.REMOVED.git-id rename to font/Ubuntu-RI.ttf.REMOVED.git-id diff --git a/sdl1090/font/UbuntuMono-B.ttf.REMOVED.git-id b/font/UbuntuMono-B.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/UbuntuMono-B.ttf.REMOVED.git-id rename to font/UbuntuMono-B.ttf.REMOVED.git-id diff --git a/sdl1090/font/UbuntuMono-BI.ttf.REMOVED.git-id b/font/UbuntuMono-BI.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/UbuntuMono-BI.ttf.REMOVED.git-id rename to font/UbuntuMono-BI.ttf.REMOVED.git-id diff --git a/sdl1090/font/UbuntuMono-R.ttf.REMOVED.git-id b/font/UbuntuMono-R.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/UbuntuMono-R.ttf.REMOVED.git-id rename to font/UbuntuMono-R.ttf.REMOVED.git-id diff --git a/sdl1090/font/UbuntuMono-RI.ttf.REMOVED.git-id b/font/UbuntuMono-RI.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/UbuntuMono-RI.ttf.REMOVED.git-id rename to font/UbuntuMono-RI.ttf.REMOVED.git-id diff --git a/sdl1090/font/unifont.ttf.REMOVED.git-id b/font/unifont.ttf.REMOVED.git-id similarity index 100% rename from sdl1090/font/unifont.ttf.REMOVED.git-id rename to font/unifont.ttf.REMOVED.git-id diff --git a/sdl1090/init.c b/init.c similarity index 100% rename from sdl1090/init.c rename to init.c diff --git a/sdl1090/init.h b/init.h similarity index 100% rename from sdl1090/init.h rename to init.h diff --git a/init.o b/init.o new file mode 100644 index 0000000000000000000000000000000000000000..be8eca9864c0b36699443f2b381c91a7c8412741 GIT binary patch literal 45216 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 bLh$$e71y@?IL)+I|1kOg4OgVA8NdGz`#PWq literal 0 HcmV?d00001 diff --git a/sdl1090/list.c b/list.c similarity index 100% rename from sdl1090/list.c rename to list.c diff --git a/list.o b/list.o new file mode 100644 index 0000000000000000000000000000000000000000..c793279329317858944dac50bef824c7ac31ef92 GIT binary patch literal 48216 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%0AGHwE99Y^h~Pvd$%*PnydxSm%xa(Okb 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 Pe+T=&-K;4Ez5f3LdE?iA literal 0 HcmV?d00001 diff --git a/dump1090/mode_s.c.REMOVED.git-id b/mode_s.c.REMOVED.git-id similarity index 100% rename from dump1090/mode_s.c.REMOVED.git-id rename to mode_s.c.REMOVED.git-id diff --git a/mode_s.o.REMOVED.git-id b/mode_s.o.REMOVED.git-id new file mode 100644 index 0000000..d25222c --- /dev/null +++ b/mode_s.o.REMOVED.git-id @@ -0,0 +1 @@ +a3e48b2319025f5869b2710bf017dfcb96c1fb89 \ No newline at end of file diff --git a/sdl1090/monokai.c b/monokai.c similarity index 100% rename from sdl1090/monokai.c rename to monokai.c diff --git a/sdl1090/monokai.h b/monokai.h similarity index 100% rename from sdl1090/monokai.h rename to monokai.h diff --git a/monokai.o b/monokai.o new file mode 100644 index 0000000000000000000000000000000000000000..841bfa3a41dfd45b0e0b61f13fe3376d1c9a2e03 GIT binary patch literal 23936 zcmbuH33yx8mB*hf$8qAsah!#01VaNPfY&%7gb*ytPqq@-5|SJ{6cDl{FJMcqBxh^c zx3HA5wWKT|P==48v<+*4Qc7uPDYPspFcc_5p=APeS_*})gvE32x#vlGeqZ*nh~x9dFf54E+9Y6T3+5(<4$7_e?j8QjTBF*-T@%h!S;oyt0&} zvwX7hI34ADE787Efn^G^cFE!OO08s)BBiC1h7%bHSayO6DCYpJdPS0mc79ViCzY3# zU#FBDoZe*R=ImZ^eq2L(Q^;>PKRH$1wEMFw$yu)5pDTBjc7LJV^R)X*<*w203FTfo zm4x9m9Lm$6Jr4G)(w-9bv}jK$dpfjd5_2o{aWXJ2p|s7VVkqSV^99wdWv58+p#xo_UTKrFMb#EOKPXvt4@*cbrFRS7}eJ z;|lWZ(4IQ>?9!fk_S~sG4eZ&iJxz{-Db7RMvz*KJxc01YY@>Yk7!?$5IB(!?nCIN3 zDyf_DR^=4;ZK}G`4R@&8RvBgGM-nS5-$lM@sv}jgrz=ZRRP`p)%Pcy}s8m5SlyIKt zP+YrP^4u8^DR59GlqxmJy!9ltb3sf6mU5u8 zoNt`bly|w=S!wFcy_BbRKG09j>dB=iP_&BXe~@PuxkNhHUBc4IvXtc{mSrp_vn*#h zh2>P171>nH*;EW>T1u+f@Xp?%;T+@t$TgeBsaO3=X=LLKzxXf3<1$H&joGT5N-K_Z zRMKQKCuLMDb8M&fGv*8$6-TktF{jU{IGUX$bD~DYG3<02b5+cWT8GMoWpW1%Y#_XV>zGY z0+tI|E@F8w%f&1YVOhiSP?m?W{0hq@EDvXS1j{2?E@iolsdCi zY-HKQayiRpmMd7UWO*#hRV0;T+(#^7srODF6vYllI zOE1fHEZ4L2vFv2o#nR6*!15%PL6#wwVV2!2H?Zts*~@Yx%ad7tmE|ccPi1);%LvQU zSw>m*vFv9VV;N^Tz;ck~5X)hfXRthz%jZ}=&+-M9ds+UD<%=v|V)-)5|6utF%iptnmE~(JUuXFT zmT$8BBg?l~zRmJaEdR{%9hU!fkeVzV4!)J>n^WIP^=*>AmFe4LeJj_uDf%{5-zxNN zn!Zifw@Q7Rp>I|CHdEiK^=+2E&DOU$`ZibJ4$`-I`ZizR7U9bh0dEIY}=TGqwdupBD>WJZ7BRXY*HWNLl`Qs_kYvt|0#uwKVZn zRz6N{9aLfu($HB9ma1JxE)m|T^;VZ%Ognkrsa2OBrS{y~Jw;)?Q>&hO1-bQxxq8|) zgmc|qxCD5d#QF;DR+Z*&s6SJ+C57Zphdf9D|efA&r$9U?VhXLKJ7k8xdYlg zPr1Xi%~CC0R^G#MkR&%?_52se$#t(@xPx-cRg>W?r&{3=mKKAPiovpCaB?wNUJOnt z2B#K-6~*ARVsN@0&QHZ-#;i&^G#oP>hgZ(3a8@p?tfJvpGS_fcuC6$~LM?O7B}PTX zS_-2rkT}UCCe0v9Ev#-zYw{6>x|PpzI4dhER9t1-Q>JGVT1DDZ#XHG6OL;4-Y-lg- zaCm2_7}F1>bm}Rvau!8hGoN~$#maluQi`{T zQktDD(-D^&`W5^@IKW^;=f0jI3;~9T`rHZ>b$jjMpDqKb+_v z8IQ#c))P;mUf*ygZBwy%>O*b5Cc{W)VzKx@-HA|^7m<8&fVXfhhj3~6P`Jfad#^pl_V zzREu~yd^%O@)!T6;aFUiLA>eyXrezEQ;7>1ji=Mm!FXSCOOB=DiC8?9^Jg-uaui`S zIu?s&qU50~ok@-NXH;HvjV2SxGo!=WV~ivdgEi_Qf+|wT?do#-+suf$&UA6GU)fKb{dzzLbXf`70p=2u4H$K2Y z;rN!!cq(p0y#B~Yvj5D8u0g=%UT?PfgKcIo(i?1V#blc7K$pYS88Cw(S67=o(AyO@ zgI%t$*WcyxL4j;x&GvY1e`lbZqAFt}^RWloBCh1(QIC#fq`@!>JsqxP@`#!jzhD#eI^+RTR^rhIcp_Xz%)jpeen@bl59Ea z>WHg0wO6Oj8wyafhI+hVcZWTQTC>ya)Op#)Lw8r3-xwQCoN3n&xVl4>FHH)Ztu2bj zEB0jT$fm{y^`9D^fg}yPbVT=dwl37zLDLg7Lq&@g>TV4OT{JZNMxy;tm`-mO4$t+i zZC;*{Xv`h#YVs!BJNc6k%qS5u@>&t?&ObCBV8x(qb| zE^m_Yn5|dHXPU)wRD&crp5f$Iaq8*lCT+a70{dKD?Z>JiP%xtWG<#M)mS@?5!I*6vpF14% z<=Mm*dt%xwX$%HUqdhtrw}-mBgF&;)y|KH?8#ZK(C^Sc!X5HOB7o}m3O=F(JNMtM;``=Vo*z=~A>c!TxC4H=2-xdbu zVGBFX9?umB_-IvB%MJvn(HIDt8yFYNvYoD84zSHP)ETBd6*T}<=kTgw8)7`~>0Vdd z6%5ki!z*cPd(eoCMpI|TQ?Oe2T)r@m+EhFmi}Xd)V4N~mLM9nlq45Q1ndmN@723QT zylu3ksST68@SU`-+6lE5^dS#Dk1G`R_=7#JAS~*nPbQF{-Ge!f~O%U+*n!fPHfEl3$*X-4H4Y1i>Qk`FCw=e7s__Pf{gjKvC zufp{hcE*$r4}Y^OTx4l1vb6}AzG6oNichO?cK_8g9Lo$9lvwW*Y%Ol$=9?CEuOG&4 z$n5kMS*3Xh74A@}N(Ve(WQV$1NR(;lEpy@gMRidJr0gjv&n9Wt5-~RG{j|coZz)WH zHgrWNqBd$kvdckhzn?WQwZ_?-OfRIg_o2+}AymiQ;UzcT`;+5%q9e`rpy^V*qZ&Tn z{&|gv(d^D=kGvg3uJ>{_#rE9YxYAw@bwr>Iy6mU(Y`$>)2?S~J3%P?P?l;U{vMGDA z;SPVdI+ulV>j(D)?HKz;^x3bE_QB(0xs@kZ((bPHUFv9Jv$L=Z4BzZEY2SfUkW5c% zl2N+^S~1j(rUiAQqo}&AFv4L^B)iipSdYVM_h-wT`atC$*_4S=@r!PrNJX8piwrnw z;#R+ZeWxq99wt+(qGTY^)F5YRU!zv6SYbr6h1G{B+h){yB+zd!Z>QPSZ6_W6PG~CX zNx#om_zZxGTc}L6quDWN(q`00C)RCooRvsHwRQ0$1O+a)7l#N;$8dmwtw9q<&oj@0 zCj`w#wqba;YwJHSdiAh`ES83yGJ;}9&Es?+x2 zcLO>vnsey^Ph1x??=csp+e^;_#`8nuvC)c^H1O#`(5B&3GGS~UqQ^pc(M4%Fo$76k zet_cvFSEP>7mH`(_IQ0}WNc(SEyK28qY+exIEit<1;rx^N`9-l)ZkPLt9m}h>uTQ8 zRBW^b&2V>6n_^zGb27I2>7x%nH7sn6X1es6pPdK_o{qYM1uIohor7$-(A?ys2VvPp z(phEuRQEJB{lG{vnkk4{Z|H%k^{_N+aiNW&pa}zz&+8rP zsNUYyUE^+StU0!>xvrt6b~H1dh@UVRr<3|{KY636{-G1-@qF#d=9=2Unp%HTP3=HB zLkn>2SSp!`_h*u+T6)w>8zy^w)G?1|HrnjO;Y8x^Wn09fPv5yAs7+9wbm?tj!5JX;@Doq3+6HwUTD{>;+TrsFy0K|F7Q9jCT(ECY z!>>K)r$>(3Wb%eOjR;sa$N==CF4oP@F}w51RgG=VgTtMY;NDl(n>TI>^YYMh%R&>^ z4`gs5YSc}TKb|SUUYaE6$*-*Xg*BJw#P$Zrbrnq#@;JM2ZO-iwv501`+vn;u#>P`) zv}eT7!YYA5cA9NoI*1pZcIdf$L29~>^ShyWc@ri`FIWm9f|XLAS`BQ2Ne6ZsL<-X>EV##z&A6>$>FBSvghggCPa`x3od@u#nx_#5ePhAk zp@of%0G|(e8lfRQjWFKb{s1ifdE+N*YHG7hR%q`g^#~dYuMkXF3PJG|f(j@EGnYbo z@(S`xJ$wbC!l5z>=~*OOa_YA1(|}0-c#2+7j*O4Oq^n=qsG+#BxyTk=&fbyn#CSSR zhaX$lQU(<6rh|R~=VeDfNjBQu?$tF*yZh)MI<6O#+QxDAHJ;tLs;;5Au5p>>>Ye0) zFM3Z)uQUIyzPB#8=o8}trhrpkL}Q>+y|*oLIn@i(BA3(P@1zStoCbfEU4-*T7ezRK z^IL?|Cl^I7r~WF~7D6xX>BCz6f?WkzC05_KDsK6$`yAo?xk{e?Lg7}XbqtIq+{Wu@;Tw<>3if^=EDo!pA6{MBV~AGsA@$~4DA!jA#o z%lyNM8sW;XF7^G(Oyk1|D_!e8D%@%x>%R2>{GtQ!?CbP?dUF|*J+^*3mwlwd&vWF$85t>azH~V&e4S315m^ZKuFuraAp>lFre<=SafzO$J|9`ZJ{<#{vJ4Kjt=! z7T|Bl6rk)#T~<0j62nw>q%MoE6GPspahCr;hE^Q-wNm~RaPb_+W!pT?P3p`fv1FD2>f;F->ZSA#cp>3zf0Qj`@lbyc6$i;2~y4{f$tZ-7kG{2 z`=7v%6#f_Bb;3UdzCw7J)Z6OcpC|`ivw$y@iT_aGkFz#?>j-?Gq|*%iW9i2h;IGNJ z@ByDI^U~$O*GPL_1-wD*=O*CwVuyDEzfsEhGvrdvr-7d*>AwX06lvc#fsac+eg?co zc)4s{toA=t$~gmgl)lze*KFW_q|f=(bp-Hdq<Eur%lO?0 z{B4=9V!(rv{?~w?C;h$!c&m)-vw%M(?R+Wl?UMd=z?TWX8~AUe{PzOiF6Dm+_|3u} z1OBY=J;0|(zdQ|Gf0b_-&jWYLJp3|n{ks9fcpdm*QvSDqpCRqJ4|rO}%U^-NA^Da_ zJ6U%4YvKAASGjdIARB~A(C-ob!+?Jz_O=xGGumv8I^ZYEI@=8VGAaLR;5SRYEx?2|koF$|{x@r10eq^|YYXtbQm?at&z1S-Lf~JO z@>~Y|6tTmdz@L>P&F#SdF6rC_d_u~z8~9$CPaXt*qu9fv!1Zr04C4vl-md-E$|1WzHPuqWZ$(8`1{iS0pQn){s!Q; z2|oq+J;M8dKQ4R-_;bP&z~2y_0sh~@w*miL__@FME_V1K@Dl0Ye*#}3`d-A~CZ;^Cjz{jNh&j7wq=E*VOC(69J3Harb{x^VMFXQNZ;El3g zZwH>1=L}Z@zd-nPz^@g41Mu$&-v#_W;dcQ4h48z9|4#V5z~2`B5b%$LKL&iUtk-*h z_lrF|4csgG&jXK%9li{Fx!C{fz#GI4-vS;L|32V{N;-c9J|_Eze*hnm{~lJRpC|3#1$?LQFz~gK&dI=ci~i}rcgeUO0KQq$83BH& z@D%WarJc6`|3K{aY~ZERKoX-(lk|@OeyjM80e-5CmnPs}mwm`8;4x{3wZMNR>!$TQ)oO=Fq+aVl-tr|!cPJ2kpAcc-Y@z?z#BzB0lZUq2Kcb>ZNL}H{CO_$M&TC&Zxen6@E+mU06#SNOTS*)(|S%|rT>|f zry0_T$hm$saBH5`zsJv||FZOp2lV#|*T2or>F*aF1pR4ZC%wQI3qK8bgYX#egQefk z0Dh6GI9+4Fmq@#90`3z#`3CUUto=W5_4m%ywH^51H8!pU{#%(>uLC|T`ZoaIFLr3{ zcdUN=SjN#EpntE-hj#<768o{*gNd)~5zf1HVVw^LgMm z$~bx%_`PzDdmVVI@V9`UFLt{R_$89>UxDwJbp8SSZE5HIz}v;oF9xZPtakf~v`?AX zm&G08p9Xx3=vM>3S;{#NxV26%2L3HsXO{rC>Uk9KpNqc%_-e`5I)AHRRn@RO2Ur98 zaT&jE;MViLb-;JZcsvRCgJS=^z|+#s5#R?)c?N*bmhy}O*MGH${@4L<_2(Vb^>yH{ zNx$g7jhE|RkBp;BLH{_J=k*`S%jvI|adAE9PqEf<;9;3J{tftCSx@fy|uysS=m;PSD>hc7A`JzAX8y|5MO^M#j;v^Yo>OS${9+ThGDY0DhvR z^B(Z4rGGyG{yS-h5}D5|duW#VsuFmk%-aiqyQRKI0Dn%}tqJ%uQl7QI2PEHhz*}YC zz5#f*`1^oc@9z`9XUe>1JrA?$d$;8KUC_7M`F7wxka>8waAiL-RJgw$2K}R@eV)wI zmm$jf&w~EDlGv+x`tqob_1^}4{g=`V<8OKTvNW>(KS6&~5-SyZQRSB=VEyUBt@imu z){*&n`qBife;DZ3tB7>f<>||jfcdeYf4QXZ&eNAJXMG>&pDX^}JbhWZSU(E-<K~{|FQJf`FZ-11nXZ8`tM6)SkKp0bwq{r@6Jm{x`Me3C!U98s4zF`(pyLA z_l9)Or1X8ra;YDR8+Gc>1Q~UG>9kR&z8TLO5LdIPmYep={Kl#3Ho739sRI`ei)+uV#)veQgfwh6RW;ff-RN$YYfd?VSh4&M7o%*3K=2xY1H|7bgP?}O^Dm6Qo&t-N|CL@H%POZT zzuE#|`6I+IO%-#i@vZwNVHkg~R;Q!-C;zhI zS@&}&&~oSNT`TePnR279^2?HEQ{5r)ACf@Tooar-_EXC=+OA3{AQjr7Jb4%9ubQb? Q{12r6zLghOIWhkK0KFDsjsO4v literal 0 HcmV?d00001 diff --git a/dump1090/net_io.c b/net_io.c similarity index 100% rename from dump1090/net_io.c rename to net_io.c diff --git a/net_io.o.REMOVED.git-id b/net_io.o.REMOVED.git-id new file mode 100644 index 0000000..4dadfa7 --- /dev/null +++ b/net_io.o.REMOVED.git-id @@ -0,0 +1 @@ +bdaa5132f81b7d6b55135413ab297b03f4791e00 \ No newline at end of file diff --git a/boot.jpg b/old_hw_build/boot.jpg similarity index 100% rename from boot.jpg rename to old_hw_build/boot.jpg diff --git a/boot.psd.REMOVED.git-id b/old_hw_build/boot.psd.REMOVED.git-id similarity index 100% rename from boot.psd.REMOVED.git-id rename to old_hw_build/boot.psd.REMOVED.git-id diff --git a/build.sh b/old_hw_build/build.sh similarity index 100% rename from build.sh rename to old_hw_build/build.sh diff --git a/digistump_firmware/encoder_loop_debounce/encoder_loop_debounce.ino b/old_hw_build/digistump_firmware/encoder_loop_debounce/encoder_loop_debounce.ino similarity index 100% rename from digistump_firmware/encoder_loop_debounce/encoder_loop_debounce.ino rename to old_hw_build/digistump_firmware/encoder_loop_debounce/encoder_loop_debounce.ino diff --git a/digistump_firmware/encoder_loop_debounce_002/encoder_loop_debounce_002.ino b/old_hw_build/digistump_firmware/encoder_loop_debounce_002/encoder_loop_debounce_002.ino similarity index 100% rename from digistump_firmware/encoder_loop_debounce_002/encoder_loop_debounce_002.ino rename to old_hw_build/digistump_firmware/encoder_loop_debounce_002/encoder_loop_debounce_002.ino diff --git a/digistump_firmware/libraries/readme.txt b/old_hw_build/digistump_firmware/libraries/readme.txt similarity index 100% rename from digistump_firmware/libraries/readme.txt rename to old_hw_build/digistump_firmware/libraries/readme.txt diff --git a/dim.sh b/old_hw_build/dim.sh similarity index 100% rename from dim.sh rename to old_hw_build/dim.sh diff --git a/dump1090/.gitignore b/old_hw_build/dump1090/.gitignore similarity index 100% rename from dump1090/.gitignore rename to old_hw_build/dump1090/.gitignore diff --git a/dump1090/Makefile b/old_hw_build/dump1090/Makefile similarity index 100% rename from dump1090/Makefile rename to old_hw_build/dump1090/Makefile diff --git a/dump1090/README.md b/old_hw_build/dump1090/README.md similarity index 100% rename from dump1090/README.md rename to old_hw_build/dump1090/README.md diff --git a/dump1090/TODO b/old_hw_build/dump1090/TODO similarity index 100% rename from dump1090/TODO rename to old_hw_build/dump1090/TODO diff --git a/sdl1090/anet.c b/old_hw_build/dump1090/anet.c similarity index 100% rename from sdl1090/anet.c rename to old_hw_build/dump1090/anet.c diff --git a/sdl1090/anet.h b/old_hw_build/dump1090/anet.h similarity index 100% rename from sdl1090/anet.h rename to old_hw_build/dump1090/anet.h diff --git a/dump1090/coaa.h b/old_hw_build/dump1090/coaa.h similarity index 100% rename from dump1090/coaa.h rename to old_hw_build/dump1090/coaa.h diff --git a/dump1090/coaa1090.obj b/old_hw_build/dump1090/coaa1090.obj similarity index 100% rename from dump1090/coaa1090.obj rename to old_hw_build/dump1090/coaa1090.obj diff --git a/dump1090/dump1090-win.1.10.3010.14.zip.REMOVED.git-id b/old_hw_build/dump1090/dump1090-win.1.10.3010.14.zip.REMOVED.git-id similarity index 100% rename from dump1090/dump1090-win.1.10.3010.14.zip.REMOVED.git-id rename to old_hw_build/dump1090/dump1090-win.1.10.3010.14.zip.REMOVED.git-id diff --git a/sdl1090/dump1090.c b/old_hw_build/dump1090/dump1090.c similarity index 100% rename from sdl1090/dump1090.c rename to old_hw_build/dump1090/dump1090.c diff --git a/dump1090/dump1090.dsp b/old_hw_build/dump1090/dump1090.dsp similarity index 100% rename from dump1090/dump1090.dsp rename to old_hw_build/dump1090/dump1090.dsp diff --git a/dump1090/dump1090.dsw b/old_hw_build/dump1090/dump1090.dsw similarity index 100% rename from dump1090/dump1090.dsw rename to old_hw_build/dump1090/dump1090.dsw diff --git a/dump1090/dump1090.h b/old_hw_build/dump1090/dump1090.h similarity index 100% rename from dump1090/dump1090.h rename to old_hw_build/dump1090/dump1090.h diff --git a/dump1090/dump1090.rc b/old_hw_build/dump1090/dump1090.rc similarity index 100% rename from dump1090/dump1090.rc rename to old_hw_build/dump1090/dump1090.rc diff --git a/dump1090/dump1090.sh b/old_hw_build/dump1090/dump1090.sh similarity index 100% rename from dump1090/dump1090.sh rename to old_hw_build/dump1090/dump1090.sh diff --git a/dump1090/interactive.c b/old_hw_build/dump1090/interactive.c similarity index 100% rename from dump1090/interactive.c rename to old_hw_build/dump1090/interactive.c diff --git a/dump1090/interactive.old b/old_hw_build/dump1090/interactive.old similarity index 100% rename from dump1090/interactive.old rename to old_hw_build/dump1090/interactive.old diff --git a/dump1090/makedump1090 b/old_hw_build/dump1090/makedump1090 similarity index 100% rename from dump1090/makedump1090 rename to old_hw_build/dump1090/makedump1090 diff --git a/dump1090/makeppup1090 b/old_hw_build/dump1090/makeppup1090 similarity index 100% rename from dump1090/makeppup1090 rename to old_hw_build/dump1090/makeppup1090 diff --git a/dump1090/makeview1090 b/old_hw_build/dump1090/makeview1090 similarity index 100% rename from dump1090/makeview1090 rename to old_hw_build/dump1090/makeview1090 diff --git a/sdl1090/mode_ac.c b/old_hw_build/dump1090/mode_ac.c similarity index 100% rename from sdl1090/mode_ac.c rename to old_hw_build/dump1090/mode_ac.c diff --git a/sdl1090/mode_s.c.REMOVED.git-id b/old_hw_build/dump1090/mode_s.c.REMOVED.git-id similarity index 100% rename from sdl1090/mode_s.c.REMOVED.git-id rename to old_hw_build/dump1090/mode_s.c.REMOVED.git-id diff --git a/sdl1090/net_io.c b/old_hw_build/dump1090/net_io.c similarity index 100% rename from sdl1090/net_io.c rename to old_hw_build/dump1090/net_io.c diff --git a/dump1090/ppup1090.c b/old_hw_build/dump1090/ppup1090.c similarity index 100% rename from dump1090/ppup1090.c rename to old_hw_build/dump1090/ppup1090.c diff --git a/dump1090/ppup1090.h b/old_hw_build/dump1090/ppup1090.h similarity index 100% rename from dump1090/ppup1090.h rename to old_hw_build/dump1090/ppup1090.h diff --git a/dump1090/ppup1090.sh b/old_hw_build/dump1090/ppup1090.sh similarity index 100% rename from dump1090/ppup1090.sh rename to old_hw_build/dump1090/ppup1090.sh diff --git a/dump1090/pthreads/pthread.h b/old_hw_build/dump1090/pthreads/pthread.h similarity index 100% rename from dump1090/pthreads/pthread.h rename to old_hw_build/dump1090/pthreads/pthread.h diff --git a/dump1090/pthreads/sched.h b/old_hw_build/dump1090/pthreads/sched.h similarity index 100% rename from dump1090/pthreads/sched.h rename to old_hw_build/dump1090/pthreads/sched.h diff --git a/dump1090/pthreads/semaphore.h b/old_hw_build/dump1090/pthreads/semaphore.h similarity index 100% rename from dump1090/pthreads/semaphore.h rename to old_hw_build/dump1090/pthreads/semaphore.h diff --git a/dump1090/public_html/config.js b/old_hw_build/dump1090/public_html/config.js similarity index 100% rename from dump1090/public_html/config.js rename to old_hw_build/dump1090/public_html/config.js diff --git a/dump1090/public_html/coolclock/coolclock.js b/old_hw_build/dump1090/public_html/coolclock/coolclock.js similarity index 100% rename from dump1090/public_html/coolclock/coolclock.js rename to old_hw_build/dump1090/public_html/coolclock/coolclock.js diff --git a/dump1090/public_html/coolclock/excanvas.js b/old_hw_build/dump1090/public_html/coolclock/excanvas.js similarity index 100% rename from dump1090/public_html/coolclock/excanvas.js rename to old_hw_build/dump1090/public_html/coolclock/excanvas.js diff --git a/dump1090/public_html/coolclock/moreskins.js b/old_hw_build/dump1090/public_html/coolclock/moreskins.js similarity index 100% rename from dump1090/public_html/coolclock/moreskins.js rename to old_hw_build/dump1090/public_html/coolclock/moreskins.js diff --git a/dump1090/public_html/extension.js b/old_hw_build/dump1090/public_html/extension.js similarity index 100% rename from dump1090/public_html/extension.js rename to old_hw_build/dump1090/public_html/extension.js diff --git a/dump1090/public_html/gmap.html b/old_hw_build/dump1090/public_html/gmap.html similarity index 100% rename from dump1090/public_html/gmap.html rename to old_hw_build/dump1090/public_html/gmap.html diff --git a/dump1090/public_html/options.js b/old_hw_build/dump1090/public_html/options.js similarity index 100% rename from dump1090/public_html/options.js rename to old_hw_build/dump1090/public_html/options.js diff --git a/dump1090/public_html/planeObject.js b/old_hw_build/dump1090/public_html/planeObject.js similarity index 100% rename from dump1090/public_html/planeObject.js rename to old_hw_build/dump1090/public_html/planeObject.js diff --git a/dump1090/public_html/script.js b/old_hw_build/dump1090/public_html/script.js similarity index 100% rename from dump1090/public_html/script.js rename to old_hw_build/dump1090/public_html/script.js diff --git a/dump1090/public_html/style.css b/old_hw_build/dump1090/public_html/style.css similarity index 100% rename from dump1090/public_html/style.css rename to old_hw_build/dump1090/public_html/style.css diff --git a/dump1090/rtlsdr/rtl-sdr.h b/old_hw_build/dump1090/rtlsdr/rtl-sdr.h similarity index 100% rename from dump1090/rtlsdr/rtl-sdr.h rename to old_hw_build/dump1090/rtlsdr/rtl-sdr.h diff --git a/dump1090/rtlsdr/rtl-sdr_export.h b/old_hw_build/dump1090/rtlsdr/rtl-sdr_export.h similarity index 100% rename from dump1090/rtlsdr/rtl-sdr_export.h rename to old_hw_build/dump1090/rtlsdr/rtl-sdr_export.h diff --git a/dump1090/testfiles/modes1.bin.REMOVED.git-id b/old_hw_build/dump1090/testfiles/modes1.bin.REMOVED.git-id similarity index 100% rename from dump1090/testfiles/modes1.bin.REMOVED.git-id rename to old_hw_build/dump1090/testfiles/modes1.bin.REMOVED.git-id diff --git a/dump1090/tools/debug.html b/old_hw_build/dump1090/tools/debug.html similarity index 100% rename from dump1090/tools/debug.html rename to old_hw_build/dump1090/tools/debug.html diff --git a/old_hw_build/dump1090/view1090.REMOVED.git-id b/old_hw_build/dump1090/view1090.REMOVED.git-id new file mode 100644 index 0000000..fbc093e --- /dev/null +++ b/old_hw_build/dump1090/view1090.REMOVED.git-id @@ -0,0 +1 @@ +3574a87a5df1ebab0124dc0e276a82636506f036 \ No newline at end of file diff --git a/dump1090/view1090.c b/old_hw_build/dump1090/view1090.c similarity index 100% rename from dump1090/view1090.c rename to old_hw_build/dump1090/view1090.c diff --git a/dump1090/view1090.dsp b/old_hw_build/dump1090/view1090.dsp similarity index 100% rename from dump1090/view1090.dsp rename to old_hw_build/dump1090/view1090.dsp diff --git a/dump1090/view1090.h b/old_hw_build/dump1090/view1090.h similarity index 100% rename from dump1090/view1090.h rename to old_hw_build/dump1090/view1090.h diff --git a/dump1090/winstubs.h b/old_hw_build/dump1090/winstubs.h similarity index 100% rename from dump1090/winstubs.h rename to old_hw_build/dump1090/winstubs.h diff --git a/gpio.py b/old_hw_build/gpio.py similarity index 100% rename from gpio.py rename to old_hw_build/gpio.py diff --git a/grid.py b/old_hw_build/grid.py similarity index 100% rename from grid.py rename to old_hw_build/grid.py diff --git a/grid_pc.py b/old_hw_build/grid_pc.py similarity index 100% rename from grid_pc.py rename to old_hw_build/grid_pc.py diff --git a/key.py b/old_hw_build/key.py similarity index 100% rename from key.py rename to old_hw_build/key.py diff --git a/key_001.py b/old_hw_build/key_001.py similarity index 100% rename from key_001.py rename to old_hw_build/key_001.py diff --git a/key_002.py b/old_hw_build/key_002.py similarity index 100% rename from key_002.py rename to old_hw_build/key_002.py diff --git a/key_003.py b/old_hw_build/key_003.py similarity index 100% rename from key_003.py rename to old_hw_build/key_003.py diff --git a/rtl_fm_python.so.REMOVED.git-id b/old_hw_build/rtl_fm_python.so.REMOVED.git-id similarity index 100% rename from rtl_fm_python.so.REMOVED.git-id rename to old_hw_build/rtl_fm_python.so.REMOVED.git-id diff --git a/rtl_fm_python_common.py b/old_hw_build/rtl_fm_python_common.py similarity index 100% rename from rtl_fm_python_common.py rename to old_hw_build/rtl_fm_python_common.py diff --git a/rtl_fm_python_common.pyc b/old_hw_build/rtl_fm_python_common.pyc similarity index 100% rename from rtl_fm_python_common.pyc rename to old_hw_build/rtl_fm_python_common.pyc diff --git a/rtl_fm_python_thread.py b/old_hw_build/rtl_fm_python_thread.py similarity index 100% rename from rtl_fm_python_thread.py rename to old_hw_build/rtl_fm_python_thread.py diff --git a/rtl_fm_python_thread.pyc b/old_hw_build/rtl_fm_python_thread.pyc similarity index 100% rename from rtl_fm_python_thread.pyc rename to old_hw_build/rtl_fm_python_thread.pyc diff --git a/rtl_fm_python_web.py b/old_hw_build/rtl_fm_python_web.py similarity index 100% rename from rtl_fm_python_web.py rename to old_hw_build/rtl_fm_python_web.py diff --git a/splash.sh b/old_hw_build/splash.sh similarity index 100% rename from splash.sh rename to old_hw_build/splash.sh diff --git a/start_key.sh b/old_hw_build/start_key.sh similarity index 100% rename from start_key.sh rename to old_hw_build/start_key.sh diff --git a/test_001.png b/old_hw_build/test_001.png similarity index 100% rename from test_001.png rename to old_hw_build/test_001.png diff --git a/sdl1090/parula.c b/parula.c similarity index 100% rename from sdl1090/parula.c rename to parula.c diff --git a/sdl1090/parula.h b/parula.h similarity index 100% rename from sdl1090/parula.h rename to parula.h diff --git a/parula.o b/parula.o new file mode 100644 index 0000000000000000000000000000000000000000..0218ad0b455f83e75dd346a740e1019611101e10 GIT binary patch literal 3744 zcmbW3X>3$g7>4h3%33JJs)%TqMhRA#X$MNFHHC>)NRd>7A;cx(v>m3!c3NjaAWDr< zaS2EyiWnEv2=1b&xQkIS;4Ur*5kZY1nrPfHxIOR8ciZ81{NqWUdEfKhvwY{=bMKwr zGv~}K^7$OM_?+oZf6a|L&idi~K9aQ&r_34UOvRrJE1(vFu+n@ry2ktzbe(y%TW`J| z-2fV=0Um)Gh`?r;42|#{RKYCR3X@-6&g%3b$yxsf|^bU9*v=4W|d*;`px)+My18);bYHb67lZD-{6(+>v~L%}yXMbF zb#@g$5A-}}pXbAF^V-Y3=FdgH1kF7czA>-8|JHmn`n~x%=uhUG&|g90&xAif^ESet zpgbe+H)!n*@DFG`_2yqkr-9mRgBtVO(aG=^yam;uF}2PR90EOar-0_&36*dVwC0KM zJM4l9@Ehy_onPgw^;ekRkB&G0HF`Y!0tet&Q2X!T81p}%M}x-v8OlNPYCb(%%18N? zg7&uEhDbg-X0l$8Fv%f`7@z5b^FsOJ?M4_#YozYNhw%e@cd4a}oI4~_#6RHjbyV99N ztRWst#F8DYRHMn(_J$>OwZYn&KrkK%o;^7bT$oBnTQ3RrB)ikG)^v9=m`W$R6LF`i zy}K(`mFSA5Q<=7CRlFlzmFnqeOID@YI>XhcR`*ZbN%KG^k?M#iVr>C!S1u>MgN=># zfs^L7WD@C2E~j8PldXl9hwDPsHKA~2E?!{Kc_H1jV&_L4+X2O2@SlLbnYkVHcJODv zrrxO9=T3dn@x3} z-P{y%bJo0r6mUx@wX`c8ZE->z)||GxE*)Evc0z5@bkqs8q*6{O8RPM2i?w9p3px@D zySbM2(Uz8EZ1G{2qseF@9-~XHMQ2AM=6XhVLap6hT``V#D8aK5;#uQa;n{JM`u{qP zu3EdhUU#I3Ydos9`K5x2V*RhC+|@`<1`Hf<;4Vs?@h?sd*=@m_r}yTV*Te^ zKUchMCvibfU&L)-T4#rItJO!MYUiFcy*pL(P4kYa_*$F4NtL|fZL9CBH>T$Mtbah2 zyy9)E=b=#k2Q7a$Pvx(-hByBO#Jpn?$~8tRvz7iIZ(AKf#q@p7FO~L+T9qHfyZv2V zY%y>DE!JQ6C%?G;T+{=vW&QJG^4_+p7kXPCu>N({LEmz{AH4ggZT6mBLQcT; b-+iwsrsADn*9-M8(~F04Q%?GRz5V|MBTr)( literal 0 HcmV?d00001 diff --git a/sdl1090/pthreads/pthread.h b/pthreads/pthread.h similarity index 100% rename from sdl1090/pthreads/pthread.h rename to pthreads/pthread.h diff --git a/sdl1090/pthreads/sched.h b/pthreads/sched.h similarity index 100% rename from sdl1090/pthreads/sched.h rename to pthreads/sched.h diff --git a/sdl1090/pthreads/semaphore.h b/pthreads/semaphore.h similarity index 100% rename from sdl1090/pthreads/semaphore.h rename to pthreads/semaphore.h diff --git a/sdl1090/rtlsdr/rtl-sdr.h b/rtlsdr/rtl-sdr.h similarity index 100% rename from sdl1090/rtlsdr/rtl-sdr.h rename to rtlsdr/rtl-sdr.h diff --git a/sdl1090/rtlsdr/rtl-sdr_export.h b/rtlsdr/rtl-sdr_export.h similarity index 100% rename from sdl1090/rtlsdr/rtl-sdr_export.h rename to rtlsdr/rtl-sdr_export.h diff --git a/sdl1090/.gitignore b/sdl1090/.gitignore deleted file mode 100644 index b04dcba..0000000 --- a/sdl1090/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.o -dump1090 diff --git a/sdl1090/view1090.REMOVED.git-id b/sdl1090/view1090.REMOVED.git-id deleted file mode 100644 index c419972..0000000 --- a/sdl1090/view1090.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -03ce37e44e1175c6d216ace0dc15712026569f3f \ No newline at end of file diff --git a/sdl1090/states.svg.REMOVED.git-id b/states.svg.REMOVED.git-id similarity index 100% rename from sdl1090/states.svg.REMOVED.git-id rename to states.svg.REMOVED.git-id diff --git a/sdl1090/status.c b/status.c similarity index 100% rename from sdl1090/status.c rename to status.c diff --git a/status.o.REMOVED.git-id b/status.o.REMOVED.git-id new file mode 100644 index 0000000..70d2908 --- /dev/null +++ b/status.o.REMOVED.git-id @@ -0,0 +1 @@ +4c882fece9c30acf73d1f87d59f36e90da75ca30 \ No newline at end of file diff --git a/sdl1090/structs.h b/structs.h similarity index 100% rename from sdl1090/structs.h rename to structs.h diff --git a/sdl1090/testfiles/modes1.bin.REMOVED.git-id b/testfiles/modes1.bin.REMOVED.git-id similarity index 100% rename from sdl1090/testfiles/modes1.bin.REMOVED.git-id rename to testfiles/modes1.bin.REMOVED.git-id diff --git a/sdl1090/tools/debug.html b/tools/debug.html similarity index 100% rename from sdl1090/tools/debug.html rename to tools/debug.html diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id new file mode 100644 index 0000000..fc4bddf --- /dev/null +++ b/view1090.REMOVED.git-id @@ -0,0 +1 @@ +53426cac38852a6505d629ec7324b5ec7a2d18da \ No newline at end of file diff --git a/sdl1090/view1090.c b/view1090.c similarity index 100% rename from sdl1090/view1090.c rename to view1090.c diff --git a/sdl1090/view1090.dSYM/Contents/Info.plist b/view1090.dSYM/Contents/Info.plist similarity index 100% rename from sdl1090/view1090.dSYM/Contents/Info.plist rename to view1090.dSYM/Contents/Info.plist diff --git a/sdl1090/view1090.dSYM/Contents/Resources/DWARF/view1090.REMOVED.git-id b/view1090.dSYM/Contents/Resources/DWARF/view1090.REMOVED.git-id similarity index 100% rename from sdl1090/view1090.dSYM/Contents/Resources/DWARF/view1090.REMOVED.git-id rename to view1090.dSYM/Contents/Resources/DWARF/view1090.REMOVED.git-id diff --git a/sdl1090/view1090.dsp b/view1090.dsp similarity index 100% rename from sdl1090/view1090.dsp rename to view1090.dsp diff --git a/sdl1090/view1090.h b/view1090.h similarity index 100% rename from sdl1090/view1090.h rename to view1090.h diff --git a/view1090.o.REMOVED.git-id b/view1090.o.REMOVED.git-id new file mode 100644 index 0000000..983c72a --- /dev/null +++ b/view1090.o.REMOVED.git-id @@ -0,0 +1 @@ +a1f04fa3c4375ebfef8558b27bf27cad234f3a4e \ No newline at end of file diff --git a/sdl1090/winstubs.h b/winstubs.h similarity index 100% rename from sdl1090/winstubs.h rename to winstubs.h From 081ecda40974b45e16112bddb81aa9dca1da0aeb Mon Sep 17 00:00:00 2001 From: nathan Date: Sun, 8 Sep 2019 23:23:38 -0500 Subject: [PATCH 47/65] moving everything out of dump1090.h and interactive.c Former-commit-id: 09fc0bec299442fa1ac44ee6e41f237134ab2b73 Former-commit-id: 0f3edc36d54876849854abd4ef5ab8531f374b38 --- Makefile | 4 +- anet.o | Bin 40720 -> 40712 bytes defs.h | 16 +- draw.c | 446 ++++++++++++++++++++++++++++++- draw.o | Bin 37984 -> 0 bytes draw.o.REMOVED.git-id | 1 + dump1090.h | 42 +-- font.c | 10 +- font.h | 3 - font.o | Bin 33952 -> 36192 bytes init.c | 62 ++--- init.h | 3 - init.o | Bin 45216 -> 45776 bytes input.c | 43 +-- input.h | 1 - input.o.REMOVED.git-id | 2 +- interactive.c | 54 +--- interactive.o | Bin 49000 -> 46136 bytes list.c | 46 ++-- list.o | Bin 48216 -> 47808 bytes mapdata.o.REMOVED.git-id | 2 +- maps.c | 546 -------------------------------------- maps.o.REMOVED.git-id | 1 - mode_ac.o | Bin 37368 -> 36024 bytes mode_s.o.REMOVED.git-id | 2 +- monokai.o | Bin 23936 -> 26192 bytes net_io.o.REMOVED.git-id | 2 +- parula.o | Bin 3744 -> 3736 bytes planeObj.c | 102 +++++++ planeObj.o | Bin 0 -> 41536 bytes status.c | 116 +++++--- status.o.REMOVED.git-id | 2 +- structs.h | 65 ++++- view1090.REMOVED.git-id | 2 +- view1090.c | 69 ++--- view1090.o.REMOVED.git-id | 2 +- 36 files changed, 779 insertions(+), 865 deletions(-) delete mode 100644 draw.o create mode 100644 draw.o.REMOVED.git-id delete mode 100755 font.h delete mode 100644 init.h delete mode 100644 input.h delete mode 100644 maps.c delete mode 100644 maps.o.REMOVED.git-id create mode 100644 planeObj.c create mode 100644 planeObj.o diff --git a/Makefile b/Makefile index ffd50be..996bd4a 100644 --- a/Makefile +++ b/Makefile @@ -25,8 +25,8 @@ all: view1090 %.o: %.c $(CC) $(CFLAGS) $(EXTRACFLAGS) -c $< -view1090: view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o input.o draw.o font.o init.o maps.o mapdata.o status.o list.o parula.o monokai.o - $(CC) -g -o view1090 view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o input.o draw.o font.o init.o maps.o mapdata.o status.o list.o parula.o monokai.o $(LIBS) $(LDFLAGS) +view1090: view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o + $(CC) -g -o view1090 view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o $(LIBS) $(LDFLAGS) clean: rm -f *.o view1090 diff --git a/anet.o b/anet.o index 8863146d292ff5dc22e7049fb4858aee53b509ca..8bad4d6fa87dad97317c16a5a030d336aee2aaaa 100644 GIT binary patch delta 1943 zcmZ9NZ%o@o7{_^j< zbdWHRmBF_V*!UBYnT;0`>reM$F@tKH5{sRmk^|)8M6kISeT`}t zFJ9Y`mHu$rnsFar0meY#$Sy2ujzv4aXNM4gw>S8#gm^fKaJ zPK#I-<6ac_nC_5KM@-wVu@99#MoVb$aqX9E4EU_JR%yMYSX1(@Zz_5-l0G{{Ve>OR zN5-xwo*Fa?dQx6{L!o{Q`#J4FLX0Po5~CHC0H@DT7jRG^;sHjvSQ1J%9tP~Tl#KsP z?v`nfWAd%CNiaOJS~UnDA%V zs%Ne{qXdLd+0OK%a`TTAdIbJKqU#r)s2mY>f;kxW; zXP4DPS3uoE)M*TN=MkMTCL+z7erP>a^a84T&TK9|5Q{mOd((?^y;eG9#CyNc$c;!J z6J?+1vx^_cY9FTqM#1@7($;hEO8=V3T{qyM(})jTrBS2d4Y9*1G!8OaH97~y!h*;J zrq{@_=Ckd+T#mS)LD>Y)DD)6k1^rRB%n615ih?N9^CfLk=r}5)oW6xW%4i(@QLdY1 zHQ!R4dvQDMN&e6CK=CXYwxJ;t8B{dX! z91%h1C4FC^^N534RwVscp&9*iP>hYlN~-^s_54mTX7u}t?v?GERCV}c%<{9OzbiDO z|Aj=1VKG*s&&aoU$TK41}a5ez#DFCs_=>`UsyEO`zjhlV@0i5w5!M}D0?Ww zs(ZHh9_mD_TI2-N)0STx&M3pR>H>ZuGm$AtT+&v{>pJ=Q5vEVjad>?$V_gWz|+Y19_6rBb&+&<4PA{c+KsPeEJAKr z&`vmIJc3Y|aj2>(t!f-GNn?th*XT!>m$X#%aY>_Jftnco0Nx}xR}QPyF-Ue5g;#2> zqfKi3%4eUZabUJd7+W&%caxoLur)J2sz!TSla|BN%;4C_Mk4wBzKYF)m2 zqxCo~W%Jr!F!%?`Vf&iYLoUa(-?d!3-=0oi;P!z58n=2ovx(lehPtYj9PsbKQVPL& zsAcKq^r2F^0P0@8Y45gEr8U((XYjB(i>-O7D{RKlVHYjp;$cDCt(=}RGI$nV>HSNt z=I$#eKc@O7=~K(opG~|{nQXi_)nvg69g+BPHS$cBiv1Wm%J@ra==mD$!0b`xep!wC zF^y&`&!@EfKg#VnEpNgWVKjqX5y5{|ntn|)gRY362XHdN_>)TW`3g;ZS(7`!Xx=Iu z7)a-)YB91Qb$gdFKg`I)!mx|3zy#x0)Ipfml>6Y7G<-lV8wH)_Pj<(HTva> zJbpr{nW=u2E@?QK|4qve!ZX5(2i3W|rqMNOt2b8UF+Nf%|7_wTjGt4Yyp5^zXh-fS z6^J&c%)I}x977-?@IKe}5M Qc%u$FftZY)h)1{m53aCgi~s-t diff --git a/defs.h b/defs.h index 57bca6e..f89b6f1 100644 --- a/defs.h +++ b/defs.h @@ -6,18 +6,18 @@ #include "SDL2/SDL_ttf.h" #include "mapdata.h" -#ifdef RPI - #include -#endif - #define SCREEN_WIDTH 320 #define SCREEN_HEIGHT 480 -#define UPSCALE 1 #define UISCALE 1 -#define AA 0 +#define ROUND_RADIUS 3 //radius of text box corners -#define MAGMA 0 +#define CENTEROFFSET .375 //vertical offset for middle of screen -#define ROUND_RADIUS 3 \ No newline at end of file +#define TRAIL_LENGTH 120 +#define TRAIL_TTL 240.0 +#define DISPLAY_ACTIVE 30 +#define TRAIL_TTL_STEP 2 + +#define FRAMETIME 33 \ No newline at end of file diff --git a/draw.c b/draw.c index 0981d2c..aabdba7 100644 --- a/draw.c +++ b/draw.c @@ -1,6 +1,11 @@ #include "dump1090.h" #include "structs.h" #include "SDL2/SDL2_rotozoom.h" +#include "SDL2/SDL2_gfxPrimitives.h" + +//color schemes +#include "parula.h" +#include "monokai.h" static uint64_t mstime(void) { struct timeval tv; @@ -12,25 +17,450 @@ static uint64_t mstime(void) { return mst; } -void draw() { +void CROSSVP(double *v, double *u, double *w) +{ + v[0] = u[1]*w[2] - u[2]*(w)[1]; + v[1] = u[2]*w[0] - u[0]*(w)[2]; + v[2] = u[0]*w[1] - u[1]*(w)[0]; +} - if ((mstime() - Modes.interactive_last_update) < MODES_INTERACTIVE_REFRESH_TIME) { - return; +SDL_Color setColor(uint8_t r, uint8_t g, uint8_t b) { + SDL_Color out; + out.r = r; + out.g = g; + out.b = b; + return out; +} + +SDL_Color signalToColor(int signal) { + SDL_Color planeColor; + + if(signal > 127) { + signal = 127; } - Modes.interactive_last_update = mstime(); + if(signal < 0) { + planeColor = setColor(96, 96, 96); + } else { + planeColor = setColor(parula[signal][0], parula[signal][1], parula[signal][2]); + } + + return planeColor; +} + +int screenDist(double d) { + + double scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; + + if(appData.mapLogDist) { + return round(0.95 * scale_factor * 0.5 * log(1.0+fabs(d)) / log(1.0+appData.maxDist)); + } else { + return round(0.95 * scale_factor * 0.5 * fabs(d) / appData.maxDist); + } +} + +void pxFromLonLat(double *dx, double *dy, double lon, double lat) { + if(!lon || !lat) { + *dx = 0; + *dy = 0; + return; + } + + *dx = 6371.0 * (lon - appData.centerLon) * M_PI / 180.0f * cos(((lat + appData.centerLat)/2.0f) * M_PI / 180.0f); + *dy = 6371.0 * (lat - appData.centerLat) * M_PI / 180.0f; +} + + +void screenCoords(int *outX, int *outY, double dx, double dy) { + *outX = (appData.screen_width>>1) + ((dx>0) ? 1 : -1) * screenDist(dx); + *outY = (appData.screen_height * CENTEROFFSET) + ((dy>0) ? -1 : 1) * screenDist(dy); +} + +int outOfBounds(int x, int y) { + if(x < 0 || x >= appData.screen_width || y < 0 || y >= appData.screen_height ) { + return 1; + } else { + return 0; + } +} + +void drawPlaneOffMap(int x, int y, int *returnx, int *returny, SDL_Color planeColor) { + + double arrowWidth = 6.0 * appData.screen_uiscale; + + float inx = x - (appData.screen_width>>1); + float iny = y - appData.screen_height * CENTEROFFSET; + + float outx, outy; + outx = inx; + outy = iny; + + if(abs(inx) > abs(y - (appData.screen_height>>1)) * (float)(appData.screen_width>>1) / (float)(appData.screen_height * CENTEROFFSET)) { //left / right quadrants + outx = (appData.screen_width>>1) * ((inx > 0) ? 1.0 : -1.0); + outy = (outx) * iny / (inx); + } else { // up / down quadrants + outy = appData.screen_height * ((iny > 0) ? 1.0-CENTEROFFSET : -CENTEROFFSET ); + outx = (outy) * inx / (iny); + } + + // circleRGBA (appData.renderer,(appData.screen_width>>1) + outx, appData.screen_height * CENTEROFFSET + outy,50,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); + // thickLineRGBA(appData.renderer,appData.screen_width>>1,appData.screen_height * CENTEROFFSET, (appData.screen_width>>1) + outx, appData.screen_height * CENTEROFFSET + outy,arrowWidth,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); + + double inmag = sqrt(inx *inx + iny*iny); + double vec[3]; + vec[0] = inx / inmag; + vec[1] = iny /inmag; + vec[2] = 0; + + double up[] = {0,0,1}; + + double out[3]; + + CROSSVP(out,vec,up); + + int x1, x2, x3, y1, y2, y3; + + // arrow 1 + x1 = (appData.screen_width>>1) + outx - 2.0 * arrowWidth * vec[0] + round(-arrowWidth*out[0]); + y1 = (appData.screen_height * CENTEROFFSET) + outy - 2.0 * arrowWidth * vec[1] + round(-arrowWidth*out[1]); + x2 = (appData.screen_width>>1) + outx - 2.0 * arrowWidth * vec[0] + round(arrowWidth*out[0]); + y2 = (appData.screen_height * CENTEROFFSET) + outy - 2.0 * arrowWidth * vec[1] + round(arrowWidth*out[1]); + x3 = (appData.screen_width>>1) + outx - arrowWidth * vec[0]; + y3 = (appData.screen_height * CENTEROFFSET) + outy - arrowWidth * vec[1]; + filledTrigonRGBA(appData.renderer, x1, y1, x2, y2, x3, y3, planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); + + // arrow 2 + x1 = (appData.screen_width>>1) + outx - 3.0 * arrowWidth * vec[0] + round(-arrowWidth*out[0]); + y1 = (appData.screen_height * CENTEROFFSET) + outy - 3.0 * arrowWidth * vec[1] + round(-arrowWidth*out[1]); + x2 = (appData.screen_width>>1) + outx - 3.0 * arrowWidth * vec[0] + round(arrowWidth*out[0]); + y2 = (appData.screen_height * CENTEROFFSET) + outy - 3.0 * arrowWidth * vec[1] + round(arrowWidth*out[1]); + x3 = (appData.screen_width>>1) + outx - 2.0 * arrowWidth * vec[0]; + y3 = (appData.screen_height * CENTEROFFSET) + outy - 2.0 * arrowWidth * vec[1]; + filledTrigonRGBA(appData.renderer, x1, y1, x2, y2, x3, y3, planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); + + *returnx = x3; + *returny = y3; +} + +void drawPlaneHeading(int x, int y, double heading, SDL_Color planeColor) +{ + double body = 8.0 * appData.screen_uiscale; + double wing = 6.0 * appData.screen_uiscale; + double tail = 3.0 * appData.screen_uiscale; + double bodyWidth = 2.0 * appData.screen_uiscale; + + double vec[3]; + vec[0] = sin(heading * M_PI / 180); + vec[1] = -cos(heading * M_PI / 180); + vec[2] = 0; + + double up[] = {0,0,1}; + + double out[3]; + + CROSSVP(out,vec,up); + + int x1, x2, y1, y2; + + + // tempCenter + + // circleRGBA(appData.renderer, x, y, 10, 255, 0, 0, 255); + + //body + x1 = x + round(-body*vec[0]); + y1 = y + round(-body*vec[1]); + x2 = x + round(body*vec[0]); + y2 = y + round(body*vec[1]); + + thickLineRGBA(appData.renderer,x,y,x2,y2,bodyWidth,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); + filledTrigonRGBA(appData.renderer, x + round(-wing*.35*out[0]), y + round(-wing*.35*out[1]), x + round(wing*.35*out[0]), y + round(wing*.35*out[1]), x1, y1,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); + filledCircleRGBA(appData.renderer, x2,y2,appData.screen_uiscale,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); + + //wing + x1 = x + round(-wing*out[0]); + y1 = y + round(-wing*out[1]); + x2 = x + round(wing*out[0]); + y2 = y + round(wing*out[1]); + + filledTrigonRGBA(appData.renderer, x1, y1, x2, y2, x+round(body*.35*vec[0]), y+round(body*.35*vec[1]),planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); + + //tail + x1 = x + round(-body*.75*vec[0]) + round(-tail*out[0]); + y1 = y + round(-body*.75*vec[1]) + round(-tail*out[1]); + x2 = x + round(-body*.75*vec[0]) + round(tail*out[0]); + y2 = y + round(-body*.75*vec[1]) + round(tail*out[1]); + + filledTrigonRGBA (appData.renderer, x1, y1, x2, y2, x+round(-body*.5*vec[0]), y+round(-body*.5*vec[1]),planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); +} + +void drawPlane(int x, int y, SDL_Color planeColor) +{ + int length = 3.0; + + rectangleRGBA (appData.renderer, x - length, y - length, x+length, y + length, planeColor.r, planeColor.g, planeColor.b, SDL_ALPHA_OPAQUE); +} + + +void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSeen, int idx) { + + int currentIdx, prevIdx; + + int currentX, currentY, prevX, prevY; + + time_t now = time(NULL); + + for(int i=0; i < (TRAIL_LENGTH - 1); i++) { + currentIdx = (idx - i) % TRAIL_LENGTH; + currentIdx = currentIdx < 0 ? currentIdx + TRAIL_LENGTH : currentIdx; + prevIdx = (idx - (i + 1)) % TRAIL_LENGTH; + prevIdx = prevIdx < 0 ? prevIdx + TRAIL_LENGTH : prevIdx; + + if(oldDx[currentIdx] == 0 || oldDy[currentIdx] == 0) { + continue; + } + + if(oldDx[prevIdx] == 0 || oldDy[prevIdx] == 0) { + continue; + } + + double dx, dy; + + pxFromLonLat(&dx, &dy, oldDx[currentIdx], oldDy[currentIdx]); + + screenCoords(¤tX, ¤tY, dx, dy); + + pxFromLonLat(&dx, &dy, oldDx[prevIdx], oldDy[prevIdx]); + + screenCoords(&prevX, &prevY, dx, dy); + + if(outOfBounds(currentX,currentY)) { + return; + } + + if(outOfBounds(prevX,prevY)) { + return; + } + + double age = pow(1.0 - (double)(now - oldSeen[currentIdx]) / TRAIL_TTL, 2.2); + + if(age < 0) { + age = 0; + } + + uint8_t colorVal = (uint8_t)floor(255.0 * age); + + thickLineRGBA(appData.renderer, prevX, prevY, currentX, currentY, 4 * appData.screen_uiscale, colorVal, colorVal, colorVal, 127); + + //tick marks + + double vec[3]; + vec[0] = sin(oldHeading[currentIdx] * M_PI / 180); + vec[1] = -cos(oldHeading[currentIdx] * M_PI / 180); + vec[2] = 0; + + double up[] = {0,0,1}; + + double out[3]; + + CROSSVP(out,vec,up); + + + int x1, y1, x2, y2; + + int cross_size = 8 * appData.screen_uiscale; + + //forward cross + x1 = currentX + round(-cross_size*vec[0]); + y1 = currentY + round(-cross_size*vec[1]); + x2 = currentX + round(cross_size*vec[0]); + y2 = currentY + round(cross_size*vec[1]); + + lineRGBA(appData.renderer,x1,y1,x2,y2,colorVal,colorVal,colorVal,127); + + //side cross + x1 = currentX + round(-cross_size*out[0]); + y1 = currentY + round(-cross_size*out[1]); + x2 = currentX + round(cross_size*out[0]); + y2 = currentY + round(cross_size*out[1]); + + lineRGBA(appData.renderer,x1,y1,x2,y2,colorVal,colorVal,colorVal,127); + } +} + +void drawGrid() +{ + int p1km = screenDist(1.0); + int p10km = screenDist(10.0); + int p100km = screenDist(100.0); + + circleRGBA (appData.renderer, appData.screen_width>>1, appData.screen_height * CENTEROFFSET, p1km, pink.r, pink.g, pink.b, 255); + circleRGBA (appData.renderer, appData.screen_width>>1, appData.screen_height * CENTEROFFSET, p10km, pink.r, pink.g, pink.b, 195); + circleRGBA (appData.renderer, appData.screen_width>>1, appData.screen_height * CENTEROFFSET, p100km, pink.r, pink.g, pink.b, 127); + + drawString("1km", (appData.screen_width>>1) + (0.707 * p1km) + 5, (appData.screen_height * CENTEROFFSET) + (0.707 * p1km) + 5, appData.mapFont, pink); + drawString("10km", (appData.screen_width>>1) + (0.707 * p10km) + 5, (appData.screen_height * CENTEROFFSET) + (0.707 * p10km) + 5, appData.mapFont, pink); + drawString("100km", (appData.screen_width>>1) + (0.707 * p100km) + 5, (appData.screen_height * CENTEROFFSET) + (0.707 * p100km) + 5, appData.mapFont, pink); +} + +void drawGeography() { + int x1, y1, x2, y2; + + for(int i=1; iseen) < Modes.interactive_display_ttl) { + if (p->lon && p->lat) { + + unsigned char * pSig = p->signalLevel; + unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] + + pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 3; + + drawTrail(p->oldLon, p->oldLat, p->oldHeading, p->oldSeen, p->oldIdx); + + int colorIdx; + if((int)(now - p->seen) > DISPLAY_ACTIVE) { + colorIdx = -1; + } else { + colorIdx = signalAverage; + } + + SDL_Color planeColor = signalToColor(colorIdx); + int x, y; + //screenCoords(&x, &y, p->dx, p->dy); + + double dx, dy; + pxFromLonLat(&dx, &dy, p->lon, p->lat); + screenCoords(&x, &y, dx, dy); + + if(outOfBounds(x,y)) { + int outx, outy; + drawPlaneOffMap(x, y, &outx, &outy, planeColor); + + drawStringBG(p->flight, outx + 5, outy + appData.mapFontHeight, appData.mapBoldFont, white, black); + + char alt[10] = " "; + snprintf(alt,10,"%dm", p->altitude); + drawStringBG(alt, outx + 5, outy + 2*appData.mapFontHeight, appData.mapFont, grey, black); + + char speed[10] = " "; + snprintf(speed,10,"%dkm/h", p->speed); + drawStringBG(speed, outx + 5, outy + 3*appData.mapFontHeight, appData.mapFont, grey, black); + + // continue; + } + + + if(p->created == 0) { + p->created = mstime(); + } + + double age_ms = (double)(mstime() - p->created); + if(age_ms < 500) { + circleRGBA(appData.renderer, x, y, 500 - age_ms, 255,255, 255, (uint8_t)(255.0 * age_ms / 500.0)); + } else { + if(MODES_ACFLAGS_HEADING_VALID) { + drawPlaneHeading(x, y,p->track, planeColor); + + //char flight[11] = " "; + //snprintf(flight,11," %s ", p->flight); + //drawStringBG(flight, x, y + appData.mapFontHeight, appData.mapBoldFont, black, planeColor); + drawStringBG(p->flight, x + 5, y + appData.mapFontHeight, appData.mapBoldFont, white, black); + + char alt[10] = " "; + snprintf(alt,10,"%dm", p->altitude); + drawStringBG(alt, x + 5, y + 2*appData.mapFontHeight, appData.mapFont, grey, black); + + char speed[10] = " "; + snprintf(speed,10,"%dkm/h", p->speed); + drawStringBG(speed, x + 5, y + 3*appData.mapFontHeight, appData.mapFont, grey, black); + + lineRGBA(appData.renderer, x, y, x, y + 4*appData.mapFontHeight, grey.r, grey.g, grey.b, SDL_ALPHA_OPAQUE); + } else { + drawPlane(x, y, planeColor); + } + } + } + } + p = p->next; + } +} + +// +// +// + +void draw() { + + if ((mstime() - appData.lastFrameTime) < FRAMETIME) { + return; + } + + appData.lastFrameTime = mstime(); + + updatePlanes(); updateStatus(); - SDL_SetRenderDrawColor( game.renderer, 0, 0, 0, 0); + SDL_SetRenderDrawColor( appData.renderer, 0, 0, 0, 0); - SDL_RenderClear(game.renderer); + SDL_RenderClear(appData.renderer); drawMap(); drawStatus(); - if(!Modes.map) { + if(appData.showList) { drawList(0); } - SDL_RenderPresent(game.renderer); + SDL_RenderPresent(appData.renderer); } \ No newline at end of file diff --git a/draw.o b/draw.o deleted file mode 100644 index 55e01e5b65cfa0b0d114c7cc44c251f7f66a83f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37984 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 IL4E&!1Dv{QFaQ7m diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id new file mode 100644 index 0000000..901f5ae --- /dev/null +++ b/draw.o.REMOVED.git-id @@ -0,0 +1 @@ +935a39fc34ea31bd03a177786917177c0d74191a \ No newline at end of file diff --git a/dump1090.h b/dump1090.h index 5fd9380..9ad4de0 100644 --- a/dump1090.h +++ b/dump1090.h @@ -160,14 +160,10 @@ // at least greater than a given level for us to dump the signal. #define MODES_DEBUG_NOPREAMBLE_LEVEL 25 -#define MODES_INTERACTIVE_REFRESH_TIME 33 // Milliseconds +#define MODES_INTERACTIVE_REFRESH_TIME 250 // Milliseconds #define MODES_INTERACTIVE_ROWS 22 // Rows on screen #define MODES_INTERACTIVE_DELETE_TTL 300 // Delete from the list after 300 seconds #define MODES_INTERACTIVE_DISPLAY_TTL 60 // Delete from display after 60 seconds -#define MODES_INTERACTIVE_DISPLAY_ACTIVE 30 // Gray out after 30 seconds -#define MODES_INTERACTIVE_TRAIL_LENGTH 120 // entries to keep in trail -#define MODES_INTERACTIVE_TRAIL_TTL_STEP 2 // minimum time between entries -#define MODES_INTERACTIVE_TRAIL_TTL 240.0 // # seconds to fade out #define MODES_NET_HEARTBEAT_RATE 900 // Each block is approx 65mS - default is > 1 min @@ -209,12 +205,10 @@ struct aircraft { int track; // Angle of flight int vert_rate; // Vertical rate. time_t seen; // Time at which the last packet was received - time_t prev_seen; time_t seenLatLon; // Time at which the last lat long was calculated uint64_t timestamp; // Timestamp at which the last packet was received uint64_t timestampLatLon;// Timestamp at which the last lat long was calculated long messages; // Number of Mode S messages received - double messageRate[8]; // Number of Mode S messages received int modeA; // Squawk int modeC; // Altitude long modeAcount; // Mode A Squawk hit Count @@ -229,24 +223,10 @@ struct aircraft { uint64_t odd_cprtime; uint64_t even_cprtime; double lat, lon; // Coordinated obtained from CPR encoded data - double dx, dy; // distance in km - double oldDx[MODES_INTERACTIVE_TRAIL_LENGTH], oldDy[MODES_INTERACTIVE_TRAIL_LENGTH], oldHeading[MODES_INTERACTIVE_TRAIL_LENGTH]; // position history - time_t oldSeen[MODES_INTERACTIVE_TRAIL_LENGTH];// position time - uint8_t oldIdx; // index for ring buffer - uint64_t created; int bFlags; // Flags related to valid fields in this structure struct aircraft *next; // Next aircraft in our linked list }; -struct { - double msgRate; - double avgSig; - int numPlanes; - int numVisiblePlanes; - double maxDist; - struct aircraft *closeCall; -} Status; - struct stDF { struct stDF *pNext; // Pointer to next item in the linked list struct stDF *pPrev; // Pointer to previous item in the linked list @@ -339,19 +319,6 @@ struct { // Internal state int mlat; // Use Beast ascii format for raw data output, i.e. @...; iso *...; int interactive_rtl1090; // flight table in interactive mode is formatted like RTL1090 - // map options - int map; - int mapLogDist; - float maxDist; - - //display options - int screen_upscale; - int screen_uiscale; - int screen_width; - int screen_height; - int screen_depth; - int fullscreen; - // User details double fUserLat; // Users receiver/antenna lat/lon needed for initial surface location double fUserLon; // Users receiver/antenna lat/lon needed for initial surface location @@ -492,13 +459,6 @@ void modesSendAllClients (int service, void *msg, int len); void modesQueueOutput (struct modesMessage *mm); void modesReadFromClient(struct client *c, char *sep, int(*handler)(struct client *, char *)); -// -// Functions exported from maps.c -// - -void drawMap (void); - - #ifdef __cplusplus } #endif diff --git a/font.c b/font.c index f2bbe02..a196cd9 100755 --- a/font.c +++ b/font.c @@ -1,4 +1,4 @@ -#include "font.h" +#include "structs.h" #include "SDL2/SDL2_rotozoom.h" TTF_Font *loadFont(char *name, int size) @@ -51,8 +51,8 @@ void drawString(char * text, int x, int y, TTF_Font *font, SDL_Color color) dest.w = surface->w; dest.h = surface->h; - SDL_Texture *texture = SDL_CreateTextureFromSurface(game.renderer, surface); - SDL_RenderCopy(game.renderer, texture, NULL, &dest); + SDL_Texture *texture = SDL_CreateTextureFromSurface(appData.renderer, surface); + SDL_RenderCopy(appData.renderer, texture, NULL, &dest); SDL_DestroyTexture(texture); SDL_FreeSurface(surface); } @@ -81,8 +81,8 @@ void drawStringBG(char * text, int x, int y, TTF_Font *font, SDL_Color color, SD dest.w = surface->w; dest.h = surface->h; - SDL_Texture *texture = SDL_CreateTextureFromSurface(game.renderer, surface); - SDL_RenderCopy(game.renderer, texture, NULL, &dest); + SDL_Texture *texture = SDL_CreateTextureFromSurface(appData.renderer, surface); + SDL_RenderCopy(appData.renderer, texture, NULL, &dest); SDL_DestroyTexture(texture); SDL_FreeSurface(surface); } diff --git a/font.h b/font.h deleted file mode 100755 index 4447612..0000000 --- a/font.h +++ /dev/null @@ -1,3 +0,0 @@ -#include "structs.h" - -extern Game game; diff --git a/font.o b/font.o index 2f5a7e047d9a29cddc5328e7f25f41da180e50d4..3132bb43fa22186585f718299e08fc7c3a29ce08 100644 GIT binary patch literal 36192 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 F{|_PyD)s;X literal 33952 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 DE&mh> diff --git a/init.c b/init.c index 010fc3f..0ad39f3 100644 --- a/init.c +++ b/init.c @@ -1,5 +1,5 @@ #include "dump1090.h" -#include "init.h" +#include "structs.h" void init(char *title) { // raspberry pi compiler flag enables these options @@ -19,67 +19,53 @@ void init(char *title) { exit(1); } - // #ifdef RPI - // const SDL_VideoInfo* vInfo = SDL_GetVideoInfo(); - - // if (!vInfo) { - // fprintf(stderr,"ERROR in SDL_GetVideoInfo(): %s\n",SDL_GetError()); - // exit(1); - // } - - // Modes.screen_width = vInfo->current_w; - // Modes.screen_height = vInfo->current_h; - // Modes.screen_depth = vInfo->vfmt->BitsPerPixel; - - // Modes.screen_upscale = 1; - // #endifX SDL_ShowCursor(SDL_DISABLE); Uint32 flags = 0; - if(Modes.fullscreen) { + if(appData.fullscreen) { flags = flags | SDL_WINDOW_FULLSCREEN_DESKTOP; } - game.window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, Modes.screen_width, Modes.screen_height, flags); - game.renderer = SDL_CreateRenderer(game.window, -1, 0); - game.texture = SDL_CreateTexture(game.renderer, + appData.window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, appData.screen_width, appData.screen_height, flags); + appData.renderer = SDL_CreateRenderer(appData.window, -1, 0); + appData.texture = SDL_CreateTexture(appData.renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, - Modes.screen_width, Modes.screen_height); + appData.screen_width, appData.screen_height); - if(Modes.fullscreen) { + if(appData.fullscreen) { //SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); // make the scaled rendering look smoother. - SDL_RenderSetLogicalSize(game.renderer, Modes.screen_width, Modes.screen_height); + SDL_RenderSetLogicalSize(appData.renderer, appData.screen_width, appData.screen_height); } - game.mapFont = loadFont("font/TerminusTTF-4.46.0.ttf", 12 * Modes.screen_uiscale); - game.mapBoldFont = loadFont("font/TerminusTTF-Bold-4.46.0.ttf", 12 * Modes.screen_uiscale); + appData.mapFont = loadFont("font/TerminusTTF-4.46.0.ttf", 12 * appData.screen_uiscale); + appData.mapBoldFont = loadFont("font/TerminusTTF-Bold-4.46.0.ttf", 12 * appData.screen_uiscale); - game.listFont = loadFont("font/TerminusTTF-4.46.0.ttf", 12 * Modes.screen_uiscale); + appData.listFont = loadFont("font/TerminusTTF-4.46.0.ttf", 12 * appData.screen_uiscale); - game.messageFont = loadFont("font/TerminusTTF-Bold-4.46.0.ttf", 12 * Modes.screen_uiscale); - game.labelFont = loadFont("font/TerminusTTF-Bold-4.46.0.ttf", 12 * Modes.screen_uiscale); + appData.messageFont = loadFont("font/TerminusTTF-Bold-4.46.0.ttf", 12 * appData.screen_uiscale); + appData.labelFont = loadFont("font/TerminusTTF-Bold-4.46.0.ttf", 12 * appData.screen_uiscale); - game.mapFontWidth = 5 * Modes.screen_uiscale; - game.mapFontHeight = 12 * Modes.screen_uiscale; + appData.mapFontWidth = 5 * appData.screen_uiscale; + appData.mapFontHeight = 12 * appData.screen_uiscale; - game.messageFontWidth = 6 * Modes.screen_uiscale; - game.messageFontHeight = 12 * Modes.screen_uiscale; + appData.messageFontWidth = 6 * appData.screen_uiscale; + appData.messageFontHeight = 12 * appData.screen_uiscale; - game.labelFontWidth = 6 * Modes.screen_uiscale; - game.labelFontHeight = 12 * Modes.screen_uiscale; + appData.labelFontWidth = 6 * appData.screen_uiscale; + appData.labelFontHeight = 12 * appData.screen_uiscale; initMaps(); } void cleanup() { - closeFont(game.mapFont); - closeFont(game.mapBoldFont); - closeFont(game.messageFont); - closeFont(game.labelFont); - closeFont(game.listFont); + closeFont(appData.mapFont); + closeFont(appData.mapBoldFont); + closeFont(appData.messageFont); + closeFont(appData.labelFont); + closeFont(appData.listFont); TTF_Quit(); diff --git a/init.h b/init.h deleted file mode 100644 index 4447612..0000000 --- a/init.h +++ /dev/null @@ -1,3 +0,0 @@ -#include "structs.h" - -extern Game game; diff --git a/init.o b/init.o index be8eca9864c0b36699443f2b381c91a7c8412741..fe767d7c0c1fc09f9a507b3f8f8a9333e3efcddd 100644 GIT binary patch literal 45776 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 literal 45216 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 Modes.screen_height) ? Modes.screen_width : Modes.screen_height; + double scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; - double dx = -1.0 * (0.75*(double)Modes.screen_width / (double)Modes.screen_height) * Modes.screen_width * event.tfinger.dx * Modes.maxDist / (0.95 * scale_factor * 0.5); - double dy = 1.0 * Modes.screen_height * event.tfinger.dy * Modes.maxDist / (0.95 * scale_factor * 0.5); + double dx = -1.0 * (0.75*(double)appData.screen_width / (double)appData.screen_height) * appData.screen_width * event.tfinger.dx * appData.maxDist / (0.95 * scale_factor * 0.5); + double dy = 1.0 * appData.screen_height * event.tfinger.dy * appData.maxDist / (0.95 * scale_factor * 0.5); double outLat = dy * (1.0/6371.0) * (180.0f / M_PI); - double outLon = dx * (1.0/6371.0) * (180.0f / M_PI) / cos(((Modes.fUserLat)/2.0f) * M_PI / 180.0f); + double outLon = dx * (1.0/6371.0) * (180.0f / M_PI) / cos(((appData.centerLat)/2.0f) * M_PI / 180.0f); - Modes.fUserLon += outLon; - Modes.fUserLat += outLat; + appData.centerLon += outLon; + appData.centerLat += outLat; break; } } diff --git a/input.h b/input.h deleted file mode 100644 index 31c69c6..0000000 --- a/input.h +++ /dev/null @@ -1 +0,0 @@ -#include "defs.h" diff --git a/input.o.REMOVED.git-id b/input.o.REMOVED.git-id index 11b1bac..c590db3 100644 --- a/input.o.REMOVED.git-id +++ b/input.o.REMOVED.git-id @@ -1 +1 @@ -9b48800a24ee4c8a8e0c2a773765026724773f6f \ No newline at end of file +a9f8d1424252b1371bb410c58e63a5ec55a7fcb3 \ No newline at end of file diff --git a/interactive.c b/interactive.c index 45b1861..4f7e029 100644 --- a/interactive.c +++ b/interactive.c @@ -29,7 +29,6 @@ // #include "dump1090.h" - // // ============================= Utility functions ========================== // @@ -138,19 +137,9 @@ struct aircraft *interactiveCreateAircraft(struct modesMessage *mm) { // Now initialise things that should not be 0/NULL to their defaults a->addr = mm->addr; a->lat = a->lon = 0.0; - - a->created = 0; - - a->oldIdx = 0; - memset(a->oldDx, 0, sizeof(a->oldDx)); - memset(a->oldDy, 0, sizeof(a->oldDy)); - memset(a->oldHeading, 0, sizeof(a->oldHeading)); - memset(a->signalLevel, mm->signalLevel, 8); // First time, initialise everything // to the first signal strength - memset(a->messageRate, 0, sizeof(a->messageRate)); - // mm->msgtype 32 is used to represent Mode A/C. These values can never change, so // set them once here during initialisation, and don't bother to set them every // time this ModeA/C is received again in the future @@ -278,8 +267,7 @@ struct aircraft *interactiveReceiveData(struct modesMessage *mm) { a = interactiveFindAircraft(mm->addr); if (!a) { // If it's a currently unknown aircraft.... a = interactiveCreateAircraft(mm); // ., create a new record for it, - a->prev_seen = time(NULL); - a->next = Modes.aircrafts; // .. and put it at the head of the list + a->next = Modes.aircrafts; // .. and put it at the head of the list Modes.aircrafts = a; } else { /* If it is an already known aircraft, move it on head @@ -298,23 +286,11 @@ struct aircraft *interactiveReceiveData(struct modesMessage *mm) { a->next = Modes.aircrafts; Modes.aircrafts = a; } - - a->prev_seen = a->seen; - } - - //strip trailing spaces - for(int i = 0; i<8; i++) { - a->flight[i] = (a->flight[i] == 32) ? 0 : a->flight[i]; } a->signalLevel[a->messages & 7] = mm->signalLevel;// replace the 8th oldest signal strength a->seen = time(NULL); a->timestamp = mm->timestampMsg; - - if((a->seen - a->prev_seen) > 0) { - a->messageRate[a->messages & 7] = 1.0 / (double)(a->seen - a->prev_seen); - } - a->messages++; // If a (new) CALLSIGN has been received, copy it to the aircraft structure @@ -396,26 +372,6 @@ struct aircraft *interactiveReceiveData(struct modesMessage *mm) { mm->bFlags |= MODES_ACFLAGS_LATLON_VALID; mm->fLat = a->lat; mm->fLon = a->lon; - - // double dLon = a->lon;// - Modes.fUserLon; - // double dLat = a->lat;// - Modes.fUserLat; - - // a->dx = 6371.0 * dLon * M_PI / 180.0f * cos(((a->lat + Modes.fUserLat)/2.0f) * M_PI / 180.0f); - // a->dy = 6371.0 * dLat * M_PI / 180.0f; - - a->dx = a->lon; - a->dy = a->lat; - - if(time(NULL) - a->oldSeen[a->oldIdx] > MODES_INTERACTIVE_TRAIL_TTL_STEP) { - a->oldIdx = (a->oldIdx+1) % 32; - - a->oldDx[a->oldIdx] = a->dx; - a->oldDy[a->oldIdx] = a->dy; - - a->oldHeading[a->oldIdx] = a->track; - - a->oldSeen[a->oldIdx] = a->seen; - } } } @@ -480,7 +436,7 @@ void interactiveShowData(void) { if (Modes.interactive_rtl1090 == 0) { printf ( -"Hex Mode Sqwk Flight Alt Spd Hdg dx(km) dy(km) Sig Msgs Ti%c\n", progress); +"Hex Mode Sqwk Flight Alt Spd Hdg Lat Long Sig Msgs Ti%c\n", progress); } else { printf ( "Hex Flight Alt V/S GS TT SSR G*456^ Msgs Seen %c\n", progress); @@ -548,10 +504,8 @@ void interactiveShowData(void) { if (flags & MODEAC_MSG_MODEC_HIT) {strMode[3] = 'c';} if (a->bFlags & MODES_ACFLAGS_LATLON_VALID) { - - snprintf(strLat, 8,"%7.03f", a->dx); - snprintf(strLon, 9,"%8.03f", a->dy); - + snprintf(strLat, 8,"%7.03f", a->lat); + snprintf(strLon, 9,"%8.03f", a->lon); } if (a->bFlags & MODES_ACFLAGS_AOG) { diff --git a/interactive.o b/interactive.o index e44c297cd3c7605c3d8f2504cf3a83df3c3794d8..77997b23096b9626b7aaba8b7657aa551c5de545 100644 GIT binary patch literal 46136 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 literal 49000 zcmb__34ByV@_)a10R|G22p9sW44P;V5)#fJAPEUDfdG*J20@3AOhP1=nVA5J91c;& z5e3iP6$M=n_V0zdDyyh~sE8Ndth&3bCy47JxQHkJs_v>colfF!{e6D#1MgLRySl2n zy83u;W?oiID4yuDEWw8*&J!_?Q6Ua&jnR3M%oBY?Z;?N9R#D`qQg7rx&msIQ);)mb z-j?mbCU10>@J605iWa72d)JOdyf{*k?2VKTiq3L-BL%76=!EP@>9C|HXC(mZiB8C< zij?L?3NoaUmhGVt-e@P%=Z)CGIB%p3DxM}GrE%^>`ST7UpVTi;AoF}uKd|}_2d`RJ zm6gEit4le6ZYtq9z!&mh5K+^OKcJn$-jXrY|l*T`UGSa>9@o!%W zWAb9hEb}bdUKw7y2}oC@<#%w2)vS{7RI(?xF46KQmW{zvN9RH}oUZDP$_*xXqbpOP z#gH7K!$+T2_)!Rcp3w7wvpKjBOQLJgw_`i3(A4Oy$x!>ub$C9u(-Z6--LeVFMm>q= zq}4aTIsCCJm>#|LZXly;@H}cyFmvst)~F-Fv%)*AQEvwOCG}egIOM70%Leep$$xKj zdRbW7bVqMR)85FMEpUmv7k=IC4R76yl_O7L$?~VY;qR^GkCUqKo^v9qM$7i3mckP! zP8_# z!ohUF$?s!3l9N`Sg39;H{wR)~1kz$^%gdqULnEu!O^rq{#=r*$Jc)(A*(Z@W09@&M&r^mfbd2N(^7M`x10#ZM?FZT2peuJL<*IArLG}dScd?oD<>wUDnLBdrFU?YPNSERFBTeh8%)P z((8?umM!m(W5yeK^GH&%j79jLU5>Ehi-l1?suWqx$+CTs#^08}bFwj(d8 zWf%B#Y=+BwG};q7qsM!ryiix#K3y-&UIUFj$H+_uZ(tr?bf06QiYao+E~^zQhfi+8{t@7lN_-bi>aRE@T5f^%eNF?h4=h}xSe|nNI%&du zI89v$r|4l>c5?VQTxI>FC!#n}dIzq4B@c{xBYV8zT!(s9l0+x;>>9ADl3${SslmRji@I);YDzND7^*x2x{3|L9lc_aUpPUoC}6+u!m<7thibvY8o zv2pO*pH7^JPW80BoYe9dkg(L;wJs{>;>gbM#~I-tJfZdB{r~X3R8R&MAbl_?4_*#~ zKQ><-O=_3`Q-496a{pk)&p1`&K_=`1Va$Zx==A?C6R>X&eghg~_Pmj=xnB={^9xK@ zu})sy7x?Joo1jwUh)NZeHV2P@3K@&4b@>SwH6(#J4E&;!A~TMau?f&Xb@Q(mU5%6HLq2vbyNIuQ;o%Bi?~(w*nDe zoaKeh))MGIHLoSLOoIi-yJ{EO#~o4rMfn%!`(RaC4FE>&-#N#A)lAOzqR2Z%JAUd? zG~m@D>)YZ;I@VL}s#be{?_E0_!RN3Wy*s`<&ui@s@3*}J_9i`18&^b)D^%H*m-Otr z6I$L%TKyMHE3G1l>AN$Sb(2;PgoG$m%fJN4rR(|v?_FD%Hgy6fVId5CU@kx^`Ow(H z$bsE-ySFD&K*Aso-ehd1uaFkpJlCFCJnBvG0Z-rW) z2g0}+weyO-h0*&lE4|T0Wm2^jiAxLpp-|;}4)|4ZYGJh0106Qi19C4GrkyW^(5kQ}l3N$2c>*<4yaQkXPoKchR3B+YTqz0n(KYmn5^ z38(j+?xdDiA&AFz#ucxfnKmP-WjSzaBfIM7jaOM>E1r_3AAntL73>{~A@RzST8=~I z!pPx)u-vSj0xOm5yQz@_vinMA|c^ z3*B}!A#KNTyX9qEqLW%CLmNTsyi(}exL_wBFD}myf995?uj1HFE2-r=nOb19cb%oI>X~k=0pFIWE;CAQzzaaN4o^rMqM`os_$||Zei=)6FERsQ8 z2@-PpP1Y4mh`gyQ(CQwHgKCA*=q9S>)~o4t3Js%$(&#fd@2!I%!iMV+(1bC~KX{*X zB@cI+DqB{63`6j)@6BG;zjqABHyq8lUw(_b*%8~IY7 zl%i3&?;N#r#jc{rN8ZRQxHJ8bZhP}^Q{s)tZKATMR-8kR_nqtQJ9o%rk)AzliAWz> z2?U%b%5(b2tn8sxB0X1KhT{nF`j_DF^-OK3^m{y|mo8r9@l33(sa_ZaFuxYhp3=rj zkH=eCjdbObj74<=kXWjS(i*_02C4&q&8$hU=mtt-dQDXx&+Ngao=K%3I};R_&hU69 zoil9sh>KZ;r_}GS_c&@q=Kt*h;TW;Rlb)FyfYUJaSsm$_LlMDK3{B4*0S!;j98%d0 z>y;smrF=#u!;yz-bQ%c|z`#{P8PxWqV{JYTkE>mB**${_y5%)=4{zUd=g;F_JyVD{ zS?tE~fVGC37;_C!G9 z;yTsT2T5kYRFrXRGK0{D62JBuhg=&YZ;Fw(Alb>?c{g0TxIch%=QrSFTha>&;LsKO zI{&8%RCYtU^RXp(QS^@}?pE|qNGB`$XQWdV{R`3_MV~-ABOXqov#^lKR*WT?T*bH~ zlc$(C$#@mhNirph=`5Kt#kj49z{B~9>1O>In1zZ-u+ZT~#Ux86sF?271}Isgm=p_x zyHYW|teL=EshCvjDbN;H%&FEMVAd!m-MSCN)+r{_!Z7|$FDzY247c`zon0aUd!-r3lVt9QL|{edKge!L?Ys#atwMVzl0@Hy&8Kd; z7h9hU-FpRKUEH4oCv{>oq)tT9fJFB*+CwCPq{=^7AJskn%hoJ~r+Ie_%cPMEUEQ8LwOUc$5(I(aTE77f6Tqfa#1#uLPWxzTh%TrSM4`-v>ly^GTbqqZN54daKBLV*(Gw1Rh2K znP!Qpa~-mGokR9n;gEgT11ZN?(iyIDn1Q>v(G{saIW0yGanvV|jFF>}wBxWBAwT3r z>N@$LoK<9BySop23-rqV>OKN15H0n@fx!o%xHHPAq1NNHKCmoF`5yhMF{q06OaxNp zNsssgLJN<-$go4(eF(LyIw`Vk93Km_gw>e$`t+A2f?5Div9rgZ&LJ! zNZ+mKkFEiFv!efo^cF?`9c8vE`kzQ|Q}oA3Z&&muNbgegr%3Ns^k?YLUPXV7^uFG; z6r0|+1PUAdIV<9$JuNICcnrkABL+v7B5rCTvyz6N4> z35q#1091)&#e9XP-NgJ0{Yxh1>%T!A*nZ0n#vsWQOcDv`37VCB7saD~$uAZO*a29V z_%3eDjvg5)-wcD+sso7RBrZ#qts!oh zEL%t1a9Q>{;zmer192lIw+Z|#Uo28`C3iQKjgs7E;?9-a1H_G%+!niky&vX_F_QZ; zm5r6$R^rZ++&1FINp3rFd6L^jT)yOX6E|LRuM$@vxxK^{O70!vCP;1{aT6u?5pk0w zx1Tt#jLQMyie%Yg;wDS(TjHij?l^J9lKY9csge_Ms^6zcE{?eAl5-PRBDn>lekjJr4lz&a;L`iuPbj9DHll2LuF->OCxTMbt6s>#LbgsgNVCGa@oXPEV*IC z`6QQ1+v~Y&pOl1KJH=tXH3rg| z+#1OpCoUqnpNP9ga-x&Ux~Syhh`UaD?Iv!WEK4SCz2tflcZ1|oiMvU1rxJIw z^$Xt&7~jaH)#GA)wTnsd8kdMf4)$)uiE(NrN)Hp(UOR8_J`mUt9%r_`LLn7h=< zshB@Xu|bNtTc##0boa=TTvc+fg}c)+r&W}Tlt0OWywhrGU={j*k||VD4@$`& zteA%-Q=*tHl9{QPMO8tO^SI=GU|Co%67?YP$fGgvq^Pgcjy|~!IntF?y?G8c)??{ zx(I8-Qy`RHF04Wqj(9xI!jm<@;nV9I;NymgE*$lEoUJZGya1^Yg6bL8EGs((pW=Z} z#1-sn*2MRM_&tONgc!hT5C;`5z{pSaJs>PU*hxuQ8}{~5e(sht6Qatmm*s4Pyz+aG zj6jTk#lpulc$|YL>s1S%m)YwhD+VIJFO@6)+o*Wh;Rm6h(tgYVO69hQn8UZEW6 zMr2s$qum)umFdRkxR!zPRsk5r)-qg+f15RXv4955v~nGDKxyWL7_3KnIvX0``VCEr zTfZN}G}9X8SOKb)7163=GTBTIS1xq!Z|E543DE4q7|w}Xzjt|OBT{*+xvT3g)ZB5Z znEevBexGW@aHkPKwQ5AGKFMZFom~kq9DkD~@EgPRUs`h7WV@Pwt0kGgzh)_0?|y8O zb@FfNdf5{lXEQ3yIZGRo(!v|o8NKl?5{@AwpwM1_c=^ygb8re+t#O8Jmg5D(-B#0E zR_*^zlRiyIpFXl40!{yICPLQf8en~phXr2}f(h=w)dGp;ZWiv`G1CZp1 zk1P)@VV);`__ne-8o*3?jj)C|E1{4J>BaB>MJ+{5PD$G=TWq}v^<(+!TA$Z(x-R~e zbiLf_0|tMyA}8ESAg)6|18qDU9J{JW;jpK1X13Kdf^d)GghYlJfYnaZ)z(r5D(4G| ztqL0iKE-+j1hc*)T>3uh8L$WWwp<(7&JY-H9mEQEQ(4yUnYfOnTe&SjvC1$9PB72(i%wfV;2Doe>H@j-7}OpO$@C*` zCapQLjbpIX`eg|TIWa|94F6Ir7>g(CO+4c<&{9`x1BUTD(Dp`<>!X4ZM zCnW1|bWSMd?vUESrS*40ovbE;v#Obx$AWFE-0;qCuJXGdp~^(GG7&9Il-k>BzA+0L z`P-bix%_{q;`HGLH7@LKo@88xb2#4h@-ZpJBgk>taEgbL#j2N&@S&g(pA=XPEbpZ5 z{h;{+a04<#o0*;BC!zTJHpPx#Slqg%@S+#iGz*iwNZ!&+!#kRMX@5G}pDZOxq$?^P zhaiH--Rc4vj!SR>B*_p?5}7|kocxjMhH`Tz=mQ&dSm!m zkKy@V6>8y`0v6}X#4=(#>V8ucp`CB5Gi+~szyIq1DAGH)^Cp^*6&TYl_4}%!>&R_Hg2M1nO)Tr zT$wJUI(w`v#D@_@K3_oCW8Vc~AnSod9jeM$Riy;;jE{{(SQ~DG+FAWQia&o466cS^ z^9+_>p-ZRJceZ2ncP`jSTj_~C;_bw~i6>j#yClQyh$}_diRZ?T zjxU1c(oPfc@#jG~d=f~c8@@f01SouHI#Qra7vzv|pC$ROJuEvhJ|0zAfOb2{(TC5E z;)(54)C1WB%PQ)DVkh;7%7X!cTUBKrJ`3#uJGRdIZmT` z)UMN^9MwpVvAiGnhDJJJV?Cq{g+W<=tuC-<=&i-NXF3s;wbQb!alK`XI-T7cyDcyE z*73bjZ+gtC3%c^Gm?C7)j$CO$hv&$6XIyh7d{H5F{dmwnfD7OmiB<(l2F6>ndZFe) zNWgaLG^may%i`xqU$Q!hoF1rruwDWmkRdw*>YyOp73nPM8!`;*frX)x00qOq34z`T zF_QYC_iQhR`Ay1tvo8wG=mF;v3lsy1TB8j$V7}gEcr28 zDCX4-C~t~ldSM-owNr>Gs@HEG-&AOkV9kGnicCK&96b$=_duilDC5!MaD1s7qvTWO{|8XfPEZhvG5xLMx=$6x&gvT{ z@Qp;$4q-Ai0Th#06ieS9t96J-t_`)?n*T2pUBrqWb=r0jE4qf-W{HcEPEww{Lsx)I zCv8%&)loE$6>W0@GLOk;9jL@q)P)pW?kKu&C7FHDF@GVG&k|${c-&~J8bd8$_iYjA zxshw!PcBH%tl3C4H##vWVKSx+EV8m#U`m)g!_g0N%w)#e&1B4vc3SWV+22jq&fMml(l2UPqo~o+e#!V*Q;fHZsQ++UZ&@>P)fjCSXghjy6UTse#}-5I^9ERo}z0zA|t4%z!527@_d3|1(!cwi%C9=R@Sx*N%53OkU^c zDrJ)WfevDFcT9>&b_S%F{5U4XB>UA)XWvQEk2$p*MgNRJu|_EB3@RE)*ErE_yWOT| zO{w-q1Ir9@jGfOUD~Db*?Q>Dlui7`I+Oy9x`7!%UvhsH9bJ4}WYTuM<&pyk{joD|C zmA7M`i&j&u_BLmxj9WC1xyf>$=+ma3Ov!e){w0*PbDiv+#pK-%G@HqL2vS3axo2X6 zOv)DmLH8;_=61yd&8}xZ8b}0#%JeNxwNf^@Ee0{kMqo5B$@bdoA$EZ7>R}0*#pKmg zW{G)BUQ3W_4|6xg1ev_Kl^}E6H=vQpyITno)8^8X5LhahY;mC3OtL@d-OP>5-4GLG zlKoMF%-tRnWK#ETCc8{x@GBRh&T%T1FuB@+N|}rj)HQY^#V)c3&}U3;h$&$5j}A18 zDCaVqDBg6q#CdJJHD%g)=3t7zP#M%l&la-vG+iNMm`sVKBa>qZQW?YCw3r~1(_0BT zEhAz#U0E$WA!3qswze=eX2H}o2mm#+&{lv1_{o|ne>wr_bmb_GA-<5VQ|LN_uG|^K zIu~wBHo2HXS9aMEB!ZXGA4rZDm2{dOv*?;l*I{(!$=}q+^~{y%T&icT5N3VT&H}2p zgs!H1M|#gEd2>ZD>vtq)+FeHaR??N14^tm+IJT4AUb=ojS5v+*P9clw%3HZj#GCSe zC;T(InwwHn-rRmKp|spfS99BK)(_HFyP2-bj4ik+znt{0r0Z35<^8xR--qry(&)+$ za7Ph8jjpA1y_l|iM``NYPURod^;5d??WHN-neG$2)78A!H0Alp=@ydTPuJu0$b;_% z`QFj2f9yBPvp)5fG5EC}JvrDyH}j@`ehkVt=N}q3{igioa5Li)sgRwP^<&~maJFzJ zfdAIuP@rjWO?^desM0@pN$v>Wh+&zvHT9t-nbq~7!3%1F0UvS&=jnxs_|E5 zEyT72f|WH5Lmax&Uj;O@S=v!Bw4$cLk&q-jlLR9^e^XO!O(3Ysf;Dx1AJQ=Xz*eXt z=tHQvyjEesg-!nQ%FMvR@+N;}rl!A9m1qdogGy)x+^Y{}hTv4M%!KN}B03MH)&5{Z zW6)R8(1ha9n!57fLRCa6pbwE+03eWon(BJ#4%BT5)@BAOo0N2AsID<5dsH@XGE$Y$ zW>qp~L8zuSm|0VQ9+r@+stA53=uBO9jujmHd7R6xD~q%2)ZoRJ0_~qH=_x=~BiTEM zWYriT`%KPT|54ckCjGN@{?J01N4b8EaxVw+Alh)adRpF=Sx>Lu_w&Sln-EREU z?!NoHsh3V&ADZJ%8R=^tG}m6Td*@$%m~;D-HK1_Y3e@<5c*=d@L%=?{A_(j*afd9* z0{T7Snq~p_|5l(E?}^EFe3spOhr8$KjX7fji|nOG?s5BiG|xHObdlZ19qiG({$Y1d zJHhR_@My^H_MSaIXrEDLhn|`es%)OKs(MYMUAb=W=qc5e&7sjD;fk|5S9QMAU1aw; z(xch#y3Sr4oD-UQ-nq>e0%gaSJ$loEV^V5zXZwy757?iJpuJ(mm~Wfb+dqoQ-?>N6 z3ulII^cJ5xwP>*Wcty+2bBHwn0uNs@=aM-$&ACY`DC_*$O*ejKKXyfx z{kkj5e)Ni})t`jz*Ie$&%VfDLqr1GiA3GijL+tEe)|~m_)$XUyTlsDHTX#=)pK}-5 zJ<8le?e~|v-wS7sT^|ZS1(&_#sR!*_t+Hx6{*JM$fd6WldmV)8eV04Sei*F11=b!? z*4_kb_DrtR8ep@oNu zg-9ZUE%?cHU%6x4!2Zp1Z>+@ZD6>y`Z?3)69h_r#bw6b{kFgWW?8WQg6J5&+)LaJB ziD;;-^i?!A;g6{U6;1F`9bc#>P*Gm%7e3#j8u(5Q4M~^;>MKDWW}Zm_D66Uq3SZH5 z-w{`vUZ@n+3)j%6|A}d z%=yYIE1Ud*fCLu$%bS7={N*?Uh2SkTKA)T{YU+L9U~L2F$4L@&qIU2M1PdqnilGe! z4NXn{ilDzz&Q4&M{iq8C{Y!kIdZ@h!^ws;9pxVmvV7c^XaZ^pu?^{qF@Qd>1YItW6 zHlYcAhU=3R8bh%1pdIor7;N-4!hFx6tMr2%tfFRIpIjqgM)XMs>jOS$cSA)@aA~aZ z(iQ|2U#tW*8y465n?z${9nSp?O#*%b3|cDvON6gtVR=nGTtZC{j@nQibQrWA#G9m( zV5I90jvl?e|}9`5 z+BC>Pk}uEDW?%3!X_9^PHP*t^>GLfP_%9tgL{!z5R|kY_7r3^d7DiV!4zGpq1}@c) zRW(Z>oH&eX>ak%m$|^a1zG@t!FqS|Q8o*qJR>_4MlwhQCMgRcoJdGL{pfJd2S_n$l zQ5yCdnhA`Z%Kl*K(m>E(Hxoo=%q*6QWh8xIYOyql$pyorNtS^xb&U{?Vn{5|fI|w> zM&I!`xv84vQ~3~p{YN$A9PA36EE0_qp}R1-1boF491!(T$A<|WgzecP(FnV;U=>6V zUsfiwg)G-plsCXcQn3({Gq#uW)k1dqLXD7Veq+`MHZ7I2K%mi&6HBuX60kybV}a@* z$cjQ3+iJ4Vl+J+B)9fz|!nDeR5mHFaywYc1LseA(eydJdumJOAqU>`>se07}Ik;gv zhLds?%+z3q`&B?!z=)#0R4E&qn_<3$fm=}?tZAtCH7rtt*hyS)(`hGYkPR7v3Lz3f z6>D@+_8GjtE!LZI=90sD26XOHo&y*9WuRe>h454k!7i%>*8&Ry(9zHuSazUyn`Xi! z1oM1(wSNXiniEb&13C}f^g%Q^E?_t`w69!cDV5(H%lgpx-ZnRNZ*${$pjN4?`CHrum4+_vVyCzTrIH`=4 zsu9ruBfFu>*SHW@C>+Xa!QvGZig{9_IKwy5t3tK4YH4q8;&YbPau^^m9GxZBS?hez zbvWnN!-5JK6wpV@EICd%r{y#*hcU0oRkaN;>#5aSc84}7+SV-v^NXAO@JnIYKrqVl z5jGWGtfN-u!3!Je{DbS^UL+8zEFTO}9t_hi^fm8gz+~(6ZfdBOn+nakS{fldyjH83 zomNHJk^%uHVJT3d#}T1N0X9pJxRu~?V|itcy1?{`+)#BHrY^%(eO&2$P5w(mkbi;L zlGfzMVb%=28NfFO!2rQo1@>A2$OmV;aA~LpW``=AFts-LAU*J|N;Gm0(D)U;I^0g+ zDKJ%yGSIBLL5^6QENBl^S5sSC6RcBC!USIf^E5QA4wJL4d`Y3)TG7t1QSA(2gy7Aj zkW*zvt-riJ)F_uv0n-!w16@s}mxjt0(_ACRN~<1$DN^c%l&dbU6EJ+>W?HS;awUR| zP*oKKpfV7|2??C1ajjNT+^qVWnrkX>DuJ0{0nW<-@VlV`S__>5H?BC7G*nfVFU7UG zaETtbi7^p;6c^3qsYf&iZjefF%SYSiqZ4)F>wm-h~=-bDh5q=Wy7y z%1sdZER&h`)r)H?VRNYaTiMjm*a+UrU5(l)K;-1Ai1`k)62w(bv%bJW*k;NEiOuUc z8PG`a*DoxuhiGWYp{+U4){5GOfWH8C%{c3Z76{(?LYU=pA>D$#AkVSzYLDWEYT5bN zY$&dSkJ&NSAXEv?XORll=r+Uc6~h(IXW&aPn#1ucd7S?laYrD|grp zxG2K_$Na*vSl(1k_lNngXNQdeByEkq9wtlJ?OaNo*=iPnZiX>Hn;+OR!MK;VNZ_4X z7kR@eBNeEx#3h6lM#$t=Y3u|^HbW~Ks;3LosfDRZMoo*pvlFH*4fM}6yt8biY;0|e zhKFWjNNnp(TMt}z8cXobQ{JLZnl{T*kdxyXnKdjc+ml%r4AuL`R{J6BH5I^?H&rYg z3(rY2M-201R(mq15AkGHK|?AQWx|{ogoV4IDHEm^*pg6CWBYLIV0nuR8(Q4Yg4o1b z_=0;u!MUD{SqtF4JEY8J=7c1dvpfgh3_L6=XMn=-xgEUgP94@|GlaDy+3K6n#k~$5 z80G z0cEV-`B3jZM>an`=+KkEBB@J;y2q*h5V|6k0PV(ufANW!hpo|ufrIwjT@hsac!q5iP=|m&QHt@cbSy9 z-NNAH<|k(7CuWRK^nfT-ks-FbyApR>`H6e2iHZBH!o>a7G!*}yzzG132XJEI0Vq5S z|BnN|(uG1I8~ivxer(2e#QL&8_T`nzX)rW_K9fMHb`Mk&C%!q+UZE|>h*4b`BdKNw;&@@H*i34qMO{#f(B*&?iZ4aQZ~04c>n1Z9$))w2|kpCbTZF)vGI8 zgTUGF{@V5q+ZlzeOKtV$(^jCe*tWfD9Jh^|`c6P+QPxU}5b8tZ&SH~+pDFn+Z6b$x z55HV%)3Qv7cNT}`HFg?GcnncgF5wwQs>n|fpx@ya-K~y7$#rVe14V?JJv@!@b6RPE zpUx1@a~c<4NVsY@qcCm>Pl-VeWs4pT%|sOt-L?F`n+h(2E6yY4u?~Rt@LK^tSsXdx zp$Zw)rT7hy_T;y8fWOcIz6Wsh6YJr@U#Iv4==St~4>-#67lGtF4Ol$%AL4tdANhyu z>A<(AX9&q3rcZ`=-o?KHfqJrSPzndny)}f-rzwKx-!+8umt*-|5*q<;&n|vNsy+OX z4)EtYz+dYC|2yF5e=>b&%x{T0(t-Sm4)8dLOM8Cy037wJ*WAY5mNgV`Jx}sv^x)@x z2Cl{}6l!}&*hyy<7v$h+2%d)FX*ixn;AteDa%9O+NlG*)8|hJa%9W_BkfS7|hMXMT zh;yIrn^Zh~e15TS`oxK)6K48m=8rF);NzRvsd%Sr+{(*6IPav@-90_`mru{MhP1v_ zYF&jN`f1{H`=}wxN#{NSy>T9AYhtZ#HZ;8LlaPEp1Z|5;_2L=+*o}|eOSiiDb)KC& z4;mZ#-(iHwc7rf1Y#`h8g;V|(P3U+YT|6~XF zHo{RYt^w@lD~3GV{lLK0yRo5-Fy!z+JvfF~5AXfhPxhyP3{M7yFN?UyN zzq=-XHsR<7?nOBcS(-fNTPpcEUc+(M$MVxU&@)Su$2~dAU#Q8C((p?(d9?cz<@xg+ z;BOna9GFn=djn4<|EJO|4aVUV&2EK;;~tm&yh+3LIJ}_Y@Vj|O{u9E@c>bu#r)u(D z5`cljl>dNm^b_w{*dG_&dYSUQ2uJxon*4B0{#*?&)8yf`UylAuJCMI#lgE1o_UHd~ zAb(JkKTVTQqA$~-|GGc9grom>FUI;W>OlTdO}?Kde?tfIJ2ZKZCjUhT^8e9reIDpa zx47sh<^#`5iG*Xj^l^8JAzzCEaHMsB576)dAjfeyU(=tV;R`i+^oQ5$TMV52ysZO0 zcXc4Y26WQhso7KhfGmiXu%)r%apW(018Tc*K`F}I;$0(j(82AzL^QeKpM|$|d8~b?)jW4_( z$Aj@Pm_%^&GVolA&zS~(GVy~A`~%W6+Q4_xKE`X{4^qF+GVq%zZVL>2Ir03XBKH4w zT0fQ<@~c#{M8v=!pg7!O;Jn}cqk&&e?c#E_n?mv7UraH6C*gYxJx>z$*EfcI7V*CrxcU>6@Vtfcg7tVQAMk6~crZSlaQ;yRuzsA6Sq4?Zl;OoeryA1ql>UaM6B)9h#virFq{|_4P zJkD7DNwWKkAzz@vEBcT=mcN$lrW^S4lvn&bi{(F}{2y(~Q-9Ak@Eb^fg@K<-<8GmW z^E?tT@NCkv!oW|ahfPrf&!hPK&cH7uKkqj1vkBi~;5OmU8+awf^K}CsMEnN^ej)ku zxq%<1d^lp@H<8_64E#CnSBeMsOMmhw#lUA${WA=F9gXWO1HS?l!ck!0e7`f@z&S2l z&i*`0dD39WbKI{m@G7#)zu0CytoIf}p6%Xm;5#YKPZ;=@6o;J#{s)S~2L@hFH}<2afhW=av!8*> zzw`%s&N1-)G>(QF_)XNmc?RA@^WhW&Ka>2NZQyC7f1!b2M|uJV{sgrj-x-ewx7S5^ z7%_0ZKflGm{nYQb8~93^Z|^ej)zsdH44mWkl!1Ru{EG%2rgr_^z+E&RzBKRyB!A4n z)!+Vt=Y!-g$ASGxH1K=K|7-)_rNSu282B8DPnm&VO?-uc-$Q)8fgh)QyWGI}$F4UR z_;cjv9R|)n{(IfPy_7#68u+E;{}%@SZ;JC#0}oLgP8fI%#Xp|(ah!SH>1E&_lm0Ue z`~dmMFH>PX{Hlr3hWrq+JITP0k^WKxA3*Df&%pUdql*lje`UYez^|k{3mf<<8o$>Y z_|=5pX5bf-|MwYqI*rrE4BSiO`Z)uCoA_4@oVrQy^G}XvJPmUY7ht|zFY9H(IQlOI!{3gQHpSg_9!~Eme3`72F@^iR>e?f81Cmh`v zt3oNylMVS#$?j|eznJEk1qRN~ed-PTRcilb2F~O0Dg)0VyEhm(&og@oNB_rY{(oY~ zpG^IG*ubL{pPvoA&B=`ORW~G4Q3N|0M(G`{8#D{3VJPKeyxf{FVCs8$-S?$)7~?G|OL2a_|;uc`(k; z4F?$bDWqqDftRZ4qSV0odoSe%K9AblVBpUae}#eXrEwHB@E=Lf?+u(k7rf8F^C|xy zH}G7F8{6kNTtar=H00l<{QQT3Uq^BHmw}I?{QS|t|3!Jym9A_T|5`2{y$n1=cGC^~ z9MU_~z>gB1Z{X)p9HtvMKWFF9N7x_UH!m{eU!(XhHSnLQy;mDJzjBwyAL~Dz^6(Ku zp4YYK415q)gyS^>$Il?~;Fl|~ex4r>8uI7Uc>m78`K2uIMtOO#o`aMRJq)~-`lY{t zKS6#DHt-EJZ;UnY8Ki%Tf%BW~<`{SZ>902M_o?4Q2EKs&TyNmK&)8_-KT}-z^AnE4 zB_#K>A-|0Hmkm6X`1cJQ|He5UpBeZ9^8cuT?;-y!dalO)oKJox8TcX^N2eKhI_*0L z8u&nxA7$V@$e&3D&hJi~W#B_8pDPU9OZcS*ei7j-47`c(wFaI@_-zL6qVf1A1HXgj zwfgD9<1~^^ zzTln!U{5s0N=M20D#q(7I=Y8p44g7Y>x6ciH zAm#s21Lv1J$uCtv`#3&)zkC)=bc{zRKZhDPzx*c8z~@l>ryBU_641Lx-e*BLlJ$GOeGn`j-`Y~Xxf|G0tQO?F>5aK4ZJ(7^dQ!vO>5znl6W z1Lym`9{42{tzXJ%KJP;~x-COP`E#x&PbnztkJE4*iU~AMCTlp#^M33?1OJQEB7~1{ zw#%>WZ#M8u^5;4O=jRgl8aS^9PZQ4hHk$Hnry-wA@&8zp$2uBX9*KpMHI_dFiILh<$u|^F?`Cg#5JkP-S zWpa}Z{jbw{T4l)piS#To_^xs15eOtp(^_k?)CmN3aJWF|g!qD%0 zj~2fa2nWZLpPTg2aCGIcl!9k^8jkw;Wp#51=lDNB{x2}_eS|ME@Sg~8H1v<6eEXe- zV|!_PBkt31^rwX6pEvXmqy5IK20owgcMW_s;U5_KL!=-7NDm$uH}r>Kak7S^KP#yq zlW>mDpGf}*1AmwBaR&Z9;f03&he&^|hNC~Ue2L37T;>DiPgv8BQ$`7m-|ICTeLbBN z{m#HA6MmFioa<%`pGYg{7lm?r#4!5zUctB=?iuo=k?@| zn{f80g7y_>8#upIav;b{BMWOs(4e-GKc)WG@WluI=|Xm=&qjc7RP z=g&*7GxYEuPPkjcG0uEErr{W8{v!%+82WAU^BqH;|B%9$8jeG^j0|+bFZIH~ac24c zgmb?PCjDm_@)x5393wRx^>0EDj)@wM{`39F0z-cT>902A<7E;FafOD{)Fbt;(Qwqy zFD2b*;6Ic82MnA)cX{5xoj*y1Ut)#>n~6i>1@b3>aE{v+8jqQpJl465?2b0@9|$it z^qfkae~BT_pSv__IJz<)8x6-&4M#t}COxY)9R1<%53D7e{pXj--mJ-^{!OI+&JOTL zH5~Qt#}gb+8v0jLr@d$3{8HM#YkJTwznu5W4)7l}98L0Hq~e91+jSj{>%O!BVBDtp zd8mOG5I)(!50D<8foBsQBpiLg`1AgMg@$9PC0aQq>uod3Ye0>U}Y%_P6jke^TSyhfA9_^6w5A+FbOy}y31;b`M9#o-P^|L;lvpEY^Z zb1wPwlp)XGQ#@eE|0tb;dC|c6Inqh^qXjs)y?@2P!qJOxj`Lo^M{4p|hdb4I2%|iv~WK@HY&+p76gC&UShH{!^1j zyUEmF0)J!z2g~zI)7^xlFDRc!^1U=%#)s^B44glI9AMyIll)M^*)D%yVzeeN`-SXI z)^HggdX7|T;9kP#8F&-n3kYYs2T1=FnmoG5pVMD$$d{1(9fmxQm(3cEe%?xUpEU4( z^n7ERp}&&!zp3Hrpl2nG_YXB3Q~WlPKdj-p{0|zA@_#1zcn>geAgjx#co2<^_jhUj z$@NIsnFsheVWEM4OY_fU!cjjBMX8`hlgIe1qc|)!@GQDvyUM`%dH3~%vwli%ajPbe z`NPM(9z~%|{6CwXt3GVtml3|zz;7q~S;E;aZEMAc27a+n$6*cE#n{aFs=IvXQCsPf42KD1b27W)yR|^fiKdqYq1K&XTyu!c-qH#E` zH*nVf2Lsi6Lqj;@!G{CEw=IwR>h@+1w{GlRxVgUCeWd@Gfsdkm{>i{u z-l7Lw+^)YN0Y|3}@Nxs^-~am!JcZ`BMF!6DjRx+faTM$TUuxjX>AviW4)7KOzu%?W z73lz9Z{XLG{LLNUw;Q-cal6yNA5&(iSmW@Q`p2d1E(|;IYh8LKOg(jz{#vgq5NWh_&JRJy;iImPYt+`26Gnk&~{_8sfc^6%_F5yOM`%czG^R^lFcR+x@g8aU7As|}p@ zZ`%xfFB*d5Cv}lFQ9sX<$yAOQ{^$FtGy~`RKK@*h<@xyx@9!Ar&nv$&^zeItL{?yF z9lVYbuE8dCUC0!^F(wOMmmd^a_=ZxEwE*7BpVicW42tJu!MlHS7GCH>Y(*f53@VVX zRE3w4S2chde7&l#e8B>Iv7ufJ@9JsAmp7HySHl~9s0MSILilqqel7-IL{>#ZT^+nF zQe@S`3lFp4g^BROLwx_YGUH$9t7^h`y8j;?9?*j!<-B9Hc|`E{q#5TtWF8;yVCv>E zK-c+AipZw?$H)C>hjW@9GmEnbx0SeaK0x~?2OxsF-+>1Kg*yMY^>d&u>Kp?9^@Hta z=^)T-pRaj@nf3W|*(w$!J=}hVr&E2J4oC{_V`!q|IB@~j=W99D=W@RC_h$C;1WN^M zm*wUG(O&e`u5KvR`$8nL4q?!r^#^=M<=1J51S?P-bE%o_j8yg$UC= zQE_c$(arY!&wX6gSV_v!f7}Y0{;vb9J^N2jRrRyg#W|a@Q7CE8{?;d2*GK!fMw#|E z0%q#Onuo~#%KssLk9JUh(G1ig1phuyacylq2nFr=e}Mewen$Us?3?~S3mE!u#_7uo z0EFXotfU>>R=&OrW$o2>FI1IqeCr3-$t8G(@k9G1ls^OhoAq&eHRnEngr^bD bLh$$e71y@?IL)+I|1kOg4OgVA8NdGz`#PWq diff --git a/list.c b/list.c index bddd11b..d86cc76 100644 --- a/list.c +++ b/list.c @@ -13,24 +13,14 @@ void drawList(int top) { progress = spinner[time(NULL)%4]; - drawStringBG(" Flight Alt(m) km/h D(km) H S ", 0, top, game.mapBoldFont, black, (SDL_Color){255,255,255,64}); + drawStringBG(" Flight Alt(m) km/h D(km) H S ", 0, top, appData.mapBoldFont, black, (SDL_Color){255,255,255,64}); - top = top + game.mapFontHeight; - - // int xstride = 10; - // for(int i = 0; i < 320 / xstride; i++) { - // vlineRGBA (game.screen, i*xstride, 0, SCREEN_HEIGHT, 127, 127, 127, SDL_ALPHA_OPAQUE); - // } - - // int ystride = 20; - // for(int i = 0; i < 240 / ystride; i++) { - // hlineRGBA (game.screen, 0, SCREEN_WIDTH, i * ystride, 127, 127, 127, SDL_ALPHA_OPAQUE); - // } + top = top + appData.mapFontHeight; int numNoDir = 0; while(a) { - if(top > Modes.screen_height) { + if(top > appData.screen_height) { return; } @@ -102,20 +92,20 @@ void drawList(int top) { if (a->bFlags & MODES_ACFLAGS_LATLON_VALID) { - if(fabs(a->dx) < .01 && fabs(a->dy) > fabs(a->dx)) { + if(fabs(a->lon) < .01 && fabs(a->lat) > fabs(a->lon)) { cLon = ' '; } else { - if(a->dx < 0) { + if(a->lon < 0) { cLon = 'W'; } else { cLon = 'E'; } } - if(fabs(a->dy) < .01 && fabs(a->dx) > fabs(a->dy)) { + if(fabs(a->lat) < .01 && fabs(a->lon) > fabs(a->lat)) { cLat = ' '; } else { - if(a->dy < 0) { + if(a->lat < 0) { cLat = 'S'; } else { cLat = 'N'; @@ -124,26 +114,28 @@ void drawList(int top) { snprintf(strDir,3,"%c%c",cLat,cLon); - d = sqrt(a->dx * a->dx + a->dy * a->dy); + //distance is borked during refactor - snprintf(strD, 5,"%4.01f", d); + //d = sqrt(a->dx * a->dx + a->dy * a->dy); + + //snprintf(strD, 5,"%4.01f", d); if ((now - a->seen) > 30 ) { - drawString(a->flight, 0, top, game.listFont, (SDL_Color){96,96,96,255}); + drawString(a->flight, 0, top, appData.listFont, (SDL_Color){96,96,96,255}); } else { - drawString(a->flight, 10, top, game.listFont, pink); + drawString(a->flight, 10, top, appData.listFont, pink); - drawString(strFl, 90, top, game.listFont, orange); + drawString(strFl, 90, top, appData.listFont, orange); - drawString(strGs, 160, top, game.listFont, green); + drawString(strGs, 160, top, appData.listFont, green); - drawString(strD, 210, top, game.listFont, blue); + drawString(strD, 210, top, appData.listFont, blue); - drawString(strDir, 270, top, game.listFont, yellow); + drawString(strDir, 270, top, appData.listFont, yellow); - // drawString(strS, 290, (count + 1) * 20, game.listFont, (SDL_Color){255,9,96,255}); + // drawString(strS, 290, (count + 1) * 20, appData.listFont, (SDL_Color){255,9,96,255}); // printf("\x1B[1;31m%-8s\x1B[1;32m%5s \x1B[1;33m%4s \x1B[1;34m%5s \x1B[1;36m%c%c \x1B[1;35m%d", // a->flight, @@ -153,7 +145,7 @@ void drawList(int top) { // cLat, cLon, // (int)((float)signalAverage/25.0f)); } - top = top + game.mapFontHeight; + top = top + appData.mapFontHeight; count++; } else { numNoDir++; diff --git a/list.o b/list.o index c793279329317858944dac50bef824c7ac31ef92..8005c6e51e12d83fd34a3614f4770c233bf4c9c4 100644 GIT binary patch literal 47808 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 literal 48216 zcmb__2Yggj7WaFZBupSAlmMX*7$lU0B!ng+Op-~FNg)LSqQfMaB(tPBGoe{Pu_2;j z@2G3rwXD0A1=oU#if!#H*2S_4uDh$KsB7Un=iGB=-aAR$&+qp=$a(kt@44r;bMHO( zzBe-)J>KFt(=_yD8pjziPNRlV|3ECfh=PlZF~(@az0_UjuC3ehQ%&xX(#@YQD&0C3 zW1C91#!t$GKAWXS%i6kmCrI95Mo!rBcpG(m{~Sle@cU>*_H@Tf?qriZaHzK;zRz850d)@{l?FgsZs- zYCIc&qd0al#%3}z-AFzA`#2PIrk;HV1>#fBZh=7RgNuiyK3JIcC`vwt1d?Up9dgJu znzuwU(jhboLZ@bohR|5U+zW|@6CFV`o#;rSqlk_!+7@v-+>ih4IQ(>6>RAs$*Y0Xk zy7OEup^oM)-i+DJssGtsx(&2?w^7UH?%w49nTOC09>vgC?$oJIf0cR?#eP+kI(;wo z(BaM4CT8kcxBqA6@A?}CN;wM1KER{I>i_~-8rO52P?p-bjrJnNw&_k(% zn=+iq6D=Zut+D8#Hd_qHe|F9ZFrk8~&cHUvVh4{&9!}ZIJo? zL#a#lrk5&)}d%;9UP8{FD}};I0O6oC~G58b*LIVQkAuH z!8U>jd_%)ZiLwogMVQs>69Wlh7VibaM|v~}x^pbm>Lt}j*8Hk|OaAF=w2ARQ^@ zcHHvWqy0e(3EE>&aUMjk=sP+SqOlCUq~7uw_UEg8MLwDWU8$|;;BnBP7w>d|Ff`7` z2Wz2w6Ja6hFhl>_Fr^L+C3#7Y&dJ7 zVeECIey|q2HewjBgo%a$(-~Y&v``}%iS?R7?W&MCCy6@Z6M`KPmCUiP7~?tX1>2*+ZL#2G7))>`I$wc% zzo&u3nUoy?Nx&QX623VRhA7&Dk#IO4Zz}u)iaS;KM+^^A;h!*^uEIZK*rmcpFq}C6 zh>>8J$mA%-BxbH+;)q$Kn0R7J6_Y?rm0}W!saK5CycJ5gN-_P-JAr9cOtOgu?o!Mk zVj_weV*VCl)+uJViLJOvF(b?dV9r!by7@=YwplS_%*TN_Pcf6sdqC`B#blX#fVoOB z*~Hwam>I;}p_m+E?o~{lIUmyORLo2&+iu0oGM|Bb_87_7EA0>*SPTJ&kpk36xQ4nV zJ>f>Iv})R$Fv#JXvHILCw_)uE8HvsaV2RH6fFqq)4bq7yW5WgVvtg0Cap;ZOr=_fIdgbD4w!g_ zZ$Ml%ThghBCo6mtHK7Wh69GKU5+1I?=UxU`r5i(?N!MjXGr9qla7H^QBO}e3bTv9Z z!!Rc4+F0;LET5hQK+Ua@sG8d?YVL@tx%twlnp zcOtAtYSLX8RwFg(Zq)5k^|=Sb87lk-l*u%b5&8~-WHzR1V0MDtHr?NCj_;3EUGC_yY<+g+Xn4Fd7_rN;Ej?oM>?L zRS={hGH_zth(sJ!SQJv9k`W8$Mb)Rwi3R6lFfN|*A|Np1OG)J8Zfsw@^0eO;s*PyiLy-;(d z|AlX$uQ~i8!fJG<{q-=^K#knAmoS4dO8#XGyHxlU3@fWodlkc(3V#h7F-L`8$M9Sg zegngcRQPWO=r2{_H!)nL!u!yO>Q(ryl~A5lD*QI;zfpzX!SF3A{4UDhp~CNB_+Ax$ zA7yr`@CO)vScN~t@NO0U2*Z0+_+t$3RpEbNd0tlGPcXbMz0Dsn(mu@snf>W)ogExL zklwV;NIQV=7wJvwIr!Zu;El9{ZD?Mmh1nf%VKzAx^Vz8&wkTOK|NJ}l#vsLfj#)dI z`4^UN5HtV20Mfv&kvbR~iL5HsNXC+2wrpj@qkiJo8p+rJn3nlOCtAnQ%(O2*0#H@> z5bEIYR~U9G{A((J3V(xPHjcw6qo%~PZ&9}kHsKik-6g;zL5AuA2I`si-xENE(((fa zIs7ArIj5gc%OEB5GnSaOAHnu;(So05m}s||W7@+lMw)5*L3%n^{dbU(hT6#hP$dT% zVm9C8XV^$Pnz)s~1%aDP+$x8w0pl`>YXT1A zrV!W4TBZ`$#@sY=WxJT0PI2p)%c8hV%w<#DdCcWg+{MhzqPVM=n@!wx%*`S0MkuF$ zt&ujDxLY`G9&vXtcMNfNF*l#MdmXNh0L&N15_dnxEg)_ubH@?)Fmnru+s)h};`T7- zCT=ft1;o9;Tp@8UGgn01>&$tG+s9lnaqlu$Lfn4lN~v8AFjq!#Uodw(abGjHn7Hql z^Ah(XbLGSt@v7e|h>K^gk~k-GRm3GTw}iMs%vBSY##{|?>CDv-Nh=O=Cvb4@1Bd!@_;h^u0* znI!9(3z|5etzzysG^AUZTW#X}*2P>0rCY~bCrv_|;$2-he|4ESL*Bu0VH3T}dzp(6 zcRzF8#O-8m4RH@Mx0blw%&jAC4|D5@+soVr;$C3xbQ7K0mzmo{ar>A%gSdB@JCnHm z%xxy_W9H5x?f`RV6ZbiD=MeV=bLSHGHFM_?_Z@Rvi2ISb^NBMOl+|q|E}ppysnky9 zE~dCa%xxzwjk!yROK0vf;>Iv{IdQH8BN-=Z{G){>6_%UNU|~qcNf~F~D2gjnq7$7x zTAzQ^aYu{^&}l~673R6nm9eELZV)-LM220D9)JoyfQlyei^r}Wo_{v@#z$d#MNJCF z5p@uaCz?Psk!U}nPNGRf`x6}y)#|ymSFO?b@`Js`la~LHYgEUH6Ndbnl1I}81HURA zm5FO?WMDhR51(xA03BmO#_%cTNT`W1ro|XOm4fD&24na%3dW7`8^fnl&|yr%l*6-3 z%$&Mm#EJ(Y$WHp55ab?7pMG1qtzN&P{i&?ULzymqQi-f zAev5eB+*esM-v@GbS%+vM8^|#5uHGEBGIFWW)Pi3^k|}!iDnX=LUbz8X+)LprEw1Q|Q(JG=#h*lG=AzDkcj_6XN%ZSz!T~2fb(G!TSBzhvz zlZg6=t|ICu+Ca3CXcN%@(PpA8L|cgliT;M@YNBmK+lh7%?IhYo^kkwTqG6&DqTNK- z5M4`j9ntkfHxNCA=&3|cBYHZ~jYKyQJ%i}kM9(35F46OdZXtR;(XB);Ai9m{g+wnR zdNI-ML@yzFDbdS_UQYB1qE`~Vis;ouuOWIZ(d&p_PxJ<&JBZ#$^d_P=6a6jGTZrCE z^p8aUMD#wQ_Y-}9=z~Q6OmrvFT|^%u`WK=P6Mcl}qeLGgx|`_ZM4uq~B+)%YpCbA+ z(PxP6CHgGU=ZHQ}^aY|X68$UDmx#Vh^cAA75`B&6>qOrm`ZuC)65U7iEuwD|eTV3~ zMBgL2pXdifKP37Q(T|D#gXkwjKRp^JOVgxVoVq#GEneLc)Gbln`l*{!-ICO;zq$=j zw`6r2sBS6hma1-p)NQc34NXxQ%!_;lKx{Xk`bafl4Zlly~w7QK^x3TIrPTh<+ zJ;{$O-DjWVO{#btQ3ug@q6uoT7`5Rekf+6h7LQSzzOwP7mpVprJZ+N4m}7xYa$q~+ zmFPsTQbontqZH`q4UEU_cuWa+n{b3OHgNk}7-OA(fpv?+NeHW*_SpVoA*^=V zW0Q}9u-a*l9f)CrhHM;g8HP$YStnF%re?EI46kFUzqNR_j#uJQb_R-?GqCKA?e}a{Y)%WXaoYIV$&N9k@~p=UJ0clEBr!oMa|x2C@fq zH*3wA`Q{QcH{YzrPdx zS7viMWiu;U8wlBI)3e1^JohWJ*j|7&nH|jnLbfbyeK}V*m^%-)qQB6WvcVkN@1u_S zHB~w8ieH<@&i|1|?{%5~^RLb4p8t^#y*PtS^%|JvR2P|MTsR&ZItLm$ZVhy6eZt`V zyU#equ*sH?Y^`~WlCnpxW<}Ivan2RJ$y}^t9NVcW;+!}3CUie5BI}BCzS^72TP#C{ z?&uF^yHsvtw!zo?G-{)zKM3p*mB!48l^fyV@CRel3V#hynSx`3)7Cu86O!S5ibb*f zj)1s2YQTAr*1>qi;{-)K9A4nug|i5+lXI}JaSL#obvy*{T%Rut{0qQCumghgAvh2I zAUFWlfMbmL&KnZ(6|E-YScLI{gm5h&3S{iWXwY?0G&o>!G&nZnI4x_KgUv}PLkBog zMyCumhx8i+52xZXi~$3V0|*MmL3qC-ez@UCIcC880cAts>3S-NfTMsnzJ8a&NM+uE@;a?|4h?}OW$4q8fIx2vzZNyp=9P*t5Y`AH6Wkr z0xhfS0^0E=H>hYaJm7!VyaV6_}JjXE8CKMF1V z2M42Wp0U)DmV(fPbiK!S)2Qj0s)i$@w_FbCY0WgMbZ|dMna0YVidIH7a6l_s#eAHR zvqQ>kX5e>xcNpP)hSojDR49Sd*lVokJAqQ&7NHKxE|meKRn@X8fOOEJonEW7W$+Di zxm+&OI8g^L0+$%C5yol8xB1^@eVyghugQ%D-q=yf&UF*#*{9$U7D!3>9~xD3jDF8S zT_n>uNe6G`0*^3G*QL`h^Npj@-P5CVeF(;~Q=u}}tQ8D3oUR?0nwOe%|CEh0X7(xbBI}DcU~{uWb3ZT&6QmC6jFq6QthS~5xnX~)cv7~v;%ON@`XSdl zHtx`z&IP6kSrBbLL%4ZZ^TNcgF0g+C_7Qd z>gD8@+D^*$Ry-~9WvqBRH}25f_~>F)r-M3UC>{vP;^|mD<@{3dq-<}+(=z(_26DY; z;||T~g%kQ#2X)3uP!T&z@>hU-oN*ac*))Gh83>d<`UIsiXLN@{ zGlCtBZQV_Q8SCcG_RY@EY72IBughxb=$_FKjD!smX$v;YXlZQhDKbZ=R&uP$#`H{t zdS^t|cLi8`p9Ki77ZNo^-aL5wEEtYtH)1uzk)~j0UUsVim4R?mpc%qYQBtm8D0;9n zDnUVL576ujghHf=Qb&UA0bc~CA8A!ltO7g~3^f1q-J;X1Jn`(lr zJ1)-z?nxtVy6N;fMmXyok8F&aW;#y17-IXQ(lt(0+8>p!jVr@MNeHhcI0@msMqIV& zyu`T={ypsIjGJRRjy?pR7BNliu9`x3MPX%;$A@>1*YNrL@L`z_qbtWYOm4Y>F_tS1&WHjoh>cFjutR^ zf5g`mXzy%-j*kSIa*VE4e>mU^bhLtv1)w-M8s_>Uq^+u~-s7!ZUghysVeyM{XB+Sa zo3FDw($yXD!Ao%P7YW!icGne^RTjHzYKtqYm$|Ep?6Hfhd^MoUqY6?EM(r-NOVm{? zuBcpAVFw|Z*HcWb=rMfZ*3M7_-)rtF0=qUko0@!$T_JoIx2q-yb)YL45)p zYl0zoHP_a0Wfira>I!#lS!IRWJIiSC2bF-V@XR~|+aq^2G>DpR?0Tw8>dK%i+x#u6 z-(u;@DvCVyxzJqeWK&X1KIswSbA@tGZC!PRu|Ck&29I2PzRu=m?w6=-xvQ$YWrb7^ zds=9)l4_3|YH9e&Dt*OeUXQPqg|W3 z(ATRCl7-gPR*Df*SPd00I=b7d+WZ}`&UJN%y4nI{@U4+Zm#+(qPMIwleq(1xN1!nh z?Cg*|->U(8>OF;ZwH|u`t16dq|EvuKBRB|~u$$L*1VXA)qQg%$7g(dMxuBDa3cT*} zDo=HdyF!e#a+shDe=yV-@;8G|;PcTO9_;YJiEc+%2&}r<*Vw9hKiZGb`$lspa59KT zHgsSQ_>{re@-5D_m!nvet9Yh}SJocQrFfQz7iLgAN5qSPQ9REc5A6U=Q0S?sH9Fgx zO2HApsV+9NqRRjy2Pz)%H?GE7`wFD@u5 z^TN!_6R%38Y|>p_QeYSMK<|Jv;SaUgaW!{G4ZE6_aOnLeFtM5lbW%$}NzX#fnl(%G zK%v`PSm$-uR#qFjb8*=(?(B$^2Jmy7Mxz(zKy0M=dSbBD@E_VPIuF`R0S0TO*Xyk;Tx_oxc8RyH2GXJHVUH`UEH8K4p(+DaA`J;W>s%Awgm$nFbZu7s$h}y zL?>6Z{70+{Y`7t;W}Wt6TU#*FPE$F~-(bwmZJn^*g(EfV!;wIHEx4gLm3IX@#E7n_ zE5||>dOdEijYvq$5->;hoC%>>OR?=hyvEXWdUXKvi>|p~RACq%fevsgV41K;^H3-# zQC%2Y>eNV4L%OiD4HgL5JM}nze7@DNko1V70f|mXYrqdq01Ql+im`9dK4<6CFmK7l zkq)!9t+~DKiV`tw5X$Q*C8jTw5;GV=ViH40%wq_NsSF`8n;|q0stcv=3S|9#;qscgg1U;bT6=R>*OZnO*Bbsc zE$F$SdfW7yr(6+x8YoX?VJ(bITWJ6-uk+THRe6`&BgpjKCGIleQx=e8UICuA^qpaX zs)EJ3+6b%*3L}DCU{WfpRKuuNJ4hAU&Fks7!&FdGU0ElWXL3TSsy$1UOFDbcLEU&5dEU~Akc6)0L-a%Sc2(Un~vSx66 zXjces^aj{o+mn`iD(WDg*of0Rg=lXVgL?}bp}-nn7-j{WLeR;#YbnkZV+S2U>)O;5 zXaj@xMIvI2hSv8isdIa4+%@?*Ib_daKdfa9u!XT_L49lZo0@vsc|lo)yLvfK$#Clo z2MS@UtNNj(v$F{uNwLkLG3kTBgY9E$V3Jt+0Cbxoz6Xw90#Un*>*Q>ct4eapNhk_P`v0J6Y}P zQ+L35h7X-5#Pu>7?P(Y_w43Z|^}*>7>}S`}&I|l@dka;$>uNl)9fv(K$IgoRS+Q+K?7hMsi~b6DGKHl^gW85Rwg%9phanrFqYj_HMQsBuYb5v}!rug= zrx~Kk4NH?f2QSW!wgQ5%cAvo8C@S`O!QCnB4259-2O}4!if~60tk`P)<(ah_Pe#}W z$7!&*&A>?>cVc*wu%WXavP7p&rC@$XNpal%(v>Nr0gr&hvJoQl&!Eg!0?HPoXfZ|m7o zZr)6_#>k#!%d)wuGo`ud14}&ir81C11WrUaa5Bgu1QlrS0zVJ;=J53aEiSY*i+%Y* zooiK-L?`N^vYIN`h}A4BtA$ArM|1-ij1N7X9w*N*lXchK`y2 zAUL-Nf}V$6W+t~jZb8Gorch^Bm-Jkqr@>^RjyUC34F&_FOFgm(+v?W_9+0maA5R2m z12;1dhdgA9CzW7LJSm}_*ewdT8sLCL;51`399D!@)2RiVn&6<0?V8qE!cYXTkwPAH zST!>F9w&LxruNk1fgtq@%t>&JZh$r6S+Bh)a0V;f7C@l!U_5iz!chx641yi<8mL`! zH#}CMEwfT>n`dAO3iJ83dkq}bw1_n#cCLZrOPb|eqoEDk117aH_y!8~KnVIAT{v<~ z>41WI6^|CIN0@bBb;2i7I~1@rdv(hyYG6xg#OegiAMvZF7hoT7^hQ=0?7&9^s)c(x zz2 z=E`c1baw<6v;<&^3pN7l4>h(ffM=^&v-4e9Ev~G}JXcmTv|HoqEO^Effpxz#lm%-# z4B6@#OG^;BS^baUiqXxQ76bjR05N+G&s%0&i*k6DOvBdyH_+uVOUxjA__zbBt)6a)#g_%zM|tndp*QQp9f$C z;Y>OD47?`VdbX#^x=Ae{dl=Bp7LY4z2f;w_We+%2r^5%?rual$Y}#n8s`f0y!zc17 z8ruT?j_xknY8h)=;pv*a`C*$}Xq0XIP|4pR%+E;K`79 z)>-2zFH`Lj9m&grO>iJj?h6r{qv31p4uLtfb+@Z2+_wJCnmtRuumkf34tQ(~%NU{u zT)ekc*~r$ahx09ospmd8CpN%J3Y|ksW(hrI1d#R>crYDpN<2AKR93GH~?TYPCylkBuD^(~!ZLx!2u0 zj&*nfr|iShT0Ncy(t#l?@g=b6!>K+DFWeItKJeT0mdaMY8n4GwWds}joxVmt9C+A^ zS6EpkTr`}sq7Q{(-=v?T*vlkVpK5wxBxWwS6=@1IbPI16bmN4s4o=jY4`P)q^?0km z?QZE%Q)NS2Hx7jmZdzlOH zAGSEAg;QdS6YhyEPB<#IxOve-X`{={?+)~6c29jFymZh5#^=4t6+O8- z2&V#SGuHEPd)cyOhHWlt#3vp65>HRJ2VR>n)QJpQq-|W_Sre@K(YG8Z);5#Ph06$^ z437eRYa;k2RIlT!nqIWY!^4%OaEJtA{0a!4xOE5FPf$-f*V4plD+!&pt4UgIj$xb7 z2-XH`t8(b!D54!+(u@ScYhl-KuZCWbYb#4iz`M3CebLEWEhgY#)xtZNmcvI|DPjx0 zQBqiVj4QLQ0nE5t?Q*hmyNSy^J$G()PJVXo6oun^fN-U$n_+IKHq3Q{%+bmHoEO8Z zf3<**;W&ERwjgEDg>eNb>DwFyDXt6R-6@&pBowCPY)&jr>56-ye@YG@?i3eDfMh|6 zvuJ?hPBUelJ7tr(9&cT&tdARH3GZ`$d8D^!2fl^b%jJlDaKIMpP+t~c!;o>{>zch> z4t!g(m&;*9KPPXCh0l)Ic+EJ}H;8IBdUvSrT8Q#G;D~;DOC##;Fb3KI<{av)BznX- z)EA}pg6ofz+oK%OUYGcAJHVVneN(6{PPIVK_EaTL?9tMyBt6?ref+GS0pE&cyOizm zcMn)%CQvvr`eAt;HJNe!aW;*s&*3MkuYT4b+~M71xcc?z$vK24_UK9V8P}fn;AVNc z3F1)S<7-2Ufg576XZ6j|K|j>8P~=n$Mf}?Np zXL}2C3?MU+%t0~_$y_9GCWkZ+>1-skkmMsFEH`$Npj>=kiMO)A?e$d_7uR@d@trPs zT~!^Ls}oIn8PxVtoH!7R#i@6o_@qNURUsFYU!zsdfP51Wzad5K5~F9yL=n>(2#azDHZ|l@P{D>sdscVYKia zaV&p6mmlXDyfm(t;zt!6#kKs)U~hP#Jo+NKJpZ=f!z}oBjAM3_E%-2002khd!=KhO z#e(D7pz&FK;LR4?s^>}zjvw6CdhTUhmgkT~9=;_YDxU(MKfz1NPh}jFVSie_GEN#$`J!w8)RM$k+8DzuF={#UdZF;MVp$-J-|Zo@ZO+@!M{6IWMr_Rz27E zq30Hh{4|T6J1w|X&%=G_dD0?}pMulndCr1c^}N-Gp8Xbi^o6vZPc67r&*47w3`>B- zaA9;d{AoRtEI57-lE$@1jo<18Ul9?#^p_MMj_dZ*I5^-MtZw8fBYwc8037>xY55Em zW6d&qTz%qe< z#1s5U0x!nKhAW_MQ9XxQ{x<^uJM(J=-pzVW75KN@@aGEr4IE5xU8Zi)e3#=S2iMi= z7RC2*BH^X+pShf)1b#gm+R*}6zY_ra1%X%dI9Vw0!JMyG;A2?-a)DpK zTfJt1yC3$Pz)zT{@W%!Ij7#Bv z75GlJ&vyjAnfU_(-_8B|jlh$+-QqZ2_v0L{Z>qpo!&j%^HAdjavAp&Nv>p%RvxU5u z@j`)L$>pgM_(GMf(IN2Dcz);>_yaud&Jg$>oc!S0Ch*U>->(+<-CWLn0{;{9?+H8$ z7jw7{3j8dYPX9~O@m;Z8s|2{$Gd!xYhdT^J(zu@^{r@$RN-uDQ6 z70bUY@FhH-yesfvk}A&uiF3bbe@yq+m0T}cz#*x||Kn16hH?HH|1;ak1c9G~&Ldp2 z1zyYj;uiQKw)0AX-|HeZ(S481w^hjNd`}bj&D;*>3H&Cm?_~mCaFojTE`h(z>;6uG zr|^2QN8t5XV7Oiu_z&E_?+SbgufN|5{A(U>$!uS`9cJ*nJwo8uaycgooQr83C-5aa z|11%>*1uBVT7Qecwf@Zl_w%^ELEzfI{GGtR;dZ!R;03JbF@aBHdwWjcpYr_hhQQ<4 z4)+TjzU+;ze+v9do;MB)deu{Yj=_6Z7n&e5uUx&?k0muH*6U*i6{THv#Jyx%JDZZ78^ z1+L5Uh`@j1_W!%Uo5yoM3cTTHh4zgghFWqZ3v;6JfH@Q}b?;&J!1z%S%> zepTQTTq@u91wNnq_cMV{;_@FB_!MscIPQPl{&U$rQv_bd`bP>RJc#z``I6QOyKWwyFD-PBi#OP3jAfZ=Z^*6$oB9BwDsp)#2wa6KMp3H)ugbGN|tJhPE;EdP8<`7aUj zxAVfkL*PSs{=7@z>v*2oC2+kjeOlll_QPKj_->vDJ`niR+@AjtcsBRTPXhlFw*!7l zEM6FmTdck82aXi@WX2~8{Ar&5X9@g59zRtA-@xnpNdi|tA_0$61pY7PHwgSBZh!To zxv}!UfgK0e6+-?R9$$YF_=oIw?iTnI9xs0t_~qP=?+Sc2*Y`7lS93XY*sgUuAIszG zIDuc!{pA(-R34`*1iqi`zg6Ii_5M!ag;2x10>7Bs^I?I%#rmHU z`0v@?_6hu7Y!6=xJk0hM$McPDx3hU386@zBxjn}T+|T_oUErTGe~iHOBj{3rtDg-q zjHLq4;C5~jcn$j-A%Q0_zDeL2Ja1em@C$joUnlS{**_VcvBV$JGMw;&xai zaJ{bKR|(^#%kvcX%c%nY7q{E_0{@Zms|0=u=X;yLhp^q=FK{>e2~P+-z~kX%f#1OW zrO$74`G1a6_4!=L-^26Ue+6E^^Nf@IO|9o<-bV}<_&rL!ksQpW*gDEbvk;PduM@>V6r*{W3)0lNomj{8+}b1-^vwV+B5q>wCPwU+4a< z7x*z;&SrrR83A~o^#{@os{eh~8ZGcMFeA8T2>ks7h0hYW zlgHzHf!DB~;}*EyhnEOE%>7a>@Yh@_-x`5m&+GDXfuG2JxliD)@%U;M`0?CdH}-+w zCGa*r_xN)kxIP!u{Z-53Q9no0_(wc{z9aM;V*CSvn>^orD)2#!|4ZQG8UIS)dY$-Q z;0st@`%Su>Ud9u6->LBv7#|?;-!MK{;OiM5A@K7UA1m-H89z$kw=q6N;14i9L*QjR zu4f4xf4CN}`2v57aksz^FkT|?Zy7Hacp{Il8iDI|Xt}^o=5qQ3?qNLvf!8v=THuY0 zpDgetY*%XqzKZeF1m4N`W`Up1_!fb0WBek4U&r|60>6{-YX$xg)zg@@| zFn+hdPvY@@pTK|1^Z71;>wWTL0{Bn*txp^XGd4 z=jqMR@6qUXIGNY+gF^mQ_V@lH@bg_%eB&E|-^2V50$;`Zag+T5o$qY6&wc{GgXfWf z0^h^!JXGL6v7V6v|Carz@dEG1>&_&B>*s>g1U{MNa|J$!@i_u7VSItWmocu-QFJ@# z=YnNIel5#a3jAbV2kQiWCgUdv{8GmK06g$an}oc68kN`6?g}?!|w$C6OYF~2>iF~ z2R<39;JiN~*l{c&B+(Tpbvd_C()75E`;&tU?;jN5Ir!1en; z69lf`i=8a+RxWpzz;EGkG*jRYFg{P=lR6~pTYPNfiGfwnZR#j z{6vBOnej$}?`1qF@V6N66!>S1cME(f&$p)td>GIFX9)aDw*PYlekPB*Z2}*}_He1d zyLi31THxv@$Ke-n1l}}B%`>+O{A`}D?i9Fw-uXv?59R*-v%r)1oZ%6HpRKYro)oy7 z_bJZ`d>YS(FA2Ph^L<0$pL09EBXB402R{&a2IHR!d=caS68J9OcYG!AE|&jZ;1@7{ zMBsNYp1^*Jo(J|YK0x4i^L}cuz;`n~Lg244uKggb{}aZK67u@_;uL`=V?wxQ2z)%_ zvjm>UxPE@9^Yt+97VDeO<8h>)hiiMgR+*deTOqH{BYr3F z*SY+E5cmshw+~31`|B?PFW~Y&F7OAn|1WTp?fgZ7U&r?Ry1?&ddw56S^I89g0)LR_ z;e!HykN0t32>c4x|E<9FuP6U3@L6mR39L`I|6ZOSk_Enn{hy%%f0Ns7l)yvWFB1fg zKWdCurocCHd1eUw25yJh0)K+X^#XxE#PdLrz=!g>vsmDtaDA%<{s`A=xxm9bZ>|z} zF|W%l0)K$VZ->BtWc%zExIRxjRp2dbx0?m7`|o^#k6?bgz_)PwTqW={UI%vw++g|p z1wNYX_91~6@w~BH;0>zVji&{E8qc>c2weN?uL^t>ua9pDd^y|a$9>=j1)jv^*XJVI z{x$x+kZ)u=iD!RA%a3rWiX{oW0|nq3#yB?bF@z|h-v`lpZsGBnW09X{k=K5ZmcN(f zJr?=77WoRswfuaSidtj1pa%rpHBsT6Svz}0)LbJt0Mxxmdi7M z_usm{d)eNm3S77IEP)5Po!yM1{qPh?y|zlof5iIrb1IadO_GXq3wiy1?HLyRQ!Mi5 z3;EBuJXcucXIbQT2>D!YhdV9u(=GD%3;BBXCwE)qr&;8m74jjrt2Zq2Sr+;Ch5RGj zU;11G+h?jp{wpE>9^1nai~f9zyp!iS-M?3GebX36{WC4{V}<->JbtyGh4Oh8`8*+i z1COucEc)3crBo$C{(hdfYb^4)7X7UjJja5cEcE=y?Y7n;&rMIMuCmCp2@-y*z{@y~ z`vty{@m&@iAFX-W9-g$|sDCfZ@3r74&&4$KIjHWJ!>s3hA+OK74_a`ZdMJlO7991T z#O?p11;_GyPSWr@rCb1=Z!XV211vbo&&Q62YY^keVtXDy5UvRpdCXUTu3?%5M?F`w zo*WB~^7``*$5?QbpTnKD(1N4Tt0D}{VBkB8L)FPo_JY!LVi-Y=YG z!LdAdae1~_a4gRw?AKi-@Yy`RZWnkBPl|uE;HW>5=c@-TIO^ZY<9fFRNBKIIf69WR z{O4SrcP%)|-@@`ASa6iTf&1m3798cDVfimCILbG&UH#XBqrA!c2nYK|+D`N@jgMm- z`wQidXZgtj*WU+`Bk(I&{urTO|1xlaMIOgR4*cP@#DZhKe_=f<1g<{^*C_A-?Dw`Z zuIr_LdH5m=j$Os##tjx6O-KK__%5M;1t)ky;O8*@yukJ6TVEFX_3xAG?@PdPVtII2 z7zz5k1TZX*{*iGPNuZ;D^F@c8}-z)Gd8GljeU(Wi! zw&2|5kh@_VvEW#q1>DZlTo?=U7yKc9ChIA60RxxDZ(_X7MQ{|~&G>eKzsL9k0{<`L zZwq`RH{3yiPdE6QpzgXn+E>=+qZ(hq;?phix=%3bcngm8)!%D(9^+^~IM3h2jdzd0 zXL7qeCGfSp&OR$}{WRz5cro{2PHc zb31(B2X0JM`RjK33paLrANYyf|0s`t53%0AGHwE99Y^h~Pvd$%*PnydxSm%xa(Okb z=dm%|t{T_#$zKGnZDj?IGcB)bsmg|7U4D(D&ESRdXjl5Wi5ZEzSOBA~@=Wl4hA6BzQ!xzZfct3qJ zMs{OodprEzsFB?PKUR?qKXw5>R)IeZqOu9VZ}5chTetszTrN-|`w;amLIRf_|B6#% zUx)FI+XpnwMet|6_BAVRKie%HD_}lsHU_(i^c{7G^R%H70S#(Hiy|t3vepadKh*jE znjZI%sMESv1=i@|{3jq|xpet;ITk@&Z|S#ldS2F}8gx2+ujKT4+-kvlIlXQtjqCjN zePti%_i}n}ex0293K@+D`$+#Xr`O|FE6}{YpUUZVyuR!2ZAhA^5p~z~*63OY^kzRh zS1XCG5_L!W!8t|OTer)3fJvR0;^1VY@ElzjhLpV)WF&^^()qCF6P+P~a7o!K0PC&% znfH;nv0L2?EI)1?wK`q?I{}kAG0D$-*ph>c<&v_uL0oV7AK?6TddweRrIYzT1enwb zkde)YL%Wf&TvGN$h?5wK|C`fa^FP{uFUa;*{`C7%3-p7!QTyQ-k>!62Fw9@qlf{km z=Bm(bM{7jgby@ZOV}N^0pY2ofQU8k7=ydx2FHXk`L64);h!MTTl?ko(thXz==8c>d&?Vjzs&jX 127) { - signal = 127; - } - - if(signal < 0) { - planeColor = setColor(96, 96, 96); - } else { - if(MAGMA) { - planeColor = setColor(magma[signal][0], magma[signal][1], magma[signal][2]); - } else { - planeColor = setColor(parula[signal][0], parula[signal][1], parula[signal][2]); - } - } - - return planeColor; -} - -int screenDist(double d) { - - double scale_factor = (Modes.screen_width > Modes.screen_height) ? Modes.screen_width : Modes.screen_height; - - if(Modes.mapLogDist) { - return round(0.95 * scale_factor * 0.5 * log(1.0+fabs(d)) / log(1.0+Modes.maxDist)); - } else { - return round(0.95 * scale_factor * 0.5 * fabs(d) / Modes.maxDist); - } -} - -void pxFromLonLat(double *dx, double *dy, double lon, double lat) { - if(!lon || !lat) { - *dx = 0; - *dy = 0; - return; - } - - *dx = 6371.0 * (lon - Modes.fUserLon) * M_PI / 180.0f * cos(((lat + Modes.fUserLat)/2.0f) * M_PI / 180.0f); - *dy = 6371.0 * (lat - Modes.fUserLat) * M_PI / 180.0f; -} - - -void screenCoords(int *outX, int *outY, double dx, double dy) { - *outX = (Modes.screen_width>>1) + ((dx>0) ? 1 : -1) * screenDist(dx); - *outY = (Modes.screen_height * CENTEROFFSET) + ((dy>0) ? -1 : 1) * screenDist(dy); -} - -int outOfBounds(int x, int y) { - if(x < 0 || x >= Modes.screen_width || y < 0 || y >= Modes.screen_height ) { - return 1; - } else { - return 0; - } -} - -void drawPlaneOffMap(int x, int y, int *returnx, int *returny, SDL_Color planeColor) { - - double arrowWidth = 6.0 * Modes.screen_uiscale; - - float inx = x - (Modes.screen_width>>1); - float iny = y - Modes.screen_height * CENTEROFFSET; - - float outx, outy; - outx = inx; - outy = iny; - - if(abs(inx) > abs(y - (Modes.screen_height>>1)) * (float)(Modes.screen_width>>1) / (float)(Modes.screen_height * CENTEROFFSET)) { //left / right quadrants - outx = (Modes.screen_width>>1) * ((inx > 0) ? 1.0 : -1.0); - outy = (outx) * iny / (inx); - } else { // up / down quadrants - outy = Modes.screen_height * ((iny > 0) ? 1.0-CENTEROFFSET : -CENTEROFFSET ); - outx = (outy) * inx / (iny); - } - - // circleRGBA (game.renderer,(Modes.screen_width>>1) + outx, Modes.screen_height * CENTEROFFSET + outy,50,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - // thickLineRGBA(game.renderer,Modes.screen_width>>1,Modes.screen_height * CENTEROFFSET, (Modes.screen_width>>1) + outx, Modes.screen_height * CENTEROFFSET + outy,arrowWidth,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - - double inmag = sqrt(inx *inx + iny*iny); - double vec[3]; - vec[0] = inx / inmag; - vec[1] = iny /inmag; - vec[2] = 0; - - double up[] = {0,0,1}; - - double out[3]; - - CROSSVP(out,vec,up); - - int x1, x2, x3, y1, y2, y3; - - // arrow 1 - x1 = (Modes.screen_width>>1) + outx - 2.0 * arrowWidth * vec[0] + round(-arrowWidth*out[0]); - y1 = (Modes.screen_height * CENTEROFFSET) + outy - 2.0 * arrowWidth * vec[1] + round(-arrowWidth*out[1]); - x2 = (Modes.screen_width>>1) + outx - 2.0 * arrowWidth * vec[0] + round(arrowWidth*out[0]); - y2 = (Modes.screen_height * CENTEROFFSET) + outy - 2.0 * arrowWidth * vec[1] + round(arrowWidth*out[1]); - x3 = (Modes.screen_width>>1) + outx - arrowWidth * vec[0]; - y3 = (Modes.screen_height * CENTEROFFSET) + outy - arrowWidth * vec[1]; - filledTrigonRGBA(game.renderer, x1, y1, x2, y2, x3, y3, planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - - // arrow 2 - x1 = (Modes.screen_width>>1) + outx - 3.0 * arrowWidth * vec[0] + round(-arrowWidth*out[0]); - y1 = (Modes.screen_height * CENTEROFFSET) + outy - 3.0 * arrowWidth * vec[1] + round(-arrowWidth*out[1]); - x2 = (Modes.screen_width>>1) + outx - 3.0 * arrowWidth * vec[0] + round(arrowWidth*out[0]); - y2 = (Modes.screen_height * CENTEROFFSET) + outy - 3.0 * arrowWidth * vec[1] + round(arrowWidth*out[1]); - x3 = (Modes.screen_width>>1) + outx - 2.0 * arrowWidth * vec[0]; - y3 = (Modes.screen_height * CENTEROFFSET) + outy - 2.0 * arrowWidth * vec[1]; - filledTrigonRGBA(game.renderer, x1, y1, x2, y2, x3, y3, planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - - *returnx = x3; - *returny = y3; -} - -void drawPlaneHeading(int x, int y, double heading, SDL_Color planeColor) -{ - double body = 8.0 * Modes.screen_uiscale; - double wing = 6.0 * Modes.screen_uiscale; - double tail = 3.0 * Modes.screen_uiscale; - double bodyWidth = 2.0 * Modes.screen_uiscale; - - double vec[3]; - vec[0] = sin(heading * M_PI / 180); - vec[1] = -cos(heading * M_PI / 180); - vec[2] = 0; - - double up[] = {0,0,1}; - - double out[3]; - - CROSSVP(out,vec,up); - - int x1, x2, y1, y2; - - - // tempCenter - - // circleRGBA(game.renderer, x, y, 10, 255, 0, 0, 255); - - //body - x1 = x + round(-body*vec[0]); - y1 = y + round(-body*vec[1]); - x2 = x + round(body*vec[0]); - y2 = y + round(body*vec[1]); - - if(AA) { - aalineRGBA(game.renderer,x1,y1,x2,y2,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - aatrigonRGBA(game.renderer, x + round(-wing*.35*out[0]), y + round(-wing*.35*out[1]), x + round(wing*.35*out[0]), y + round(wing*.35*out[1]), x1, y1,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - aacircleRGBA(game.renderer, x2,y2,1,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - } else { - thickLineRGBA(game.renderer,x,y,x2,y2,bodyWidth,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - filledTrigonRGBA(game.renderer, x + round(-wing*.35*out[0]), y + round(-wing*.35*out[1]), x + round(wing*.35*out[0]), y + round(wing*.35*out[1]), x1, y1,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - filledCircleRGBA(game.renderer, x2,y2,Modes.screen_uiscale,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - } - - //wing - x1 = x + round(-wing*out[0]); - y1 = y + round(-wing*out[1]); - x2 = x + round(wing*out[0]); - y2 = y + round(wing*out[1]); - - if(AA) { - aatrigonRGBA(game.renderer, x1, y1, x2, y2, x+round(body*.35*vec[0]), y+round(body*.35*vec[1]),planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - } else { - filledTrigonRGBA(game.renderer, x1, y1, x2, y2, x+round(body*.35*vec[0]), y+round(body*.35*vec[1]),planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - } - - //tail - x1 = x + round(-body*.75*vec[0]) + round(-tail*out[0]); - y1 = y + round(-body*.75*vec[1]) + round(-tail*out[1]); - x2 = x + round(-body*.75*vec[0]) + round(tail*out[0]); - y2 = y + round(-body*.75*vec[1]) + round(tail*out[1]); - - if(AA) { - aatrigonRGBA (game.renderer, x1, y1, x2, y2, x+round(-body*.5*vec[0]), y+round(-body*.5*vec[1]),planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - } else { - filledTrigonRGBA (game.renderer, x1, y1, x2, y2, x+round(-body*.5*vec[0]), y+round(-body*.5*vec[1]),planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - } -} - -void drawPlane(int x, int y, SDL_Color planeColor) -{ - int length = 3.0; - - rectangleRGBA (game.renderer, x - length, y - length, x+length, y + length, planeColor.r, planeColor.g, planeColor.b, SDL_ALPHA_OPAQUE); -} - - -void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSeen, int idx) { - - int currentIdx, prevIdx; - - int currentX, currentY, prevX, prevY; - - time_t now = time(NULL); - - for(int i=0; i < (MODES_INTERACTIVE_TRAIL_LENGTH - 1); i++) { - currentIdx = (idx - i) % MODES_INTERACTIVE_TRAIL_LENGTH; - currentIdx = currentIdx < 0 ? currentIdx + MODES_INTERACTIVE_TRAIL_LENGTH : currentIdx; - prevIdx = (idx - (i + 1)) % MODES_INTERACTIVE_TRAIL_LENGTH; - prevIdx = prevIdx < 0 ? prevIdx + MODES_INTERACTIVE_TRAIL_LENGTH : prevIdx; - - if(oldDx[currentIdx] == 0 || oldDy[currentIdx] == 0) { - continue; - } - - if(oldDx[prevIdx] == 0 || oldDy[prevIdx] == 0) { - continue; - } - - double dx, dy; - - pxFromLonLat(&dx, &dy, oldDx[currentIdx], oldDy[currentIdx]); - - screenCoords(¤tX, ¤tY, dx, dy); - - pxFromLonLat(&dx, &dy, oldDx[prevIdx], oldDy[prevIdx]); - - screenCoords(&prevX, &prevY, dx, dy); - - if(outOfBounds(currentX,currentY)) { - return; - } - - if(outOfBounds(prevX,prevY)) { - return; - } - - double age = pow(1.0 - (double)(now - oldSeen[currentIdx]) / MODES_INTERACTIVE_TRAIL_TTL, 2.2); - - if(age < 0) { - age = 0; - } - - uint8_t colorVal = (uint8_t)floor(255.0 * age); - - if(AA) { - aalineRGBA(game.renderer, prevX, prevY, currentX, currentY,colorVal, colorVal, colorVal, SDL_ALPHA_OPAQUE); - } else { - //thickLineRGBA(game.renderer, prevX, prevY, currentX, currentY, 2, colorVal, colorVal, colorVal, SDL_ALPHA_OPAQUE); - thickLineRGBA(game.renderer, prevX, prevY, currentX, currentY, 4 * Modes.screen_uiscale, colorVal, colorVal, colorVal, 127); - } - - //tick marks - - double vec[3]; - vec[0] = sin(oldHeading[currentIdx] * M_PI / 180); - vec[1] = -cos(oldHeading[currentIdx] * M_PI / 180); - vec[2] = 0; - - double up[] = {0,0,1}; - - double out[3]; - - CROSSVP(out,vec,up); - - - int x1, y1, x2, y2; - - int cross_size = 8 * Modes.screen_uiscale; - - //forward cross - x1 = currentX + round(-cross_size*vec[0]); - y1 = currentY + round(-cross_size*vec[1]); - x2 = currentX + round(cross_size*vec[0]); - y2 = currentY + round(cross_size*vec[1]); - - lineRGBA(game.renderer,x1,y1,x2,y2,colorVal,colorVal,colorVal,127); - - //side cross - x1 = currentX + round(-cross_size*out[0]); - y1 = currentY + round(-cross_size*out[1]); - x2 = currentX + round(cross_size*out[0]); - y2 = currentY + round(cross_size*out[1]); - - lineRGBA(game.renderer,x1,y1,x2,y2,colorVal,colorVal,colorVal,127); - } -} - -void drawGrid() -{ - int p1km = screenDist(1.0); - int p10km = screenDist(10.0); - int p100km = screenDist(100.0); - - //hlineRGBA (game.renderer, (Modes.screen_width>>1) - p100km, (Modes.screen_width>>1) + p100km, Modes.screen_height * CENTEROFFSET, grey.r, grey.g, grey.b, SDL_ALPHA_OPAQUE); - //vlineRGBA (game.renderer, Modes.screen_width>>1, (Modes.screen_height * CENTEROFFSET) - p100km, (Modes.screen_height * CENTEROFFSET) + p100km, grey.r, grey.g, grey.b, SDL_ALPHA_OPAQUE); - - if(AA) { - aacircleRGBA (game.renderer, Modes.screen_width>>1, Modes.screen_height>>1, p1km, pink.r, pink.g, pink.b, 255); - aacircleRGBA (game.renderer, Modes.screen_width>>1, Modes.screen_height>>1, p10km, pink.r, pink.g, pink.b, 195); - aacircleRGBA (game.renderer, Modes.screen_width>>1, Modes.screen_height>>1, p100km, pink.r, pink.g, pink.b, 127); - } else { - circleRGBA (game.renderer, Modes.screen_width>>1, Modes.screen_height * CENTEROFFSET, p1km, pink.r, pink.g, pink.b, 255); - circleRGBA (game.renderer, Modes.screen_width>>1, Modes.screen_height * CENTEROFFSET, p10km, pink.r, pink.g, pink.b, 195); - circleRGBA (game.renderer, Modes.screen_width>>1, Modes.screen_height * CENTEROFFSET, p100km, pink.r, pink.g, pink.b, 127); - } - - drawString("1km", (Modes.screen_width>>1) + (0.707 * p1km) + 5, (Modes.screen_height * CENTEROFFSET) + (0.707 * p1km) + 5, game.mapFont, pink); - drawString("10km", (Modes.screen_width>>1) + (0.707 * p10km) + 5, (Modes.screen_height * CENTEROFFSET) + (0.707 * p10km) + 5, game.mapFont, pink); - drawString("100km", (Modes.screen_width>>1) + (0.707 * p100km) + 5, (Modes.screen_height * CENTEROFFSET) + (0.707 * p100km) + 5, game.mapFont, pink); -} - -void drawGeography() { - int x1, y1, x2, y2; - - for(int i=1; iseen) < Modes.interactive_display_ttl) { - if (a->bFlags & MODES_ACFLAGS_LATLON_VALID) { - - unsigned char * pSig = a->signalLevel; - unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] + - pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 3; - - drawTrail(a->oldDx, a->oldDy, a->oldHeading, a->oldSeen, a->oldIdx); - - int colorIdx; - if((int)(now - a->seen) > MODES_INTERACTIVE_DISPLAY_ACTIVE) { - colorIdx = -1; - } else { - colorIdx = signalAverage; - } - - SDL_Color planeColor = signalToColor(colorIdx); - int x, y; - //screenCoords(&x, &y, a->dx, a->dy); - - double dx, dy; - pxFromLonLat(&dx, &dy, a->lon, a->lat); - screenCoords(&x, &y, dx, dy); - - if(outOfBounds(x,y)) { - int outx, outy; - drawPlaneOffMap(x, y, &outx, &outy, planeColor); - - drawStringBG(a->flight, outx + 5, outy + game.mapFontHeight, game.mapBoldFont, white, black); - - char alt[10] = " "; - snprintf(alt,10,"%dm", a->altitude); - drawStringBG(alt, outx + 5, outy + 2*game.mapFontHeight, game.mapFont, grey, black); - - char speed[10] = " "; - snprintf(speed,10,"%dkm/h", a->speed); - drawStringBG(speed, outx + 5, outy + 3*game.mapFontHeight, game.mapFont, grey, black); - - // continue; - } - - - if(a->created == 0) { - a->created = mstime(); - } - - double age_ms = (double)(mstime() - a->created); - if(age_ms < 500) { - circleRGBA(game.renderer, x, y, 500 - age_ms, 255,255, 255, (uint8_t)(255.0 * age_ms / 500.0)); - } else { - if(MODES_ACFLAGS_HEADING_VALID) { - drawPlaneHeading(x, y,a->track, planeColor); - - //char flight[11] = " "; - //snprintf(flight,11," %s ", a->flight); - //drawStringBG(flight, x, y + game.mapFontHeight, game.mapBoldFont, black, planeColor); - drawStringBG(a->flight, x + 5, y + game.mapFontHeight, game.mapBoldFont, white, black); - - char alt[10] = " "; - snprintf(alt,10,"%dm", a->altitude); - drawStringBG(alt, x + 5, y + 2*game.mapFontHeight, game.mapFont, grey, black); - - char speed[10] = " "; - snprintf(speed,10,"%dkm/h", a->speed); - drawStringBG(speed, x + 5, y + 3*game.mapFontHeight, game.mapFont, grey, black); - - lineRGBA(game.renderer, x, y, x, y + 4*game.mapFontHeight, grey.r, grey.g, grey.b, SDL_ALPHA_OPAQUE); - } else { - drawPlane(x, y, planeColor); - } - } - } - } - a = a->next; - } - - // int mx, my; - // SDL_GetMouseState(&mx, &my); - // mx /= Modes.screen_upscale; - // my /= Modes.screen_upscale; - - // char mousepos[10] = " "; - // snprintf(mousepos,10,"%d %d", mx, my); - - // int outx, outy; - // drawPlaneOffMap(mx, my, &outx, &outy, white); - - - // char linepos[10] = " "; - // snprintf(linepos,10,"%2.2f %2.2f", outx, outy); - // int shiftedx, shiftedy; - // if(outx > (Modes.screen_width>>1)) { - // shiftedx = outx - 5 * game.mapFontHeight; - // } else { - // shiftedx = outx + game.mapFontHeight; - // } - - // if(outy > (Modes.screen_height>>1)) { - // shiftedy = outy - game.mapFontHeight; - // } else { - // shiftedy = outy + game.mapFontHeight; - // } - - - // drawStringBG(linepos, shiftedx, shiftedy, game.mapBoldFont, white, black); - - // // drawPlane(mx, my, signalToColor(100)); - // drawStringBG(mousepos, mx + 5, my - game.mapFontHeight, game.mapBoldFont, white, black); - -} - -// void initializeMap(short *screen_x, short *screen_y) { -// int out_x, out_y; -// for(int i=0; i= Modes.screen_width) { -// // out_x = Modes.screen_width; -// // } - -// // if(out_y >= Modes.screen_height) { -// // out_y = Modes.screen_height; -// // } - -// screen_x[i] = out_x; -// screen_y[i] = out_y; -// } -// } - - diff --git a/maps.o.REMOVED.git-id b/maps.o.REMOVED.git-id deleted file mode 100644 index da9ee88..0000000 --- a/maps.o.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -2ace4751610e844ddd57046a819bd5e045a690f3 \ No newline at end of file diff --git a/mode_ac.o b/mode_ac.o index e4be1626484ebb053966672f0864039a37e288cd..e0ad49b2ed31b6b42466dc27961bcad5c3478386 100644 GIT binary patch literal 36024 zcmeHQ33yahvOYK62@MJ9K(mBJ2zwB+vPMzTkc6NhQG$YsO{cq)^q6#qURcy2C?G@# z+u(=}V;G+^>eEqYhEbm4$l@rj1Fkqaipz6D=i!F9jJ&Ekb#C9BWSp7k`@T2dm-~_K z`u|g>PMtb+>fXL|ZW>Exl_eR5P=_JT773(SAttX)$i*ZUi$0>aaNgh7dH8%+dcXVXufFXf#ERXAziPH$kBaW5=SqqWHQqM8d0^ANx00HU-1x

$C9G=U^aV;_B(g%b2|>klZ#h>6mx*f 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 Pe+T=&-K;4Ez5f3LdE?iA diff --git a/mode_s.o.REMOVED.git-id b/mode_s.o.REMOVED.git-id index d25222c..85c6f4e 100644 --- a/mode_s.o.REMOVED.git-id +++ b/mode_s.o.REMOVED.git-id @@ -1 +1 @@ -a3e48b2319025f5869b2710bf017dfcb96c1fb89 \ No newline at end of file +7d25253c93eb99094372df3b61630599ce0cb4ff \ No newline at end of file diff --git a/monokai.o b/monokai.o index 841bfa3a41dfd45b0e0b61f13fe3376d1c9a2e03..11cca7559b595a201997a274e49699b6941ee3b3 100644 GIT binary patch literal 26192 zcmbuH3w)F1)xh7hr4(99q1*(-ilU&lrKK$u1)8Qw8=59DNuhWPX`8muG^t5iit|3F zctfVnA)h*QiVk;i&fA=G&ikAnL&qFW=MYb8rW!eR@pdU{i%*6w&)7lua3hSrp*ivTrfS z!jg#?DYTT(tw6+NG!z?{076TCeM;zr>oXW&hRKf42hB`W+mhAUL~3k=Uu;V&^< zrNRd>ym&GQqtLKmWT}c+DAKGV1r%vfks^w8sK^A0cvYmBB0VZnVu?WsH>k*DO9~=G zDpF>_0*|Oj1w~RSGTm}9JQ-J!S(YYYCU_DC3oD91D!ZRF zr!yU#+n)~38-rkB5$P3{(2eq({2p}%lo-l<%O=QP1s}K+g3~7!tpr}yPz5hkqKc9h z3Kx(pBw0jq0?A^M6G@hkoJ4Xm$|9Kw#0HjG^R0g&?q~Of|i-RM%nQcESMQG%1)qQp)m{J zEUUI)=F|;SPCW&JWU$304hV9Ol%HUQ@sd@(|DgTptum5RNS2eFO0t6FG?LRvR+5}S zawf@HBxjSHL-H_^b4ku4IiKX=Bo~l8f@BrRBS|hKc@)W`NiHIJ49R0jE+)BzCBpXRKkz7u)ndFHiSCBl3CJ=M)G!& z-zIqn$$LrukmP+Ne?;fnB!5QoagskL`2@)) zNj^pLX_C*7e3s;MB!5Bjd6K^*`2xxRCb^sBuSo78`69`eNdB7SUXs5d`7+7hlH5n~ z6_URr`6|iRNdBJW8zkQ(xu4`)B;O|aN0RT5{L^f7mKF=$3e>Go-HOz0g1Qx}+eCFM zQMXCzHd)Pg{Gdj?cli zn{Ig+;*)S{qN}*%HVCUn1?EQz7UqLRxB$r{LhHA!mBmd{c+FN>vKHnowSKFdgjlWL zDkq-|VYQ5|ENg|ZT1Hn+!LV9JSC(UVF|7kDD=@rNg{NV-S%oXH04*v!1H)}9JQKqm zDm)9rE)|}QVXq3$!Eiu@=V7=Z=MGU7?mqA+)<<=t1wbhq9UtrgUEBGD$;`M z&dpO*#Ck16wsNEu3$l$PZ9jx}c1%?Z`g0&m%Y2B}f)dt>;uDQBEE#5&9mo7AzR@Vd zT3}inFD@B^hE;9cjy%)G^A}e-4~K=as@fV%n8TeIE>YZtrDRj?!Z0_r8+F*MJqsb3 zD!rD&G*yP)7fcxvoKc8N$4n^{EXoHbzM}M`Qd~b39&MDCu7YP^)Eop~Ghr%F7&drA zt%=7Ncq^&26qc8k;=AZHCrwEw)C}5_IXb~viP2J>4XnK_7H1{CG37`|rxqTTSHi0& z!%&;rpwfVsRv(6-f&t{Kz_cTw=cgB0R+VB|bl#PV;l25g(u{POCSVRTp%5jY#D$o} zg@CAG%%*q11m?&&sEOq(dZ(*N!F=wb4j#?O!F~I#02F1Z}Dn615_Qez7Od_#V z^(dS|#S|G1rG}I;6eNh5#QGo(9f0wX$apxK%*4kc{b4K*KTh_AVtw&`Oq|JZIGGF$ zhI`}V8I}mg`ooD#Je9(V!VANpk^WFB1QEEBsl;es3iE<%I3A0i9g3)k0bY8r3J=ak zqM;bHAC}B-v$}1bHha*%#%>FkQKvWPb#?pA&}Q}eT^?Jf5gQ%$=1Ip&O1Pw+oITTN%dPfK7Q6M~?8cl=^fE!)VO-9h^2}a|6 zX9rXC+-tRU+S@$7HoGs_<7;n~>D8NoDv-6yYxnuB?l$v7r#oQxxvc@G$8B|ql9`@0 znBTK`y1d=+Dw-r1nfamV#U?5~)GY`d45m6blxk0eH_;oaCNArGPj?{L43`0h2>+Xt zg9`XT({6M_?=Gu1l99n!DC!E2g`*T63=LBr8xxUKm~x3h3mX1ZC^f3gU|l5EAKz$f z3P+=G3l2m>gX%%rKKucX*PN@>7R-gMK4*JJz-{;Y+dS*soRVtqE`Zi{d#k4>X!E!{ zzF=#2AmDKaTdAXrU_9C%j1LSX!=iRx&pK#EW&L5%kT#bc?1zklEZbz#ZFZMEU^f@q z4i)m+jbvXU9F7Ht!r0nIUpSTuCtR?giH3T^QAa$M>QGMxMx#-sYfh%k>Gwjf_}4iD zwhr?n=!`CVmnxX4INk0xk1-O7oo&|lTD$#r==Nj^^EE$nIN2Occ2Hlp6#v6#)0oc|ZnBmkM8C?QU~=eD-x%E$D$z3d)9Kw?0^>d}h#Ge;7nvRs-GavU(od z=}P)tc6+`oalpk#Q#2NuDfMJ%Oj*6D#4fA5eK`)NoYCn4M_?`o)Wv>Ex7Fph`Ws}O z;90BFZS}3sc?GT9okOjG9MopFIlHVbGjBFWsp;JIo`7=W^mla+&U<|upFJNkD zYrECy&Yo@I5$JutZ= z=qF(|I3%#&XihTKliZ>*2;^3u52iMnr(4^7MsPTkI6It38hz1tGHeS)qcncOQS=9U zLrGz^JZk)QuhmD!XUfS7Q%!fSe`s^Ab+&>3#|4_Xxw>GsHWO$-(XG@_4y!-l@c7nQ zePXEq`d}4mYRz6+L37Zohz4f|b3uRB)Byer%-`8RZUjf-VzO=bS=Zv6Fs7<(YHsEH z)s&ichLDBF7LYDvtp|K{PAjP1hS^Kh)&(YLg{jEYjF51Xk>d4MX2MB?Vf(L(mo9~m zypDXo!`@@f>){}6VX{ETLhSAU_|teI6dM$sZuSSZcr>n71n%yx^jg+0s=$+0z|-FD z%B`MSUW6ivzC>t1EhTw60>>ieBQU7oFf7!yFZAh=l4$~ehtnZ^iWdwfz2w*!=}!%j zSu10wvZ@YN1Hph<^oK99FUHJ{hnV|NACd+kA($n8C9kOn=saxk~KG1=T@iXRq!c{Vd(RWPxK#s>Y7!OTi;9d(GQ!68+(@-R`m+#0|#!RZk` zz;Ewzs(C-Xlr&d_Mqlo_8L~X&jwtOsaJItbl3K^-dPHB=+5mhEEb2zX^a2|+EQ^B1 zMzz%E6>xue1kBM?Pgp%__r^-2BZpix`0OzIyNp4-VM!Y%TBSK%HI2i93kqO<0+r9~ zzA{dxFFq<4#Gu*kvsn#|?E9S!U!ctxKz zA}H-pG!;qVfrhEIygrzN{WhOnjz4=3n4wuW(BbLE9i~4sXVE$i)~hfxQ&086GJJGI z&2}(7_+gi#YMLH$-R@2|ZmmqE2w24?*WP1?WsvlC>z`C*=6;03Ky;G1jZ3c45|v# z9-eo;b&ZXUMlfA2wcj(Xe)UO5pSfsVc6Ya#ba=W%t3c;@TrN7(FjWhROUkuF@!@c7 z3{H5Gqy3@U!APn$ITGnlz}EU)I4&|L4{agV3_!4*^KW9{;j)|rgy$A}D3N?Uy`E*O zIp-Y>aF)gU1X_5TDk(+)o(6%{!WcvY;7zdUg%in4X-h>82>lT)(D3lWq-ixr)nX)f z=V&vl34bd3%3)S+H%H|r!TfZMIofHCilN$Nekz8W$NW?*Gfy!;)te~TYtuf;)JS3= zh><01cda?$b>^sAnx{vbSl*pV${7!+T&LPjWV=yVeW;GhhCR3@8K9#nbDmvRr)sz? z15BroF3P%fs;HUVmH*}3)2>Zr30|4)PZgOQL3)$WL(2qOJ`ab++wk-c8&ti@?xL{? zyak+djYSf$8QnMpr(U^A%iy5Q)D?%=ve1N0n*%g;htp*bjzrG)KYGTZSsz@-)yX&-_M3sYJ)U(Q75v$}*OgQIi7`5#pZ z+b~~)bVH8}MB`9(Q~K~~p3^i}o`p7O!lKsNCVU93pE6DmD-cZTv*fgq`q%q?b}@A6 z2%-Z|AKKmBRkpgis^v8eHA}0ihf|}m@XEn396m()AR0>a4XuRFK&qP>s;UR8sy+2p z)dR^COy<=iiFhj9mx?E<;bF@w^K!t^tu%0b9wn!{I@Mg+E&>wlfvUqvIlG?Rn)A83xdAfWDwn;E zx@P*A01gs!7YLc9sw}g;$L6wj86%^Kkvs>AqK>W{kI-drbHZ^$?oJIp>d0vyWgyx8 z(y&Z^uG9q|W97UkOdL8Xd&<-EMPs8HYKLk{RZM%EVa;-|=>~;FbInPt$3aIdbbtsy z1thlu4uf|Grsjv^4qUM2@r#Z+;Wc1`B2OC~b<%Ux<%~d>LBSa0A(^9Yx&E|79`o8f zUa{oJ8d2%C!aV@krMaK*C|;Brk#Kj2M7a@(k|Pp+50P?xKKck%eu#w6h3i9<>x0tA z7s0;K1biGE9UWG?vvl>ymBakq0Y{b*>Fc3?`N$wR8XHZ9VgF_7RQ22j#}ql7rZ9EL zLqng|KSsOFwxVircQ0&{N7c+!T{lXxx(n)>YnC?D)GbjQKMc-$!RO@gY4_jo?>cfW z_@jj!hM90=G z&kNPx8KmPFfG3}4Y9uH*VXlR16WElVH2zJ%%MoVEVZ%;_8bS^7(u z)Az-*_%i17t)DEuf;oO~123Jv6~dTr6+*Z)Z-+2)%pWh!T@XgTm}rLknV%qd5Alx< zRx#J_1)1x1(DwnMzm?yMG1ukL_X`e@&XtGYHy(ngzw*!rpBVS^+FyORnLZn$!>Y{Z z?0n43pM9%!7@eH)%%(oFRiBmfHz)Ku8y3*~39LG+%EUL}9)O>XXN42`;2g@2mmUFV z!8(jw+YfU5e%Z2&7LRdKXOyfk-nh1M&a=CAM&4GaDiE>A*m zjv5;Uzl^@L2Y>Y>_%FG^t`Yp1!xh*j_#Pgh-xK@_?#zb-zm(hINx_$Jy?!P5Bj}jm zdR5)h?a)14fjxq1%Dd8+=!QU^tzqbaQREw)ocC*$L9$C1MZhag5SjPdcoVd zoT~+gZ*bD(68vL!2A z_)k=|jGqfWpZk5c;M>_wUKM;Dm;YVC%Q)YE2wus&fa{_AaW3iZECU^_m;ZDJCWc#^K@K4zO9}|2L zm-9D*mvX*u2>vHd|IdPtaesUw_)FZs(|Bp5+w*+p3j}|Q%XyUGck_g>RPblv`+s;f z3jSAKP_zqvJNLU!@UOvFYVkTl@EM%`kl;^qeMbeqfyec^g74t+e@*a*xjnZE{w$aO z7Qye}add~^57GC=4dXk4>v8gc;2&_lj|;w^>$Okthq+#_3vTCny)F2u%-aRO9^XV7dzvV*z8g9=Sf}h9ZYp&occz&!A zd=c{o!GFs0`wGD?=kmJ+-_7L=2>wUaJjSVlKgjuR5d3;B|A641a=uZ)kK=Yr2!0>) zalvn7zj1-!Gg<#S!H;MA*(UgJdEIiW-~(K*I|P59>$OYpEj&NoD|io==Rv^_V>^6a za0jQeNANE=otFh)$oBJ^;NM|CvtMxammh}luHgGPeLXIp~=Z{~Db1>eQx=@5K3`$MclX7aX%alhc-=JG!x_>Y)BF8GtopAr1m%wG`vE#`XNt;f;dneP+&g}fek zUGPfgZwr1D^Y;Zmm*?vb1>eW((oY1xll4Cryo2pf{SZ!O{Wh8HU;SK8hF`(+U^(v> zb$uV>bY}?uFP^973jPMq`&EL!#pCE0!Ry%`P7wTZZs&Tz|IF)zX2CbG{j3svE$=tm z1aD-2vPSU7xShR%f6Vn-D|j8Jf4bn$@ObGJ{3y2PA;CXn{g~kExW7_@N0^^0_+`v5 z68s)sKVK&JHrBsd@MGC;TqpS3oX$4EKVg2W;OYl}4C4;L&tUysf+x8>?-gA8kp~6e z&+$hE-^KR!gy7{oUY-;DbME)uf=^*TyjSoA%zr2N0Z#u7!JAnB9l=Yv9sVNt&FmjO z61<1)=U;+Hn13nw0p>+)zj|EX#C)>gyO>u9{s;Cavjq3BpPw)IJM1483jP|~`C`GB za(~qbeir+m2Eh~TuT}{DD(klhehRn0-k0chIGg=|OX%Op>H7qq#`9f|;BPZOQ}AKf-mO%&Lx7kG2blsnVgQ^|LOKQpY?AL`de6E z{l->i9?|1@htPk9^>+$>HTTPR1^*WF`vkv_`NM)g&HORJ_c4D;@INzuUU0qN+aq`> z`=yr!U%>n|!KYyZ!nI#=p4Z+Ld=}fu2ZBGt<3i6rx?kR7e|13UC)jW3k2tmdV)iq| zY^R!UXI>`wJhsE>f@}LzKSYq}_cc5(FA(}6_8UhFzL)*Rae{}KtKa6xq@Ut+nuPun zT>p~=U&MZ(RdDsYL;ANoGU-3de!wmC@8SMczw43Fzl#0*sY3s3j&BgWll|d<;HPu> z)o)^C((mN{O$hxnn5*CZ$mqwJUm)}^W`3#Q*E7FT@H?4r6u${jk_$l1KFA4qv`@?;L z>vNgc1z*kMOV1B_-0A)H`$FH!_5D!r^*kSaBKTfz&(8(dAJ7+IhH&Y8<2?VC2!4?J zv0U))u|Jt1_%6ak*B=B=vfqA3@O7NdUj^^s@$#|Yt2q771b?67 z1#Cwc#ja}Pd2o{8A9MRu2+qYcW()pvPG^DON3lKV&n_| zUytCgaQk!%UdI(UP4KU9JBI}SHT&m5!58rSH7s~FkC&9-U$XsNcnE%};7_A7h3ncw z@EZhQ%=P+~;6G!2hu~JWhkKdhFwx(!!F+!v^#8{G;g?zZJoTcwu~+EtVLN;yOP`y7 z^xqTuJ9!-aBTJu~nDoCC`Zj(zndcd8SH+ypEWv-u{ku@`6S*B~1mDGeW`*Ee*v~iw zznSan6MQx6pDB1u@5=-~i~Z!7;K%X0{Sv{aa5`HA*Pq947yK{WK05_}l=Hn$@E57| z4dXGvr}4b=yx@Dd-Ch>Fp7Y%=_!n$f9|(@W3W(PM!SM%)@hawe>wcfY=}#AY8S5_) zyq%5lIKdBNeW&2s-U5Q}=XTq`9LEt)X;jXL(0`Ww(wN{IIh{)cU(M~gMez4{UfV8s zC%4;9!B?|CzfbUwxxSAHet`M&f*-~H?PbAZ>}L)L-pBT@$EEJCyScuV+;5r>u~VrM z{9Z19wcuaZ^Mc@8cphmN{9e`%2wuwm;bFm9-FS*QHakxV)W5$G`g)waDY&-RzY6ZA zR1D)&!9U}34EU`$x^(;K@ik5GUED7V1jiq7!)uA)63;kO-^DDB_=b=LS*9rZFT;E%> z^!X!6(!WdStDk^3j2~s`vkNBuM}_{KJRYCR(&wcl>AxuSPvidneU?5CA<}wC`hAPTZ(T zZW@NauZDXnq3%OEgg?(=)ZkCR88yAhq)~%kGOpJ?UGd&K` zPi(*|N&|krFRa6mx>3^?A0CDu$1-YS@JDPl@JDd)M{M{*QUC7?mm64jU0{1?2n30>&XO-yae0>8O0a4jxE`y88VU-0z2a{{(n|Ce@-9 z_`a=C1u9ShF0>icV|SGHDJy~H%YPT=8xs#j)bJkS{W&}+tKfO|CExFahxy8XcSyaZ zeIJ$|U9T)Z{@s8~6W`RI|LgM_WOzwkG(lub@nP0g#N%#H_F@{I>-Y72jG26YFLo?k z-25s6QopC~7iO`v5(er`v2;Ygrvb*qZ*nh~x9dFf54E+9Y6T3+5(<4$7_e?j8QjTBF*-T@%h!S;oyt0&} zvwX7hI34ADE787Efn^G^cFE!OO08s)BBiC1h7%bHSayO6DCYpJdPS0mc79ViCzY3# zU#FBDoZe*R=ImZ^eq2L(Q^;>PKRH$1wEMFw$yu)5pDTBjc7LJV^R)X*<*w203FTfo zm4x9m9Lm$6Jr4G)(w-9bv}jK$dpfjd5_2o{aWXJ2p|s7VVkqSV^99wdWv58+p#xo_UTKrFMb#EOKPXvt4@*cbrFRS7}eJ z;|lWZ(4IQ>?9!fk_S~sG4eZ&iJxz{-Db7RMvz*KJxc01YY@>Yk7!?$5IB(!?nCIN3 zDyf_DR^=4;ZK}G`4R@&8RvBgGM-nS5-$lM@sv}jgrz=ZRRP`p)%Pcy}s8m5SlyIKt zP+YrP^4u8^DR59GlqxmJy!9ltb3sf6mU5u8 zoNt`bly|w=S!wFcy_BbRKG09j>dB=iP_&BXe~@PuxkNhHUBc4IvXtc{mSrp_vn*#h zh2>P171>nH*;EW>T1u+f@Xp?%;T+@t$TgeBsaO3=X=LLKzxXf3<1$H&joGT5N-K_Z zRMKQKCuLMDb8M&fGv*8$6-TktF{jU{IGUX$bD~DYG3<02b5+cWT8GMoWpW1%Y#_XV>zGY z0+tI|E@F8w%f&1YVOhiSP?m?W{0hq@EDvXS1j{2?E@iolsdCi zY-HKQayiRpmMd7UWO*#hRV0;T+(#^7srODF6vYllI zOE1fHEZ4L2vFv2o#nR6*!15%PL6#wwVV2!2H?Zts*~@Yx%ad7tmE|ccPi1);%LvQU zSw>m*vFv9VV;N^Tz;ck~5X)hfXRthz%jZ}=&+-M9ds+UD<%=v|V)-)5|6utF%iptnmE~(JUuXFT zmT$8BBg?l~zRmJaEdR{%9hU!fkeVzV4!)J>n^WIP^=*>AmFe4LeJj_uDf%{5-zxNN zn!Zifw@Q7Rp>I|CHdEiK^=+2E&DOU$`ZibJ4$`-I`ZizR7U9bh0dEIY}=TGqwdupBD>WJZ7BRXY*HWNLl`Qs_kYvt|0#uwKVZn zRz6N{9aLfu($HB9ma1JxE)m|T^;VZ%Ognkrsa2OBrS{y~Jw;)?Q>&hO1-bQxxq8|) zgmc|qxCD5d#QF;DR+Z*&s6SJ+C57Zphdf9D|efA&r$9U?VhXLKJ7k8xdYlg zPr1Xi%~CC0R^G#MkR&%?_52se$#t(@xPx-cRg>W?r&{3=mKKAPiovpCaB?wNUJOnt z2B#K-6~*ARVsN@0&QHZ-#;i&^G#oP>hgZ(3a8@p?tfJvpGS_fcuC6$~LM?O7B}PTX zS_-2rkT}UCCe0v9Ev#-zYw{6>x|PpzI4dhER9t1-Q>JGVT1DDZ#XHG6OL;4-Y-lg- zaCm2_7}F1>bm}Rvau!8hGoN~$#maluQi`{T zQktDD(-D^&`W5^@IKW^;=f0jI3;~9T`rHZ>b$jjMpDqKb+_v z8IQ#c))P;mUf*ygZBwy%>O*b5Cc{W)VzKx@-HA|^7m<8&fVXfhhj3~6P`Jfad#^pl_V zzREu~yd^%O@)!T6;aFUiLA>eyXrezEQ;7>1ji=Mm!FXSCOOB=DiC8?9^Jg-uaui`S zIu?s&qU50~ok@-NXH;HvjV2SxGo!=WV~ivdgEi_Qf+|wT?do#-+suf$&UA6GU)fKb{dzzLbXf`70p=2u4H$K2Y z;rN!!cq(p0y#B~Yvj5D8u0g=%UT?PfgKcIo(i?1V#blc7K$pYS88Cw(S67=o(AyO@ zgI%t$*WcyxL4j;x&GvY1e`lbZqAFt}^RWloBCh1(QIC#fq`@!>JsqxP@`#!jzhD#eI^+RTR^rhIcp_Xz%)jpeen@bl59Ea z>WHg0wO6Oj8wyafhI+hVcZWTQTC>ya)Op#)Lw8r3-xwQCoN3n&xVl4>FHH)Ztu2bj zEB0jT$fm{y^`9D^fg}yPbVT=dwl37zLDLg7Lq&@g>TV4OT{JZNMxy;tm`-mO4$t+i zZC;*{Xv`h#YVs!BJNc6k%qS5u@>&t?&ObCBV8x(qb| zE^m_Yn5|dHXPU)wRD&crp5f$Iaq8*lCT+a70{dKD?Z>JiP%xtWG<#M)mS@?5!I*6vpF14% z<=Mm*dt%xwX$%HUqdhtrw}-mBgF&;)y|KH?8#ZK(C^Sc!X5HOB7o}m3O=F(JNMtM;``=Vo*z=~A>c!TxC4H=2-xdbu zVGBFX9?umB_-IvB%MJvn(HIDt8yFYNvYoD84zSHP)ETBd6*T}<=kTgw8)7`~>0Vdd z6%5ki!z*cPd(eoCMpI|TQ?Oe2T)r@m+EhFmi}Xd)V4N~mLM9nlq45Q1ndmN@723QT zylu3ksST68@SU`-+6lE5^dS#Dk1G`R_=7#JAS~*nPbQF{-Ge!f~O%U+*n!fPHfEl3$*X-4H4Y1i>Qk`FCw=e7s__Pf{gjKvC zufp{hcE*$r4}Y^OTx4l1vb6}AzG6oNichO?cK_8g9Lo$9lvwW*Y%Ol$=9?CEuOG&4 z$n5kMS*3Xh74A@}N(Ve(WQV$1NR(;lEpy@gMRidJr0gjv&n9Wt5-~RG{j|coZz)WH zHgrWNqBd$kvdckhzn?WQwZ_?-OfRIg_o2+}AymiQ;UzcT`;+5%q9e`rpy^V*qZ&Tn z{&|gv(d^D=kGvg3uJ>{_#rE9YxYAw@bwr>Iy6mU(Y`$>)2?S~J3%P?P?l;U{vMGDA z;SPVdI+ulV>j(D)?HKz;^x3bE_QB(0xs@kZ((bPHUFv9Jv$L=Z4BzZEY2SfUkW5c% zl2N+^S~1j(rUiAQqo}&AFv4L^B)iipSdYVM_h-wT`atC$*_4S=@r!PrNJX8piwrnw z;#R+ZeWxq99wt+(qGTY^)F5YRU!zv6SYbr6h1G{B+h){yB+zd!Z>QPSZ6_W6PG~CX zNx#om_zZxGTc}L6quDWN(q`00C)RCooRvsHwRQ0$1O+a)7l#N;$8dmwtw9q<&oj@0 zCj`w#wqba;YwJHSdiAh`ES83yGJ;}9&Es?+x2 zcLO>vnsey^Ph1x??=csp+e^;_#`8nuvC)c^H1O#`(5B&3GGS~UqQ^pc(M4%Fo$76k zet_cvFSEP>7mH`(_IQ0}WNc(SEyK28qY+exIEit<1;rx^N`9-l)ZkPLt9m}h>uTQ8 zRBW^b&2V>6n_^zGb27I2>7x%nH7sn6X1es6pPdK_o{qYM1uIohor7$-(A?ys2VvPp z(phEuRQEJB{lG{vnkk4{Z|H%k^{_N+aiNW&pa}zz&+8rP zsNUYyUE^+StU0!>xvrt6b~H1dh@UVRr<3|{KY636{-G1-@qF#d=9=2Unp%HTP3=HB zLkn>2SSp!`_h*u+T6)w>8zy^w)G?1|HrnjO;Y8x^Wn09fPv5yAs7+9wbm?tj!5JX;@Doq3+6HwUTD{>;+TrsFy0K|F7Q9jCT(ECY z!>>K)r$>(3Wb%eOjR;sa$N==CF4oP@F}w51RgG=VgTtMY;NDl(n>TI>^YYMh%R&>^ z4`gs5YSc}TKb|SUUYaE6$*-*Xg*BJw#P$Zrbrnq#@;JM2ZO-iwv501`+vn;u#>P`) zv}eT7!YYA5cA9NoI*1pZcIdf$L29~>^ShyWc@ri`FIWm9f|XLAS`BQ2Ne6ZsL<-X>EV##z&A6>$>FBSvghggCPa`x3od@u#nx_#5ePhAk zp@of%0G|(e8lfRQjWFKb{s1ifdE+N*YHG7hR%q`g^#~dYuMkXF3PJG|f(j@EGnYbo z@(S`xJ$wbC!l5z>=~*OOa_YA1(|}0-c#2+7j*O4Oq^n=qsG+#BxyTk=&fbyn#CSSR zhaX$lQU(<6rh|R~=VeDfNjBQu?$tF*yZh)MI<6O#+QxDAHJ;tLs;;5Au5p>>>Ye0) zFM3Z)uQUIyzPB#8=o8}trhrpkL}Q>+y|*oLIn@i(BA3(P@1zStoCbfEU4-*T7ezRK z^IL?|Cl^I7r~WF~7D6xX>BCz6f?WkzC05_KDsK6$`yAo?xk{e?Lg7}XbqtIq+{Wu@;Tw<>3if^=EDo!pA6{MBV~AGsA@$~4DA!jA#o z%lyNM8sW;XF7^G(Oyk1|D_!e8D%@%x>%R2>{GtQ!?CbP?dUF|*J+^*3mwlwd&vWF$85t>azH~V&e4S315m^ZKuFuraAp>lFre<=SafzO$J|9`ZJ{<#{vJ4Kjt=! z7T|Bl6rk)#T~<0j62nw>q%MoE6GPspahCr;hE^Q-wNm~RaPb_+W!pT?P3p`fv1FD2>f;F->ZSA#cp>3zf0Qj`@lbyc6$i;2~y4{f$tZ-7kG{2 z`=7v%6#f_Bb;3UdzCw7J)Z6OcpC|`ivw$y@iT_aGkFz#?>j-?Gq|*%iW9i2h;IGNJ z@ByDI^U~$O*GPL_1-wD*=O*CwVuyDEzfsEhGvrdvr-7d*>AwX06lvc#fsac+eg?co zc)4s{toA=t$~gmgl)lze*KFW_q|f=(bp-Hdq<Eur%lO?0 z{B4=9V!(rv{?~w?C;h$!c&m)-vw%M(?R+Wl?UMd=z?TWX8~AUe{PzOiF6Dm+_|3u} z1OBY=J;0|(zdQ|Gf0b_-&jWYLJp3|n{ks9fcpdm*QvSDqpCRqJ4|rO}%U^-NA^Da_ zJ6U%4YvKAASGjdIARB~A(C-ob!+?Jz_O=xGGumv8I^ZYEI@=8VGAaLR;5SRYEx?2|koF$|{x@r10eq^|YYXtbQm?at&z1S-Lf~JO z@>~Y|6tTmdz@L>P&F#SdF6rC_d_u~z8~9$CPaXt*qu9fv!1Zr04C4vl-md-E$|1WzHPuqWZ$(8`1{iS0pQn){s!Q; z2|oq+J;M8dKQ4R-_;bP&z~2y_0sh~@w*miL__@FME_V1K@Dl0Ye*#}3`d-A~CZ;^Cjz{jNh&j7wq=E*VOC(69J3Harb{x^VMFXQNZ;El3g zZwH>1=L}Z@zd-nPz^@g41Mu$&-v#_W;dcQ4h48z9|4#V5z~2`B5b%$LKL&iUtk-*h z_lrF|4csgG&jXK%9li{Fx!C{fz#GI4-vS;L|32V{N;-c9J|_Eze*hnm{~lJRpC|3#1$?LQFz~gK&dI=ci~i}rcgeUO0KQq$83BH& z@D%WarJc6`|3K{aY~ZERKoX-(lk|@OeyjM80e-5CmnPs}mwm`8;4x{3wZMNR>!$TQ)oO=Fq+aVl-tr|!cPJ2kpAcc-Y@z?z#BzB0lZUq2Kcb>ZNL}H{CO_$M&TC&Zxen6@E+mU06#SNOTS*)(|S%|rT>|f zry0_T$hm$saBH5`zsJv||FZOp2lV#|*T2or>F*aF1pR4ZC%wQI3qK8bgYX#egQefk z0Dh6GI9+4Fmq@#90`3z#`3CUUto=W5_4m%ywH^51H8!pU{#%(>uLC|T`ZoaIFLr3{ zcdUN=SjN#EpntE-hj#<768o{*gNd)~5zf1HVVw^LgMm z$~bx%_`PzDdmVVI@V9`UFLt{R_$89>UxDwJbp8SSZE5HIz}v;oF9xZPtakf~v`?AX zm&G08p9Xx3=vM>3S;{#NxV26%2L3HsXO{rC>Uk9KpNqc%_-e`5I)AHRRn@RO2Ur98 zaT&jE;MViLb-;JZcsvRCgJS=^z|+#s5#R?)c?N*bmhy}O*MGH${@4L<_2(Vb^>yH{ zNx$g7jhE|RkBp;BLH{_J=k*`S%jvI|adAE9PqEf<;9;3J{tftCSx@fy|uysS=m;PSD>hc7A`JzAX8y|5MO^M#j;v^Yo>OS${9+ThGDY0DhvR z^B(Z4rGGyG{yS-h5}D5|duW#VsuFmk%-aiqyQRKI0Dn%}tqJ%uQl7QI2PEHhz*}YC zz5#f*`1^oc@9z`9XUe>1JrA?$d$;8KUC_7M`F7wxka>8waAiL-RJgw$2K}R@eV)wI zmm$jf&w~EDlGv+x`tqob_1^}4{g=`V<8OKTvNW>(KS6&~5-SyZQRSB=VEyUBt@imu z){*&n`qBife;DZ3tB7>f<>||jfcdeYf4QXZ&eNAJXMG>&pDX^}JbhWZSU(E-<K~{|FQJf`FZ-11nXZ8`tM6)SkKp0bwq{r@6Jm{x`Me3C!U98s4zF`(pyLA z_l9)Or1X8ra;YDR8+Gc>1Q~UG>9kR&z8TLO5LdIPmYep={Kl#3Ho739sRI`ei)+uV#)veQgfwh6RW;ff-RN$YYfd?VSh4&M7o%*3K=2xY1H|7bgP?}O^Dm6Qo&t-N|CL@H%POZT zzuE#|`6I+IO%-#i@vZwNVHkg~R;Q!-C;zhI zS@&}&&~oSNT`TePnR279^2?HEQ{5r)ACf@Tooar-_EXC=+OA3{AQjr7Jb4%9ubQb? Q{12r6zLghOIWhkK0KFDsjsO4v diff --git a/net_io.o.REMOVED.git-id b/net_io.o.REMOVED.git-id index 4dadfa7..8056b37 100644 --- a/net_io.o.REMOVED.git-id +++ b/net_io.o.REMOVED.git-id @@ -1 +1 @@ -bdaa5132f81b7d6b55135413ab297b03f4791e00 \ No newline at end of file +22b5fc5c241eb98e511019d0ffa249f80ba7a933 \ No newline at end of file diff --git a/parula.o b/parula.o index 0218ad0b455f83e75dd346a740e1019611101e10..4e87f8fc66ef5a12f6e25887f2f49a8f3619c8c5 100644 GIT binary patch delta 161 zcmZ1=J41GY2IGv4n%?Y_=dnvF794@r)QSv7Z+rv z6m8zdeuz;rg#iLYp)?ne<^r5|b_Y>^V6=h52<4OfKXUXY`)j$*C_{$^ZdQP?`%! za{_Vu=8K&2OpF$jKXUJ9{4seWPdj7ZWJ_Li#_f{}dF>e=Pu>V5Urhc8Bo!tb^4T*A JOfKY82LKQnH0%HX diff --git a/planeObj.c b/planeObj.c new file mode 100644 index 0000000..958baf5 --- /dev/null +++ b/planeObj.c @@ -0,0 +1,102 @@ +#include "structs.h" +#include "dump1090.h" + +struct planeObj *findPlaneObj(uint32_t addr) { + struct planeObj *p = planes; + + while(p) { + if (p->addr == addr) return (p); + p = p->next; + } + return (NULL); +} + +struct planeObj *createPlaneObj(struct aircraft *a) { + struct planeObj *p = (struct planeObj *) malloc(sizeof(*p)); + + memset(p, 0, sizeof(*p)); + + p->addr = a->addr; + p->created = 0; + p->oldIdx = 0; + + memset(p->oldLon, 0, sizeof(p->oldLon)); + memset(p->oldLat, 0, sizeof(p->oldLat)); + memset(p->oldHeading, 0, sizeof(p->oldHeading)); + memset(p->messageRate, 0, sizeof(p->messageRate)); + + return (p); +} + +void updatePlanes() { + struct aircraft *a = Modes.aircrafts; + + struct planeObj *p = planes; + + while(p) { + p->live = 0; + p = p->next; + } + + while(a) { + + p = findPlaneObj(a->addr); + if (!p) { + p = createPlaneObj(a); + p->next = planes; + planes = p; + } + + p->live = 1; + + if(p->seen == a->seen) { + a = a->next; + continue; + } + + memcpy(p->flight, a->flight, sizeof(p->flight)); + memcpy(p->signalLevel, a->signalLevel, sizeof(p->signalLevel)); + + p->altitude = a->altitude; + p->speed = a->speed; + p->track = a->track; + p->vert_rate = a->vert_rate; + p->seen = a->seen; + p->lon = a->lon; + p->lat = a->lat; + + if(time(NULL) - p->oldSeen[p->oldIdx] > TRAIL_TTL_STEP) { + + p->oldIdx = (p->oldIdx+1) % 32; + + p->oldLon[p->oldIdx] = p->lon; + p->oldLat[p->oldIdx] = p->lat; + + p->oldHeading[p->oldIdx] = p->track; + + p->oldSeen[p->oldIdx] = p->seen; + } + + a = a->next; + } + + p = planes; + struct planeObj *prev = NULL; + + while(p) { + if(!p->live) { + if (!prev) { + planes = p->next; + free(p); + p = planes; + } else { + prev->next = p->next; + free(p); + p = prev->next; + } + } else { + prev = p; + p = p->next; + } + } +} \ No newline at end of file diff --git a/planeObj.o b/planeObj.o new file mode 100644 index 0000000000000000000000000000000000000000..b23c4133e654bd50a61d46d933caa08e2886a2c1 GIT binary patch literal 41536 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 int msgs = a->messages; @@ -35,7 +34,7 @@ void updateStatus() { if (a->bFlags & MODES_ACFLAGS_LATLON_VALID) { double d = sqrt(a->dx * a->dx + a->dy * a->dy); - if(d < Modes.maxDist) { + if(d < appData.maxDist) { if(d > maxDist) { maxDist = d; } @@ -56,6 +55,39 @@ void updateStatus() { a = a->next; } +*/ + struct planeObj *p = planes; + + while(p) { + unsigned char * pSig = p->signalLevel; + unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] + + pSig[4] + pSig[5] + pSig[6] + pSig[7]); + + sigAccumulate += signalAverage; + + + //distance measurements got borked during refactor - need to redo here + /* + if (p->lon && p->lat) { + double d = sqrt(p->dx * a->dx + a->dy * a->dy); + + if(d < appData.maxDist) { + if(d > maxDist) { + maxDist = d; + } + + numVisiblePlanes++; + } + } + */ + + totalCount++; + + msgRateAccumulate += (p->messageRate[0] + p->messageRate[1] + p->messageRate[2] + p->messageRate[3] + + p->messageRate[4] + p->messageRate[5] + p->messageRate[6] + p->messageRate[7]); + + p = p->next; + } Status.msgRate = msgRateAccumulate; Status.avgSig = sigAccumulate / (double) totalCount; @@ -65,48 +97,48 @@ void updateStatus() { } void drawStatusBox(int *left, int *top, char *label, char *message, SDL_Color color) { - //int labelWidth = ((strlen(label) > 0 ) ? 1.5 : 0) * game.labelFont; - int labelWidth = (strlen(label) + ((strlen(label) > 0 ) ? 1 : 0)) * game.labelFontWidth; - int messageWidth = (strlen(message) + ((strlen(message) > 0 ) ? 1 : 0)) * game.messageFontWidth; + //int labelWidth = ((strlen(label) > 0 ) ? 1.5 : 0) * appData.labelFont; + int labelWidth = (strlen(label) + ((strlen(label) > 0 ) ? 1 : 0)) * appData.labelFontWidth; + int messageWidth = (strlen(message) + ((strlen(message) > 0 ) ? 1 : 0)) * appData.messageFontWidth; //newline if no message or label if(strlen(label) == 0 && strlen(message) == 0 ) { - boxRGBA(game.renderer, *left, *top, Modes.screen_width - PAD, *top + game.messageFontHeight,0, 0, 0, 0); + boxRGBA(appData.renderer, *left, *top, appData.screen_width - PAD, *top + appData.messageFontHeight,0, 0, 0, 0); *left = PAD; - *top = *top - game.messageFontHeight - PAD; + *top = *top - appData.messageFontHeight - PAD; return; } - if(*left + labelWidth + messageWidth + PAD > Modes.screen_width) { - // if(*left + PAD < Modes.screen_width) { - // boxRGBA(game.screen, *left, *top, Modes.screen_width - PAD, *top + game.messageFontHeight, darkGrey.r, darkGrey.g, darkGrey.b, SDL_ALPHA_OPAQUE); + if(*left + labelWidth + messageWidth + PAD > appData.screen_width) { + // if(*left + PAD < appData.screen_width) { + // boxRGBA(appData.screen, *left, *top, appData.screen_width - PAD, *top + appData.messageFontHeight, darkGrey.r, darkGrey.g, darkGrey.b, SDL_ALPHA_OPAQUE); // } *left = PAD; - *top = *top - game.messageFontHeight - PAD; + *top = *top - appData.messageFontHeight - PAD; } // filled black background if(messageWidth) { - roundedBoxRGBA(game.renderer, *left, *top, *left + labelWidth + messageWidth, *top + game.messageFontHeight, ROUND_RADIUS, black.r, black.g, black.b, SDL_ALPHA_OPAQUE); + roundedBoxRGBA(appData.renderer, *left, *top, *left + labelWidth + messageWidth, *top + appData.messageFontHeight, ROUND_RADIUS, black.r, black.g, black.b, SDL_ALPHA_OPAQUE); } // filled label box if(labelWidth) { - roundedBoxRGBA(game.renderer, *left, *top, *left + labelWidth, *top + game.messageFontHeight, ROUND_RADIUS,color.r, color.g, color.b, SDL_ALPHA_OPAQUE); + roundedBoxRGBA(appData.renderer, *left, *top, *left + labelWidth, *top + appData.messageFontHeight, ROUND_RADIUS,color.r, color.g, color.b, SDL_ALPHA_OPAQUE); } // outline message box if(messageWidth) { - roundedRectangleRGBA(game.renderer, *left, *top, *left + labelWidth + messageWidth, *top + game.messageFontHeight, ROUND_RADIUS,color.r, color.g, color.b, SDL_ALPHA_OPAQUE); + roundedRectangleRGBA(appData.renderer, *left, *top, *left + labelWidth + messageWidth, *top + appData.messageFontHeight, ROUND_RADIUS,color.r, color.g, color.b, SDL_ALPHA_OPAQUE); } // label - //drawString90(label, *left, *top + game.labelFontWidth/2, game.labelFont, black); + //drawString90(label, *left, *top + appData.labelFontWidth/2, appData.labelFont, black); - drawString(label, *left + game.labelFontWidth/2, *top, game.labelFont, black); + drawString(label, *left + appData.labelFontWidth/2, *top, appData.labelFont, black); //message - drawString(message, *left + labelWidth + game.messageFontWidth/2, *top, game.messageFont, color); + drawString(message, *left + labelWidth + appData.messageFontWidth/2, *top, appData.messageFont, color); *left = *left + labelWidth + messageWidth + PAD; } @@ -114,31 +146,31 @@ void drawStatusBox(int *left, int *top, char *label, char *message, SDL_Color co void drawButtonBox(int *left, int *top, char *label, SDL_Color color) { - int labelWidth = (strlen(label) + ((strlen(label) > 0 ) ? 1 : 0)) * game.labelFontWidth; + int labelWidth = (strlen(label) + ((strlen(label) > 0 ) ? 1 : 0)) * appData.labelFontWidth; //newline if no message or label if(strlen(label) == 0) { - boxRGBA(game.renderer, *left, *top, Modes.screen_width - PAD, *top + game.messageFontHeight,0, 0, 0, 0); + boxRGBA(appData.renderer, *left, *top, appData.screen_width - PAD, *top + appData.messageFontHeight,0, 0, 0, 0); *left = PAD; - *top = *top - game.messageFontHeight - PAD; + *top = *top - appData.messageFontHeight - PAD; return; } - if(*left + labelWidth + PAD > Modes.screen_width) { + if(*left + labelWidth + PAD > appData.screen_width) { *left = PAD; - *top = *top - game.messageFontHeight - PAD; + *top = *top - appData.messageFontHeight - PAD; } // outline message box if(labelWidth) { - roundedRectangleRGBA(game.renderer, *left, *top , *left + labelWidth - 1, *top + game.messageFontHeight - 1, ROUND_RADIUS, 255, 255, 255, SDL_ALPHA_OPAQUE); - roundedRectangleRGBA(game.renderer, *left + 1, *top + 1, *left + labelWidth , *top + game.messageFontHeight, ROUND_RADIUS, 20, 20, 20, SDL_ALPHA_OPAQUE); - roundedBoxRGBA(game.renderer, *left + 1, *top + 1, *left + labelWidth - 1, *top + game.messageFontHeight - 1, ROUND_RADIUS, color.r, color.g, color.b, SDL_ALPHA_OPAQUE); + roundedRectangleRGBA(appData.renderer, *left, *top , *left + labelWidth - 1, *top + appData.messageFontHeight - 1, ROUND_RADIUS, 255, 255, 255, SDL_ALPHA_OPAQUE); + roundedRectangleRGBA(appData.renderer, *left + 1, *top + 1, *left + labelWidth , *top + appData.messageFontHeight, ROUND_RADIUS, 20, 20, 20, SDL_ALPHA_OPAQUE); + roundedBoxRGBA(appData.renderer, *left + 1, *top + 1, *left + labelWidth - 1, *top + appData.messageFontHeight - 1, ROUND_RADIUS, color.r, color.g, color.b, SDL_ALPHA_OPAQUE); } - drawString(label, *left + game.labelFontWidth/2, *top, game.labelFont, black); + drawString(label, *left + appData.labelFontWidth/2, *top, appData.labelFont, black); *left = *left + labelWidth + PAD; } @@ -153,26 +185,26 @@ void drawBattery(int *left, int *top, double level) { float yList[9] = {0.2, 0.2, 0.0, 0.0, 0.2, 0.2, 1.0, 1.0, 0.2}; for(int k = 0; k < pointCount - 1; k++) { - thickLineRGBA(game.renderer, - *left + game.messageFontWidth * xList[k], - *top + game.messageFontHeight * yList[k], - *left + game.messageFontWidth * xList[k+1], - *top + game.messageFontHeight * yList[k+1], + thickLineRGBA(appData.renderer, + *left + appData.messageFontWidth * xList[k], + *top + appData.messageFontHeight * yList[k], + *left + appData.messageFontWidth * xList[k+1], + *top + appData.messageFontHeight * yList[k+1], lineWidth, grey.r, grey.g, grey.b, SDL_ALPHA_OPAQUE); } - boxRGBA(game.renderer, *left, *top + (0.2 + 0.8 * (1.0 - level)) * game.messageFontHeight, *left + game.messageFontWidth, *top + game.messageFontHeight, grey.r, grey.g, grey.b, SDL_ALPHA_OPAQUE); + boxRGBA(appData.renderer, *left, *top + (0.2 + 0.8 * (1.0 - level)) * appData.messageFontHeight, *left + appData.messageFontWidth, *top + appData.messageFontHeight, grey.r, grey.g, grey.b, SDL_ALPHA_OPAQUE); - *left = *left + game.messageFontWidth; + *left = *left + appData.messageFontWidth; } void drawStatus() { - int left = PAD + 2 * game.messageFontHeight ; - int top = Modes.screen_height - 2 * game.messageFontHeight - PAD; + int left = PAD + 2 * appData.messageFontHeight ; + int top = appData.screen_height - 2 * appData.messageFontHeight - PAD; char strLoc[20] = " "; - snprintf(strLoc, 20, "%3.3fN %3.3f%c", Modes.fUserLat, fabs(Modes.fUserLon),(Modes.fUserLon > 0) ? 'E' : 'W'); + snprintf(strLoc, 20, "%3.3fN %3.3f%c", appData.centerLat, fabs(appData.centerLon),(appData.centerLon > 0) ? 'E' : 'W'); drawStatusBox(&left, &top, "loc", strLoc, pink); // drawBattery(&left, &top, 0.85); @@ -181,9 +213,11 @@ void drawStatus() { snprintf(strPlaneCount, 10,"%d/%d", Status.numVisiblePlanes, Status.numPlanes); drawStatusBox(&left, &top, "disp", strPlaneCount, yellow); - char strDMax[5] = " "; - snprintf(strDMax, 5, "%.0fkm", Status.maxDist); - drawStatusBox(&left, &top, "mDst", strDMax, blue); + //distance measurements got borked during refactor - need to redo here + + // char strDMax[5] = " "; + // snprintf(strDMax, 5, "%.0fkm", Status.maxDist); + // drawStatusBox(&left, &top, "mDst", strDMax, blue); char strMsgRate[18] = " "; snprintf(strMsgRate, 18,"%.0f/s", Status.msgRate); diff --git a/status.o.REMOVED.git-id b/status.o.REMOVED.git-id index 70d2908..301bdea 100644 --- a/status.o.REMOVED.git-id +++ b/status.o.REMOVED.git-id @@ -1 +1 @@ -4c882fece9c30acf73d1f87d59f36e90da75ca30 \ No newline at end of file +73f15d7f49718ad2118fa30449dffa3f088a20bd \ No newline at end of file diff --git a/structs.h b/structs.h index a6e503e..9791424 100644 --- a/structs.h +++ b/structs.h @@ -3,7 +3,7 @@ #include "defs.h" -typedef struct Game +typedef struct AppData { SDL_Window *window; SDL_Renderer *renderer; @@ -22,9 +22,64 @@ typedef struct Game int labelFontHeight; int messageFontWidth; int messageFontHeight; -} Game; -Game game; + // map options + int showList; + int mapLogDist; + float maxDist; + + //display options + int screen_upscale; + int screen_uiscale; + int screen_width; + int screen_height; + int screen_depth; + int fullscreen; + + double centerLon; + double centerLat; + + uint64_t lastFrameTime; +} AppData; + +AppData appData; + +// mirrors aircraft struct in dump1090, separating for refactoring + +struct planeObj { + uint32_t addr; // ICAO address + char flight[16]; // Flight number + unsigned char signalLevel[8]; // Last 8 Signal Amplitudes + double messageRate[8]; + int altitude; // Altitude + int speed; // Velocity + int track; // Angle of flight + int vert_rate; // Vertical rate. + time_t seen; // Time at which the last packet was received + double lat, lon; // Coordinated obtained from CPR encoded data + + //history + double oldLon[TRAIL_LENGTH]; + double oldLat[TRAIL_LENGTH]; + double oldHeading[TRAIL_LENGTH]; + time_t oldSeen[TRAIL_LENGTH]; + uint8_t oldIdx; + uint64_t created; + int live; + + struct planeObj *next; // Next aircraft in our linked list +}; + +struct planeObj *planes; + +struct { + double msgRate; + double avgSig; + int numPlanes; + int numVisiblePlanes; + double maxDist; + struct aircraft *closeCall; +} Status; // functions @@ -55,4 +110,8 @@ void draw(); void updateStatus(); void drawStatus(); +//planeObj.c +void updatePlanes(); + + #endif \ No newline at end of file diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id index fc4bddf..a619b91 100644 --- a/view1090.REMOVED.git-id +++ b/view1090.REMOVED.git-id @@ -1 +1 @@ -53426cac38852a6505d629ec7324b5ec7a2d18da \ No newline at end of file +cc7b8e99972e34a43bebde90a9679815d2219511 \ No newline at end of file diff --git a/view1090.c b/view1090.c index 7ac40ef..413353a 100644 --- a/view1090.c +++ b/view1090.c @@ -31,8 +31,6 @@ #include "view1090.h" #include "structs.h" -Game game; - int go = 1; // @@ -43,27 +41,7 @@ void sigintHandler(int dummy) { signal(SIGINT, SIG_DFL); // reset signal handler - bit extra safety Modes.exit = 1; // Signal to threads that we are done } -// -// =============================== Terminal handling ======================== -// -#ifndef _WIN32 -// Get the number of rows after the terminal changes size. -int getTermRows() { - struct winsize w; - ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); - return (w.ws_row); -} -// Handle resizing terminal -void sigWinchCallback() { - signal(SIGWINCH, SIG_IGN); - Modes.interactive_rows = getTermRows(); - interactiveShowData(); - signal(SIGWINCH, sigWinchCallback); -} -#else -int getTermRows() { return MODES_INTERACTIVE_ROWS;} -#endif // // =============================== Initialization =========================== // @@ -76,7 +54,7 @@ void view1090InitConfig(void) { Modes.check_crc = 1; strcpy(View1090.net_input_beast_ipaddr,VIEW1090_NET_OUTPUT_IP_ADDRESS); Modes.net_input_beast_port = MODES_NET_OUTPUT_BEAST_PORT; - Modes.interactive_rows = getTermRows(); + Modes.interactive_rows = MODES_INTERACTIVE_ROWS; Modes.interactive_delete_ttl = MODES_INTERACTIVE_DELETE_TTL; Modes.interactive_display_ttl = MODES_INTERACTIVE_DISPLAY_TTL; Modes.fUserLat = MODES_USER_LATITUDE_DFLT; @@ -86,17 +64,18 @@ void view1090InitConfig(void) { Modes.quiet = 1; // Map options - Modes.map = 1; - Modes.mapLogDist = 0; - Modes.maxDist = 25.0; + appData.showList = 0; + appData.mapLogDist = 0; + appData.maxDist = 25.0; + appData.centerLon = Modes.fUserLon; + appData.centerLat = Modes.fUserLat; // Display options - Modes.screen_upscale = UPSCALE; - Modes.screen_uiscale = UISCALE; - Modes.screen_width = SCREEN_WIDTH; - Modes.screen_height = SCREEN_HEIGHT; - Modes.screen_depth = 32; - Modes.fullscreen = 0; + appData.screen_uiscale = UISCALE; + appData.screen_width = SCREEN_WIDTH; + appData.screen_height = SCREEN_HEIGHT; + appData.screen_depth = 32; + appData.fullscreen = 0; // Initialize status Status.msgRate = 0; @@ -186,6 +165,8 @@ int setupConnection(struct client *c) { // replace with gps Modes.fUserLat = ***REMOVED***; Modes.fUserLon = ***REMOVED***; + appData.centerLon = Modes.fUserLon; + appData.centerLat = Modes.fUserLat; } return fd; } @@ -215,7 +196,6 @@ void showHelp(void) { "\n-----------------------------------------------------------------------------\n" "| SDL DISPLAY OPTIONS |\n" "-----------------------------------------------------------------------------\n" - "--upscale Buffer upscaling\n" "--uiscale UI global scaling\n" "--screensize \n" "--fullscreen Start fullscreen\n" @@ -291,8 +271,10 @@ int main(int argc, char **argv) { Modes.interactive_rtl1090 = 1; } else if (!strcmp(argv[j],"--lat") && more) { Modes.fUserLat = atof(argv[++j]); + appData.centerLat = Modes.fUserLat; } else if (!strcmp(argv[j],"--lon") && more) { Modes.fUserLon = atof(argv[++j]); + appData.centerLon = Modes.fUserLon; } else if (!strcmp(argv[j],"--metric")) { Modes.metric = 1; } else if (!strcmp(argv[j],"--no-crc-check")) { @@ -304,14 +286,12 @@ int main(int argc, char **argv) { } else if (!strcmp(argv[j],"--aggressive")) { Modes.nfix_crc = MODES_MAX_BITERRORS; } else if (!strcmp(argv[j],"--fullscreen")) { - Modes.fullscreen = 1; - } else if (!strcmp(argv[j],"--upscale") && more) { - Modes.screen_upscale = atoi(argv[++j]); + appData.fullscreen = 1; } else if (!strcmp(argv[j],"--uiscale") && more) { - Modes.screen_uiscale = atoi(argv[++j]); + appData.screen_uiscale = atoi(argv[++j]); } else if (!strcmp(argv[j],"--screensize") && more) { - Modes.screen_width = atoi(argv[++j]); - Modes.screen_height = atoi(argv[++j]); + appData.screen_width = atoi(argv[++j]); + appData.screen_height = atoi(argv[++j]); } else if (!strcmp(argv[j],"--help")) { showHelp(); exit(0); @@ -322,17 +302,6 @@ int main(int argc, char **argv) { } } -#ifdef _WIN32 - // Try to comply with the Copyright license conditions for binary distribution - if (!Modes.quiet) {showCopyright();} -#define MSG_DONTWAIT 0 -#endif - -#ifndef _WIN32 - // Setup for SIGWINCH for handling lines - if (Modes.interactive) {signal(SIGWINCH, sigWinchCallback);} -#endif - // Initialization view1090Init(); diff --git a/view1090.o.REMOVED.git-id b/view1090.o.REMOVED.git-id index 983c72a..743b1f9 100644 --- a/view1090.o.REMOVED.git-id +++ b/view1090.o.REMOVED.git-id @@ -1 +1 @@ -a1f04fa3c4375ebfef8558b27bf27cad234f3a4e \ No newline at end of file +6a3d6fb29439db4b118b48c859c390d687566a2d \ No newline at end of file From d630b24033508675ce500a666818e1188d9742c1 Mon Sep 17 00:00:00 2001 From: nathan Date: Sun, 8 Sep 2019 23:52:09 -0500 Subject: [PATCH 48/65] fixed message rates and plane count Former-commit-id: 7a6d279589752e646fb79ee0e0bf499bd0f97029 Former-commit-id: 98cd467cee7db46e6e8723c05b1d138159affe79 --- draw.c | 46 ++++++++++++++++++-------------------- draw.o.REMOVED.git-id | 2 +- font.o | Bin 36192 -> 36272 bytes init.o | Bin 45776 -> 45856 bytes input.o.REMOVED.git-id | 2 +- list.c | 2 +- list.o | Bin 47808 -> 46784 bytes monokai.o | Bin 26192 -> 26272 bytes planeObj.c | 14 +++++++++--- planeObj.o | Bin 41536 -> 41424 bytes status.c | 18 +++++++-------- status.o.REMOVED.git-id | 2 +- structs.h | 3 ++- view1090.REMOVED.git-id | 2 +- view1090.o.REMOVED.git-id | 2 +- 15 files changed, 50 insertions(+), 43 deletions(-) diff --git a/draw.c b/draw.c index aabdba7..564296b 100644 --- a/draw.c +++ b/draw.c @@ -350,6 +350,26 @@ void drawGeography() { } } +void drawPlaneText(struct planeObj *p, int x, int y) { + drawStringBG(p->flight, x + 5, y + appData.mapFontHeight, appData.mapBoldFont, white, black); + + char alt[10] = " "; + if (Modes.metric) { + snprintf(alt,10,"%dm", (int) (p->altitude / 3.2828)); + } else { + snprintf(alt,10,"%d'", p->altitude); + } + drawStringBG(alt, x + 5, y + 2*appData.mapFontHeight, appData.mapFont, grey, black); + + char speed[10] = " "; + if (Modes.metric) { + snprintf(speed,10,"%dkm/h", (int) (p->speed * 1.852)); + } else { + snprintf(speed,10,"%dmph", p->speed); + } + drawStringBG(speed, x + 5, y + 3*appData.mapFontHeight, appData.mapFont, grey, black); +} + void drawMap() { struct planeObj *p = planes; time_t now = time(NULL); @@ -386,18 +406,7 @@ void drawMap() { if(outOfBounds(x,y)) { int outx, outy; drawPlaneOffMap(x, y, &outx, &outy, planeColor); - - drawStringBG(p->flight, outx + 5, outy + appData.mapFontHeight, appData.mapBoldFont, white, black); - - char alt[10] = " "; - snprintf(alt,10,"%dm", p->altitude); - drawStringBG(alt, outx + 5, outy + 2*appData.mapFontHeight, appData.mapFont, grey, black); - - char speed[10] = " "; - snprintf(speed,10,"%dkm/h", p->speed); - drawStringBG(speed, outx + 5, outy + 3*appData.mapFontHeight, appData.mapFont, grey, black); - - // continue; + drawPlaneText(p, outx, outy); } @@ -412,18 +421,7 @@ void drawMap() { if(MODES_ACFLAGS_HEADING_VALID) { drawPlaneHeading(x, y,p->track, planeColor); - //char flight[11] = " "; - //snprintf(flight,11," %s ", p->flight); - //drawStringBG(flight, x, y + appData.mapFontHeight, appData.mapBoldFont, black, planeColor); - drawStringBG(p->flight, x + 5, y + appData.mapFontHeight, appData.mapBoldFont, white, black); - - char alt[10] = " "; - snprintf(alt,10,"%dm", p->altitude); - drawStringBG(alt, x + 5, y + 2*appData.mapFontHeight, appData.mapFont, grey, black); - - char speed[10] = " "; - snprintf(speed,10,"%dkm/h", p->speed); - drawStringBG(speed, x + 5, y + 3*appData.mapFontHeight, appData.mapFont, grey, black); + drawPlaneText(p, x, y); lineRGBA(appData.renderer, x, y, x, y + 4*appData.mapFontHeight, grey.r, grey.g, grey.b, SDL_ALPHA_OPAQUE); } else { diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index 901f5ae..001c031 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -935a39fc34ea31bd03a177786917177c0d74191a \ No newline at end of file +fda1ba88522832395454de10738083bda8677b29 \ No newline at end of file diff --git a/font.o b/font.o index 3132bb43fa22186585f718299e08fc7c3a29ce08..55e9ba8b912fbb37c021566ad47101eb298885e9 100644 GIT binary patch delta 7251 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 delta 7083 zcmZ{o4RBON5`f=?1QHTRmV`_O39uq00p+>i8Bj=w2unZ{7KjiMOqTzjBxDH?BAj96 zFCic-EeD7wQ9MA-(hwAXt~_&sno__8rH(7FU{4QDvBU^g3Cejr`}$$*lBwExJ^l5} z^qc9|Z{EJTE8_gq5nIwlX;a4I5#s6Q{Sh0x&fFq9w!|AojDbZ)hdSZKl4GtbNtwX3dsVI2{kGoud0 z9$|6dY3vr$LCd<_rmOw&()=dDcIxh(npy+9v^vs~2mg$6k|hs`bKG?5o^muVMSU&a z-5+#gmSuFWmgiY=rk2Yrd1xk1P?=KZU1G>#ucN#?rEF0J$*U}z;XQGJx}Mm{kR!A_ zHqvTj=|*(4)yTdR8z076jghra;#hU@Rx4*OHnvdX0X_Q;YCJd`JMD=#;@(1~zNaoj zQNVUKUi5v1+ntO!?V6sgeOpf$ZdV&|`Zn}f)b3ateFfLnT4uKfzbpWi7V9ys2`5Z(z`~?{Vk!iZhKS>E zEa}dSsfpUkFmBhCc))>y*CFs~tux%5tm93WzSp}$V{&53*ye7AaYyH5OWV)7pttaG za{s8?QGE(3yZ7jI7fN5FWq&a_Vwqv2*>=NF-z5=DnVK~k#eO(b1m9+}u*`*$>KTcB_4rc2Df4Kj7Cv%6vR*8Yn`{T%9&VOE^+Q@Xsborv(<=(1=&9Av?yEf;KJQms9V{~$)*wXCEt&S4C z;Xs}#K7g}%ZgC!*`BL>vv3z~Nx)`1D8i&8#;6a*)aiGft>vEHZz>hQ`{3IGiF{A0w zly8by2<5xgg>VAG@tDmUkTXGwPoZ#vDN3P!f~mIaX|Y_gE;r|jg&^7-1>uq6eo!7$ z?0{U4sV-6Q=L@TY?fJhU;BkwdaMn|zGQ(SF7)O}R=ir%Wip$`i=vGtk5z{3qoJx(G z^F9ipiBiob+MCfba7>b_JNZ0}(Up)h$rLlehxND6h;2pdfB$v=W-8O0f!BrlFRl(XzphG!K)xE{TjzhbE+DM0+#30zybP z5FNb+wV!AvqembI>H9=SG5Q(!kbX%tpV2GOh%|x%qKHuk1d*PjXMHZCBS4f& z^$_)~VzdZcNEZ;TWwZvoNb86;FuENANdHW9JEPN~1!)roO zH1=x*Mk^~?x-u9>EI3cNF=+DjvkXEui+fb=NQDU5y! zEl9s4I+M|>(1tXUQqLkrlfXGksx_3hRxo-DJV;|HYp!Q>E%;|i@igq5MJFU;l|c#$SkA^J0LJeis5izj;Vr_{`xYTFQ5%)83)d}Qp|>7 zb1@gudQM`NUqRDcsjjD5bCfWOCmp2UQs0G)_65g0seU0^&FCJ;nYURCfZ#k+ECVrL zs*{xQnwjM_aLq3fSrC}7&p`*~m#8$#GnbiVJUAEZ6Mux(1tqGcm*sONJrmkgZ^=f; zSt!+WL`N}t2z*G75zS}xAJDkaR6i2+G8zkCA-zh`QpM<7;3_l48Ss`#wTxoBf!Xwg zK$#Tl;Xs*N41zY4pM{umw`c-Sxm)$2Om&*|+6ztPQthUQI>+cX2$h@SLvU1>VkqQP zNElfW?dU+!X|GB#_>fd0iDzULG$Pqk5e@HFq^nP8^fYF*7Q`Z{{z`j2gwf03S|r6W z$X#TLTBup%7Ddp4^$>`u)ThN^SRaA;m8SAg3;-J;1WlDvHPN~~$LJ;qRmzAtv2eZe zN%aD4z)5CQ42?cLSX2Cl_!F%N1Mo9YMq*hUW93t0gz zi)D|2Ll69-};TDs?k_2s~9%&7$}!VAKSEm0NrVtyQMTg=<(JhKwbq$cDlt z`^57gmP++6TA}l-@3Y`q>c%gVnx**tK;w6&tY^D^30juA)i!$D3}Ey@a4y@2U$3pp zOm#QqgKf+v5ggTSF&_%6tHpy5td>1aP?qXK=YM-Hqbo!#A0#rswcM?~r1dUfMw=n9 zTnaZFSZ<0R;VjlYAg0C?_rS24-mXuXwe8e7rawxfUxLOOnR}Jdk7&UJZHet*5%ucA z^lkJIDiDv!+14f<6Qo4Up&0 zGW|445C@t5duqP{&J~#Y82yAi#6t_xbBuPN&$dzEUmrLe|Hsl~( z$*8?6>%fN;+R^YG(g*z>XhiyAJE}L+-j!D%i1aX{_O84GVwF_yF>0^-ad06$#i+gR zA@Cx#|I*QSq`lfg-=bF`fHa^lG{?j3^m>J|I$8rvY^T>d7NiVS+)l6Ucay!hoxc4JFSPXC!slq+ z;S6LMw+T5<2rq_r*1!6V+(?V3=9PJHChVeGIR!i|uJ%YFhUbOtF-8g#spXm)6 z3xU&Ji}?Z@dF zR;@{>eS^k-gxTBr=}g~~Hp6=h{XC{WPpeb*`})C#{g0EqKzVu%u`FdBZ2d~`t=0b~ zVO_YM+3cfs!!7h%nf^G<^(U@x4y~OVA>M7yt#b=Jum|chV@mTZzlK7vK2wZ_m<`$D z1mt491M0E90<9aeBhIgd&J9_jFXT34iv*}|$c{PG&+7Ph2sUJjB@nYQJ7Ujh@Q+D` m(v9h257ckW#*fxktVT}Qc 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 Zt|0qpo*IUNqj@R)4!RwFgv6mX{|CY3y`2C6 delta 8637 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 literal 47808 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 diff --git a/monokai.o b/monokai.o index 11cca7559b595a201997a274e49699b6941ee3b3..529c7467ceb7fa30c5cb7945c8b135b2754143f3 100644 GIT binary patch delta 5242 zcmZ9Qe{fXQ702HN3W?^|63XR9eg#wrSe~Ke7lb4mNH!ZFVM7A>0fYrp%ou?Ps9?vq z{)VhGXC8*}fWlm~y#C{Bx&J=R(h(=h$Ug9pNojX0a2rDyw7T2DX=an$o@W z;KpkxfR$P1*yBccH~zh8^!z`L^6ttH5qj)u?`FX^iq)9z-7IuwXAR#}IGNncH-Q(a z&!%)M6weKOHa(`5+@SRZjEDeDbzY?aVacyY@X?mqv5isn?YeFTNK?{WGCjhQI4It?1R4j z>0hTMZ@R7R_SVg9Z5z-x@xj!N@a8R*w}o$Qt8c%xt*>y>qEz%uOvC#*nSDEM_}3`) zSYKpLsZvGg&(r2)h7-xMzU%#1SJAIC{c|vwXR9U1&etYytOsWc%~uE!eVrqe3Hl8p zMCW9A?!|&GLM-1_cVZwvU_NuJ(XxIbG^gM%(CQ4D3Tzd@jsn}fK=tfgfA)T^WLt+g zXpUE=Iu78 zskoeLs#834CGvj~{qt;f4ukWwd4iu_Cp7mWyEtIFsal+CyP%IFQf#YZh!txS<@G%% zH1A=cxK;fI{`oYD6fe$Sgk}Xgi9XEqyr7p6CAw#f*Y~oZHzH1SJJX~Qo+>fMOHd`+ z?Bv|W2)YfqMC-V6W(hhUVWJ;$?adYR33Qie^%f45*ydf1utsS1V2~pCn05#{4cVpI zJj~d{RGwl)d9|#fsFVn+6e1W&`Id&^CEIpXEZ+i+<9)g_ER7=L4ZxXx>70 zg;w97sKQovp}oR3Pw^ggw@~&VR-w%l?Tv7!p!FD_I5Y5dML?CoU#ZnbG*#MWKkI)d z^v@w$NwdoIbwQ6KPV_X>_XRx<70|{zr7i1}pc%*|I@vwLE$f`1k04C+JikX@33>$G zL@RiY9p;|O-@Y}Y&>sk>i%6~tC>x_A}45@FL*cJAe8m!3~KWOuCDEZ-iIjBqr7K6DCnbz2W@p3s#*_Ay9Qa+ zv&>eOJ}sm_Lb$qBU61~1ZN`lEmj7L$xekNXI+)M&PlAr-$ft$BhV_3F{;3Ep((2b} zU$k3&gs&Ib<}*GNrzHLV3w9Fz#dnx?j#DY<&4@2KpRGVX5PBlV#6oX5(`Z6(=r5S=6!ZuNLU!^+XWygirx;kOeFuc51O7T~`uL^z zm7qJ&S!b&sBU%?w?Kn&A3gj-cRSCk>#?eh}2l|(3bD2k)#!pLZwy$Auna=9v8OsuM z<2X#I-$kcmtX`{!@J4+=)x+1IO*3~`D>^j5-=OK6tf?WOwj$bK(<=}s{a#+My+Yp( zwOp$OFv|nVhwySb%lXYbDwMm?O-hYJq}+tT<+f@-_6l2_M2Ol!L{{{gKX9K~9;|cg z%-A6Ojatn@Q=@JE&R;X@g(e@-MmuXP7igEDV<+HTW2L$dxlLOA9>Jzws*b@XTeTp& zS*zhFY7VGgM4DUGEf{FlW<4JrxAQiXNM#y)Em~cLoEF=hyM(`(v)>2bD(&wPw2E^(Ed0fMl)Nnb7Z6#canGuxt`mYxd<}-EvT;#fOpIC`VtL~~BLivNhr7a@n2HrW=57G1H9gYTPdItd_0kYMe`&h@ zV~DQNUB`z|-tSy`QbcRyMf>XzJ(skr|5E5rv;NW$J)5q6xYxP)%HYTI-$dyg)fqg; za661+e`0no@XTC0M9&50>Wlii!=ETsj?Q%j$-m8WeO4J_>k8CioLyI{CL`yjQuS}N zQ(J~ZHiOO;%>y&PWm74 Chn6V- delta 5173 zcmZ9PdvMjo6~}*zmzmmurL7zhqC2`WDmAumFb8z7fFNVpI}9>(MfSg;H<$N<4g zdL3V&JmS|nz*x&wc?i>LNCzKdsTs?wwM>FYX-jLbIE-NJ5ZlrQ1$%z?cP@tW`(y9f z^ZD-C-Lw1K{oP%EP<hhH<*#3#DDe9sQp1p$_St-*Ud-ia*QtVXX;@nC} zh$_cNx|Pxn3iWJ~Tk&qC$~LZamN~s|=i1C}YP2iKO4v`%cCr&Q$)LJTKhC@&^;j#x z8Jg4E(7MxMq`uZlaHiqJ;(AQnQcA6xWuN1}k>w>;T4qYcok`KGRyvV6!&Q#Wt6l93 zlUI9=V{^7^91X90?F0%l-lFi96%*&gbbFlpQO~}l!BKeZo;z?L{i&Yfag~WZuibMk zR&DDEO({{T2;r&PoJ)2ZTGnmuk2QjRos8$flWVKF@aAfhKh}jgLNkbVq9-^)si4;p zBAS-!x~m1PK|jTR3@XoOejnL%mbF=Ejv|n!RUbO?Z1p7G$g|CRv~8W|FYeEc(JsIM zX^tQxU#m(K?^8Ag^IJ{joi5ueG_7bauvHpD1wNC& zbNr9cq(BvFlgcz{*v-9UAe-nc9&?tUn-D0p)pO{gawK}GEX4qoSCBDHtBEL>w$+@c z4dgs`Is1d2==k>`Jk3^L!BeEotK9oMp?M14BAHRKdxe5NgYIIjPU1wdZ4PmSHlYDLCE5%|-X%Jy1f2vg z(Stnlb%MTxcA~d2eL>K>5hD6Wk2~8}1brC&C0bp=#S+^zaD+obV~|~Ht7{09YBPcJ zb53a9Ko?Q>ShTD!1U-x1(pJhqhS$kMf!C)tBk0xUA%0)hIJXZy(Y1IJ-9$GseL~Rf z2ov4Qbc>*e;3?DQ2-BT{o`#p`d8T^={Tl5=Rf;>BgMua_M06a}!-7smKhfz-eeyh@NM9O3;5H!>7$H{4W1Z&=mNI-o^Bipz9GNdN%SAVOduM-HmRd zv-yl27JKt*jzHMwQ~yKOY@f>jxKf*MIdLb2CJ~-0U6G#VChX6GUgbmi@4}zU`U}E8675x5y^M`j zTh*s9)wa37m*RxDo0sGq0@Z7cpW~DZ`a=v_*Wt@Pn$#hn*37G=g~FK zR$I|K&!_x|pYKy8@XxoE7eOjdqnpZ=2+!B%JMMRsbMDd;J$`=yPn}NP&pAvL^rs_G zR<}icfc`p7fiBkh)Iwx0(58hOJR}-4Ah1BIQ|MUWQ|r*Xz*bopAbpURaEH(@M@GF? zW4zP7Tu&w#R*bA3eQ4YHNZ>dCA3rdZ-f@^HD|d^El<{|IvM*D z0u7qZi;f1{e9SM}4}>Niy$yEib>7#Vf?iLt5GC`o_e&_#G`o@Ih^SvKiAlbQ66?P=?lT z5q?m2ej?~$-UDIbkKrkPCHys!m9(ru;s1v3l3RHS(G*1Yn#c8HZL7zm3r!j?Qx-z4 zbU`z9)|59$q|ajXx9ZNyA(X!YB6PlpStNmxz9;&=2r@R}azi>P7UAyZ%Wx zmgHyL`^F&+czZ?~ynwDYUGd5g${(u{x|jXYG`-~*^z;nT^XFy6|2_uVbm#FQl#jFs z?HAFSd2#+aM9*6{qQ4;Y=UM;t5Ivg_{Wosq`xh~d{|Lo$RA;R?Mx;S9`=itQFJ~rg zh@KN3(P#IB1D`5Yh~7nc@!O|Hd{#2l;ygM43l^8C+tESgKDH oqid;SNy#uP2N^kI(YGX1Sr{b87gJF9aB=(x0XO1Ss72%c4^{Atvj6}9 diff --git a/planeObj.c b/planeObj.c index 958baf5..c8f518c 100644 --- a/planeObj.c +++ b/planeObj.c @@ -19,11 +19,11 @@ struct planeObj *createPlaneObj(struct aircraft *a) { p->addr = a->addr; p->created = 0; p->oldIdx = 0; + p->prev_seen = 0; memset(p->oldLon, 0, sizeof(p->oldLon)); memset(p->oldLat, 0, sizeof(p->oldLat)); memset(p->oldHeading, 0, sizeof(p->oldHeading)); - memset(p->messageRate, 0, sizeof(p->messageRate)); return (p); } @@ -45,6 +45,8 @@ void updatePlanes() { p = createPlaneObj(a); p->next = planes; planes = p; + } else { + p->prev_seen = p->seen; } p->live = 1; @@ -53,7 +55,14 @@ void updatePlanes() { a = a->next; continue; } - + + p->seen = a->seen; + + if((p->seen - p->prev_seen) > 0) { + p->messageRate = 1.0 / (double)(p->seen - p->prev_seen); + } + + memcpy(p->flight, a->flight, sizeof(p->flight)); memcpy(p->signalLevel, a->signalLevel, sizeof(p->signalLevel)); @@ -61,7 +70,6 @@ void updatePlanes() { p->speed = a->speed; p->track = a->track; p->vert_rate = a->vert_rate; - p->seen = a->seen; p->lon = a->lon; p->lat = a->lat; diff --git a/planeObj.o b/planeObj.o index b23c4133e654bd50a61d46d933caa08e2886a2c1..0b63cf4d9b575fe3b63c2e79bb71cd34645ccbc2 100644 GIT binary patch literal 41424 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±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 Q%YTU5|8gRyO33{G3zF>jg#Z8m literal 41536 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 xNDboyeu#S)e5EP#V+g=+uzjhQ)Dlon && p->lat) { + + + //distance measurements got borked during refactor - need to redo here + /* double d = sqrt(p->dx * a->dx + a->dy * a->dy); if(d < appData.maxDist) { if(d > maxDist) { maxDist = d; } - + */ numVisiblePlanes++; - } + //} } - */ + totalCount++; - msgRateAccumulate += (p->messageRate[0] + p->messageRate[1] + p->messageRate[2] + p->messageRate[3] + - p->messageRate[4] + p->messageRate[5] + p->messageRate[6] + p->messageRate[7]); + msgRateAccumulate += p->messageRate; p = p->next; } diff --git a/status.o.REMOVED.git-id b/status.o.REMOVED.git-id index 301bdea..f8fd904 100644 --- a/status.o.REMOVED.git-id +++ b/status.o.REMOVED.git-id @@ -1 +1 @@ -73f15d7f49718ad2118fa30449dffa3f088a20bd \ No newline at end of file +7626e2885663816ca0afea4b99f4464dbaa595f7 \ No newline at end of file diff --git a/structs.h b/structs.h index 9791424..2f3be7f 100644 --- a/structs.h +++ b/structs.h @@ -50,12 +50,13 @@ struct planeObj { uint32_t addr; // ICAO address char flight[16]; // Flight number unsigned char signalLevel[8]; // Last 8 Signal Amplitudes - double messageRate[8]; + double messageRate; int altitude; // Altitude int speed; // Velocity int track; // Angle of flight int vert_rate; // Vertical rate. time_t seen; // Time at which the last packet was received + time_t prev_seen; double lat, lon; // Coordinated obtained from CPR encoded data //history diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id index a619b91..f0478ea 100644 --- a/view1090.REMOVED.git-id +++ b/view1090.REMOVED.git-id @@ -1 +1 @@ -cc7b8e99972e34a43bebde90a9679815d2219511 \ No newline at end of file +68fb7031fcec17eff186d2abd88b6bf9f0726707 \ No newline at end of file diff --git a/view1090.o.REMOVED.git-id b/view1090.o.REMOVED.git-id index 743b1f9..66035d0 100644 --- a/view1090.o.REMOVED.git-id +++ b/view1090.o.REMOVED.git-id @@ -1 +1 @@ -6a3d6fb29439db4b118b48c859c390d687566a2d \ No newline at end of file +56d4666551743e2bb5da41ccce658ff2be58cdf2 \ No newline at end of file From df727c8d04c803e12be5c8569400fb6ef1ab5ad6 Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 9 Sep 2019 01:17:40 -0500 Subject: [PATCH 49/65] new signal markings, new timing numbers for LatLon reception (doesn't seem to be working on dump1090 end though), basic plane velocity animation Former-commit-id: 0fead3636422b4fcc2bc0dee8a30a137de50d69b Former-commit-id: b6345e37645d23a82edbb99859c51c1ff207a5c9 --- draw.c | 78 ++++++++++++++++++++++++++++---------- draw.o.REMOVED.git-id | 2 +- font.o | Bin 36272 -> 36416 bytes init.o | Bin 45856 -> 45984 bytes input.o.REMOVED.git-id | 2 +- list.o | Bin 46784 -> 46920 bytes monokai.o | Bin 26272 -> 26416 bytes planeObj.c | 25 +++++++++--- planeObj.o | Bin 41424 -> 42880 bytes status.o.REMOVED.git-id | 2 +- structs.h | 3 ++ view1090.REMOVED.git-id | 2 +- view1090.o.REMOVED.git-id | 2 +- 13 files changed, 85 insertions(+), 31 deletions(-) diff --git a/draw.c b/draw.c index 564296b..889f381 100644 --- a/draw.c +++ b/draw.c @@ -250,7 +250,7 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee uint8_t colorVal = (uint8_t)floor(255.0 * age); - thickLineRGBA(appData.renderer, prevX, prevY, currentX, currentY, 4 * appData.screen_uiscale, colorVal, colorVal, colorVal, 127); + //thickLineRGBA(appData.renderer, prevX, prevY, currentX, currentY, 4 * appData.screen_uiscale, colorVal, colorVal, colorVal, 127); //tick marks @@ -268,7 +268,7 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee int x1, y1, x2, y2; - int cross_size = 8 * appData.screen_uiscale; + int cross_size = 5 * appData.screen_uiscale; //forward cross x1 = currentX + round(-cross_size*vec[0]); @@ -351,6 +351,7 @@ void drawGeography() { } void drawPlaneText(struct planeObj *p, int x, int y) { + drawStringBG(p->flight, x + 5, y + appData.mapFontHeight, appData.mapBoldFont, white, black); char alt[10] = " "; @@ -370,39 +371,59 @@ void drawPlaneText(struct planeObj *p, int x, int y) { drawStringBG(speed, x + 5, y + 3*appData.mapFontHeight, appData.mapFont, grey, black); } +void drawSignalMarks(struct planeObj *p, int x, int y) { + unsigned char * pSig = p->signalLevel; + unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] + + pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 3; + + SDL_Color barColor = signalToColor(signalAverage); + + Uint8 seenFade = (Uint8) (255.0 - (mstime() - p->msSeen) / 4.0); + + circleRGBA(appData.renderer, x + 5 * appData.screen_uiscale, y + 10 * appData.screen_uiscale, 2 * appData.screen_uiscale, barColor.r, barColor.g, barColor.b, seenFade); + + seenFade = (Uint8) (255.0 - (mstime() - p->msSeenLatLon) / 4.0); + + hlineRGBA(appData.renderer, x + 10 * appData.screen_uiscale, x + 14 * appData.screen_uiscale, y + 10 * appData.screen_uiscale, barColor.r, barColor.g, barColor.b, seenFade); + vlineRGBA(appData.renderer, x + 12 * appData.screen_uiscale, y + 8 * appData.screen_uiscale, y + 12 * appData.screen_uiscale, barColor.r, barColor.g, barColor.b, seenFade); +} + void drawMap() { struct planeObj *p = planes; time_t now = time(NULL); - + SDL_Color planeColor; drawGeography(); drawGrid(); + //draw all trails first so they don't cover up planes and text + + while(p) { + if ((now - p->seen) < Modes.interactive_display_ttl) { + drawTrail(p->oldLon, p->oldLat, p->oldHeading, p->oldSeen, p->oldIdx); + } + p = p->next; + } + + p = planes; + while(p) { if ((now - p->seen) < Modes.interactive_display_ttl) { if (p->lon && p->lat) { - unsigned char * pSig = p->signalLevel; - unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] + - pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 3; - drawTrail(p->oldLon, p->oldLat, p->oldHeading, p->oldSeen, p->oldIdx); - - int colorIdx; - if((int)(now - p->seen) > DISPLAY_ACTIVE) { - colorIdx = -1; - } else { - colorIdx = signalAverage; - } - - SDL_Color planeColor = signalToColor(colorIdx); int x, y; - //screenCoords(&x, &y, p->dx, p->dy); double dx, dy; pxFromLonLat(&dx, &dy, p->lon, p->lat); screenCoords(&x, &y, dx, dy); + if((int)(now - p->seen) > DISPLAY_ACTIVE) { + planeColor = grey; + } else { + planeColor = white; + } + if(outOfBounds(x,y)) { int outx, outy; drawPlaneOffMap(x, y, &outx, &outy, planeColor); @@ -419,11 +440,28 @@ void drawMap() { circleRGBA(appData.renderer, x, y, 500 - age_ms, 255,255, 255, (uint8_t)(255.0 * age_ms / 500.0)); } else { if(MODES_ACFLAGS_HEADING_VALID) { - drawPlaneHeading(x, y,p->track, planeColor); + int usex = x; + int usey = y; - drawPlaneText(p, x, y); + if(p->seenLatLon > p->oldSeen[p->oldIdx]) { + int oldx, oldy; + int idx = (p->oldIdx - 1) % TRAIL_LENGTH; - lineRGBA(appData.renderer, x, y, x, y + 4*appData.mapFontHeight, grey.r, grey.g, grey.b, SDL_ALPHA_OPAQUE); + pxFromLonLat(&dx, &dy, p->oldLon[idx], p->oldLat[idx]); + screenCoords(&oldx, &oldy, dx, dy); + + double velx = (x - oldx) / (1000.0 * (p->seenLatLon - p->oldSeen[idx])); + double vely = (y - oldy) / (1000.0 * (p->seenLatLon - p->oldSeen[idx])); + + usex = x + (mstime() - p->msSeenLatLon) * velx; + usey = y + (mstime() - p->msSeenLatLon) * vely; + } + + drawPlaneHeading(usex, usey, p->track, planeColor); + drawSignalMarks(p, usex, usey); + drawPlaneText(p, usex, usey); + lineRGBA(appData.renderer, usex, usey, usex, usey + 4*appData.mapFontHeight, grey.r, grey.g, grey.b, SDL_ALPHA_OPAQUE); + } else { drawPlane(x, y, planeColor); } diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index 001c031..d84e7d7 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -fda1ba88522832395454de10738083bda8677b29 \ No newline at end of file +3329d96b9e8da09d38ac06e8cfcb2c9227d0593e \ No newline at end of file diff --git a/font.o b/font.o index 55e9ba8b912fbb37c021566ad47101eb298885e9..eb8e2e3577f2bdd21a00b071d8a63bc37253c0de 100644 GIT binary patch delta 9630 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 diff --git a/init.o b/init.o index 8b08a1a50ece11a6a64b176ec9b019b278a7ffab..824f2eb848152d6b3e8862e6e1e96a35924a4be3 100644 GIT binary patch delta 9671 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 delta 9632 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 diff --git a/input.o.REMOVED.git-id b/input.o.REMOVED.git-id index b448a08..a79dc82 100644 --- a/input.o.REMOVED.git-id +++ b/input.o.REMOVED.git-id @@ -1 +1 @@ -ec05e242afe12d9af07fceff41a9689f66237a76 \ No newline at end of file +2c4ed2ab46ef6a542479d8c3c9ea7de7298325c1 \ No newline at end of file diff --git a/list.o b/list.o index a96d73cee3e59dce1065cdfa056bd61feb7cb2c3..e3a4518ca6cacd90b14d5e2af7ebc9d790e8097d 100644 GIT binary patch delta 10207 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 BH@^S? delta 10165 zcma)?3v?7!wubA(ARs8Tf`=m@Y2Fc~XkZXTi48~_K!+X#!JyFGs{{=~D29p_%TK899C&`~tZpm0a!?n>=)itQTL)LK-k_V@37 z_IcK+Y7U*udF88|m0guplRqq1ZK|D-d!1=8vsv3vf9!2Lr@U23Y`WF<`fDu9y17-! z)cg5*#6@JV+7|S`!m`G+slUF_xo(x~-h`c-_Zzx51BcPgx+d<;pg%VtmuBwGVCzE5 zn!qsy`cMy~zWPO;71>k-a%3->zeXa=@&Z+`PpBg@L;Vn&vpS4>mK z>6DjId3|0vuJlUv;T5%O+67h4xjY=mo2XWzb#PeGxjf6dAX!!3og6LIxmnP;eU@*# zxO6k$c6D!elwVaZzQMV54%avA(w!_G*beF7)v6s%2JQYfh4mk*=r3(8D>RDDp`qSI z0blg=)DtnLeOF~8(Z1!lHdp?lkJaO6#f(_+%PziRPPNZ3@cZ}W4AiwJ{_PldbjbgC zReKL__ls%!a(Jo3zsMo9_ur1uxnt)yBX?i;xGHeT*@xtfUo?o_DmKwjsTYFurf&PQ}@n*krSSylAK z=5LCcs0&edk5>KAc+z;&hkC?0u6O^`&!lE_-3WamTzHqz09n#phO?7w zbrAW*wrNMr;~cBqKR-o_BVMd?zHNp_i@Te5Io$7rXeBbm+WgSUHGeE~AxROUNRy@uYsL!A)2Ji5idxk<9u%}Sg7<25 z4E^qnsF6tAtIhWIt}-o@tx!Ws3x`SB41xQ!DWh5H9L;jvzh2H22os&pG+)rgh!b7L zbdaE%kh(8oKDgYCm=N?6s1j{jUgpwDLBB$%#8y)fE765j+SQyEnjbH9?EzkVy`1l& zwb?n^2zv$6CHjg>xWt}1^`GMQ2x1ful9*CI!+?#g_dMjcNXj9SIjW|Ql{YVl$!x>fz8bqJl|~I|c5@5Q6PhftMBlpDjk`wB;|NT* z)eQ(w*T(RQ_?plhM4adYd2WP{1Ra7D(L1?zrv)924AB@*`-^E0;~ZWOj)$6|O(X7? zPJ&*7&+vK@k&Qf)eOwpR=K7P1uQRRqek8Oi;X6q(BhTp1g}r4*H|KAKeG1gfhcM-G<38L3rzd>cWZKm)V z-k7yseLEscngcjXnohhKV*hWE;i)eTAku(iEW`)4_svM;*}{n2r#1ID(6{DPlTK(0dUj zI*Vzspi7V-x|Zp5LARlX=suP5XEV0#AWJ%M37vDz~ zI)Wp7BWNX3L^pJBm+bEatwCmmrUCl-3fqJ@ehcnxFT)~)Rz}QRek5Ei=wnE()TSTr zSo;b(3TdKorh^4tj=Gh$dJ(~-EyTVL#0elKX|-{XA<~(}lgY zQ%%dl{$#*(cdxAlLK8+dsm*OnmkBxvfmPbfX1Y$$

kq&+i9Y1f^Z=DqD?0iZr8n zk$ORBnjy1F)1LkFRS|UrA=v6t#GuWyJh#6T`cfo`j^>^|BWM z?m!*Uemq*53;G&@t8H~1qIA9iiPhT7p5`CF{hYOlPV2w7# zJl@6#x)|X#wi<>woj*ltjU772E&q^EzRUI{!u}%E;}O$=w@1~2-iX-a+T6}->@$LX zf+W!q?0ev6G);6e(^m!Ui#no*xozJO^mYW-YIBMofFBAv8BwC|@C-d6=+j87)wG^h zu8q)EDNEN!adxe3T5(yec=UO_T!!#Et=_}fbrD5tI9-p$^XqKWmPf@cLcbTP(pC>4 zRH;=96jnymd?YKi3G#?tEc9<9T^TV=@@PQOkrMQJ1lMcRlUsPVpmm56UCP!M1zm^4 zdYyCbN~~Ys-IVeWKO#i6$Wn-YyyZSF=r9B}IFHHv4YnD|JLmwvpm+_`4{_2gLIr7F zTdDH22~24H4Rphc?o;UEYI?7Rud-5iQQEZw>1nK_?@*(N?t6q4P1+(Rmqy zPdKl!Q9Az>2|C}7nkRH&A8zhOTr)4*zw>Pc;W#jjC&1RabJ(Jj1$9TIdHVnk=K^{Ajx zB#BjZrO z*=ije!eeWXpo4g#zK2jso1=oR=2ra*v6L?VKS59O!q<>D3|`L1xSlP9{TluR85H)u z+&R>Wdi{ zF@NC4>pY*H_e}L(4wjhf8;IofA;q8(y=5dzzE{yjeGc%5ahxUkbVpRJco z;o(~!VX;uG;>KIyvpeN|$>pu~*`1OW^5ClS*&TgX@)^<5~JQVPC`Bh8(ZgD5jI!E!;d!T|3^` z9w-b5%@6!zL7uSB<*{uGdo@p&ehBW+W`LmI^16F-J-tOx?+1muk=UUNr~0VV&L??^ zobIzbwOGsj=>00|jl!-M5TxS~WGRysJ};-*)9RUJRUz;c{W9#MPFat#?;eDo(uMn& zIvrh~1ZVPr&+b&L0muBpXLqCrc!V@Sipsi#mvk@Bvs{)&hG>wfSJo&lD`VT6bd6%noq#sm9w}m(#vzPG20Qf6kGM=x?>Tm{%~beRgtLmm@*6HB+yBEN;Dls395^v^mof zWQooYk%#kWoR7dW^odCL_F>}+?H!P!vTn|+udwCO z15BqNLo_L<_l(&AwUb@}1s&&xvS{B#)Z3eSk+U4R2Vy&QY;@2SJ8kRCouN$sL)iE8 zN-{~<-{(;=Mc6(4T-5D!{v!&VLyrhenD>24|Al=OqPw(uy#D+I5_FxSbAgK2rgx3c zQR`}hHE*b#Z9#;)wZyq+gN>Km<5p$~@@ubES0GkfpavmD=jO=LIS0YL1v%BbFmdky z)f1_`1!^F&WO`>8+V2~1(Wc(6f3|ad$nt$b`k^SbuR!famd^CE^m7F{C&>M|0jd>J Q&lRXK$kN$DaDSKo2beq#d;kCd diff --git a/monokai.o b/monokai.o index 529c7467ceb7fa30c5cb7945c8b135b2754143f3..2a29f3289fa641189a9ace4d3629e95d05886adb 100644 GIT binary patch delta 7180 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 D;`$UI delta 7095 zcmZA5dvp}l9S884fRI2!SQ5Dmq9!~PQ9G)*j$UVG$IO9tqKcNAVEF7b>zI^vJ1Vg0`SlN=~D#NNs<+^IgpO?H}2l-{*Jl z+_|rr$(|$j)(`FV1Jkz7iw+uZk8X&p$hv4nc8-4~&Sdq>TG`FAI%Zh%$r(})U$@HI z-ZkN6R?f&+2g{n!yJpE^{+{L~6>XFPm6s$76eoW7>gXK=5(l4k_7288F9#dCdIvYI zl&UJTy@Rpq=%k<`okT{=kW$+M(-%j%S#sMI^-^ka=jvS01gxV~qvo@gF)G2Xpq zTjSl=cDkr>)pa{NI3rA=fMxl-FRP1uCn`LSK!LG`psK)irVy`IIYSXEFwT$E5lY`i zT=eIjUbsZ*5ZJ?vGwEV4T&46l{KJgB0>NQ!@S)`OS=MTm^OfTTo>1`Dt;PG za>n{jUU;9u^CO6l(q5&ct|r<;_{Lu`bxXW^9*uH&%h zkEonYunUb-!TL`t&49nqU~pl&FOBC&wb~#oGFPOJk}-%D8haa_FLa$px_T{}sB#vf zRnD5u*)~t<2ISvhoKc(&&no>RLZbg-zrU_D7j>dtIZK+Ao)^$n;u1Sm`?mh<=;vX^GM;h={IEE<4Mbtuz<0k**y@Tyi$E{s&dge%Pao zbBOhCRvLqUl(9cTaFlDG!OBst^D<}E36(hpO;S$<&+@I(N6;#IKF7O?AC<00{%GS2 zPVN|%mDbVAO7+h@2#KEKHFi__DC$I4a_o95Ek%RqD6Z8ZNr~R66aCYzf|cQv`E?AZ25gkAA)a;ah~G-_=wW&2#7XP|Df~@L`37% ztxB5_8)Jh1r0!Pw3*&oLJd5*rzl!&PeWP)%rXEsS2)}5MdQ@p8!lH5RHlHh9gQzH2 z_O#M%XcBFpwkbV`R?&~B7I&l6xST-#SmS(8%~bjqghb!sy|$Oqov0H%MeVQj1R6v; zvJVF<{T?l%F}8K2(xLE;GtP6Yd4kgS5fJ@1_uMk2*@%oY!S}ho<|_R;wW3wLFK2U& zirHd%Ua~&iOS;`@%0;#xY&5bP&R#n|TL$TImi%MT=Q>r_v>88t>X$ z(JDE6cy~LfatlM7wi`{90)q8cIy?N$yc+m7YyL;#$^^ zDt>_Z=T&?hd=re*nPZ*KCxq1etVclfb(YCh`U4`O&D;<3lzxSnsLMXQM(G;FMNjj2 zWw_GWu!F`~%%{4sO0R=o^iy8xG^K3_iw0SCmeMy74Z8OCXp)>VUiC7SQ;k;92dJx* zzKQ&avL8|(S9&EvqUU>i`|k#&-B2g`0B7uWrOVME`WRcjN9i`Sh@NEhHKn`Yn`E3T zILhxT%|$?TKp(GF$CMTzBHDv(ZdN)KG0}e1@07lT_@s6A=Lk=h=U1-cKAaJ$S@ad6 zlZ|~G&rf!p+c}qpsGK{|DmDC-TCDUod*{xN@fmR2XL|-$eedaw-rJ zE$5iFDIJZN=y68V*vE;(#H9{Jyu#S6_@=^jnz(OVrgHkhUum4_sac_PIl`htsf9}4 zK~%JrZ7Wy$8#Gm#;Jw^M!%F|b`|=_cFW`Frt%_fZ{3>~uw34q8O}v*vQ8 zGvS+U>@RWEY}fgcb8NNBS%!$@j6}WUOkh2GRnADnXPaOfd+e~%bBuqg;{A9>JE`J# zz<-OWeTplt2d_JIz4N&TUZ&zZxWinn;;T5HhpYIXxu1+v@u;^Fud_-OtmX2aqvCtG zbZZcpW1NFZiPi^*%rUiJD1DVf{f&xuV3+)$;#0k6Y0GBgQ=RfN9}Tlq{6j7t$BPfT z@C>z!eSd{2(3Kz30a*?{q?)SA>PY?sdmzhwSQmA{zxoJH;Oxs;Om zOTGAv3(Y;l{^x*F zEK2)N7!wzcwu@1}u&7HW>pXoaK3-Um*5*f->d|R=@)AA2C+1cUlrr_zMRq#gt1imu NKF_Oj9isCu|3BmK{>lIV diff --git a/planeObj.c b/planeObj.c index c8f518c..6380a15 100644 --- a/planeObj.c +++ b/planeObj.c @@ -1,6 +1,16 @@ #include "structs.h" #include "dump1090.h" +static uint64_t mstime(void) { + struct timeval tv; + uint64_t mst; + + gettimeofday(&tv, NULL); + mst = ((uint64_t)tv.tv_sec)*1000; + mst += tv.tv_usec/1000; + return mst; +} + struct planeObj *findPlaneObj(uint32_t addr) { struct planeObj *p = planes; @@ -57,12 +67,12 @@ void updatePlanes() { } p->seen = a->seen; + p->msSeen = mstime(); if((p->seen - p->prev_seen) > 0) { p->messageRate = 1.0 / (double)(p->seen - p->prev_seen); } - memcpy(p->flight, a->flight, sizeof(p->flight)); memcpy(p->signalLevel, a->signalLevel, sizeof(p->signalLevel)); @@ -70,11 +80,12 @@ void updatePlanes() { p->speed = a->speed; p->track = a->track; p->vert_rate = a->vert_rate; - p->lon = a->lon; - p->lat = a->lat; - - if(time(NULL) - p->oldSeen[p->oldIdx] > TRAIL_TTL_STEP) { + p->lon = a->lon; + p->lat = a->lat; + if(p->seenLatLon < a->seenLatLon) { + p->msSeenLatLon = mstime(); + p->oldIdx = (p->oldIdx+1) % 32; p->oldLon[p->oldIdx] = p->lon; @@ -82,8 +93,10 @@ void updatePlanes() { p->oldHeading[p->oldIdx] = p->track; - p->oldSeen[p->oldIdx] = p->seen; + p->oldSeen[p->oldIdx] = p->seenLatLon; } + + p->seenLatLon = a->seenLatLon; a = a->next; } diff --git a/planeObj.o b/planeObj.o index 0b63cf4d9b575fe3b63c2e79bb71cd34645ccbc2..56be23f6d059cd68c3936608cad125ba67305ca7 100644 GIT binary patch literal 42880 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±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 Q%YTU5|8gRyO33{G3zF>jg#Z8m diff --git a/status.o.REMOVED.git-id b/status.o.REMOVED.git-id index f8fd904..ca6393a 100644 --- a/status.o.REMOVED.git-id +++ b/status.o.REMOVED.git-id @@ -1 +1 @@ -7626e2885663816ca0afea4b99f4464dbaa595f7 \ No newline at end of file +e28b70359d329c69b61d0da196a74552ba4f6f8f \ No newline at end of file diff --git a/structs.h b/structs.h index 2f3be7f..93da617 100644 --- a/structs.h +++ b/structs.h @@ -56,6 +56,7 @@ struct planeObj { int track; // Angle of flight int vert_rate; // Vertical rate. time_t seen; // Time at which the last packet was received + time_t seenLatLon; // Time at which the last packet was received time_t prev_seen; double lat, lon; // Coordinated obtained from CPR encoded data @@ -66,6 +67,8 @@ struct planeObj { time_t oldSeen[TRAIL_LENGTH]; uint8_t oldIdx; uint64_t created; + uint64_t msSeen; + uint64_t msSeenLatLon; int live; struct planeObj *next; // Next aircraft in our linked list diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id index f0478ea..d5f630d 100644 --- a/view1090.REMOVED.git-id +++ b/view1090.REMOVED.git-id @@ -1 +1 @@ -68fb7031fcec17eff186d2abd88b6bf9f0726707 \ No newline at end of file +ae65e041076e061971bc7b3d686bee6c5f471abd \ No newline at end of file diff --git a/view1090.o.REMOVED.git-id b/view1090.o.REMOVED.git-id index 66035d0..75ee653 100644 --- a/view1090.o.REMOVED.git-id +++ b/view1090.o.REMOVED.git-id @@ -1 +1 @@ -56d4666551743e2bb5da41ccce658ff2be58cdf2 \ No newline at end of file +566004a350fc256a0bc6ab112a14b09c91e6cc18 \ No newline at end of file From ce5a6018f7e075ecb5c87bb0529605f781757b97 Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 13 Sep 2019 01:56:55 -0500 Subject: [PATCH 50/65] updated readme with notes and todo Former-commit-id: 7904d2166414ca25191fccd8e9e508ebc10aa113 Former-commit-id: 359075343c3a1566a67a3991430abf3e5edc4e8b --- README.md | 64 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index ecef83e..50a916f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,32 @@ #spidr1090 +### TODO +* change plane history from fixed array to linked list of planeObj, handle cleanup +* status box layout system +* status box tap for info + * trails w/ altitudes +* menu system (toggles for UI elements) +* map system (automatically load open source) +* separate fully from view1090 (which interface?) + + ###HARDWARE +Notes: +Pi 3b+ and below are a little underpowerd for unoptimized map drawing +Pi 4 is smooth, may have USB issues with RTLSDR? +Up squared is good, but large +Up Core may be fine but bad connection options - try up core? + +PiJuice is by far best battery option. FCC/CE certified! + +Need to test stratux low power dongles. 987Mhz? + +Waveshare 4.3" HDMI(B) is very good, slightly too large for handheld. Uses a lot of power, around 500ma +Pimoroni Hyperpixel 4.0 is the right size, but takes over default I2C pins so conflicts with PiJuice, unless some pin remapping. Also lower power, around 150ma +Adafruit PiTFT 2.8" capacitive touch is ok, but a little small. Not sure about power draw. Docs claim no multitouch? + + ####Pi Zero Version Part | Link | Cost --- | --- | --- @@ -52,34 +77,41 @@ MicroSD Card | | alt screen https://www.amazon.com/3-5inch-RPi-LCD-Directly-pluggable-Displaying/dp/B01N48NOXI/ref=sr_1_26?ie=UTF8&qid=1505871836&sr=8-26&keywords=pi+3.5%22+tft, $30 instead of 45, larger, not cap touch ####Battery Options + +Recommended: PiJuice + + 18650 batteries (18mm x 65mm). ~2200mAH ea. Adafruit pack + PowerBoost Charger, ~$40 http://www.ebay.com/itm/3-7-volts-6400-mAh-1S2P-18650-Li-Ion-Battery-Pack-PCB-protected-Panasonic-Cells-/221923032745?hash=item33aba4bea9:g:0-IAAOSw14xWLSr2 ###INSTALLATION -####On RPI +Tested and working on Ubuntu 18.04, Raspbian Stretch -1. Follow [Adafruit PiTFT install guide] (https://learn.adafruit.com/adafruit-2-2-pitft-hat-320-240-primary-display-for-raspberry-pi/easy-install) - -2. Install SDL and RTL-SDR libararies +1. Install SDL and RTL-SDR libararies ``` -sudo apt-get install libsdl2-dev libsdl2-ttf-dev libsdl2-gfx-dev wiringpi +sudo apt-get install libsdl2-dev libsdl2-ttf-dev libsdl2-gfx-dev librtlsdr-dev ``` -3. Download spidr -``` -git clone sdfsdfdfs -``` - -4. Build spidr with RPI flag set +2. Download and build spidr ``` +cd ~ +git clone https://www.github.com/nmatsuda/spidr cd spidr -make RPI=1 +make clean; make ``` -TODO -make install should set up service? - - +3. Download and build dump1090 +``` +cd ~ +git clone http://www.github.com/MalcolmRobb/dump1090) +cd dump1090 +make clean; make +4. Run +``` +~/dump1090/dump1090 +cd spidr +./view1090 --screensize 240 400 --fullsceen +### Runtime Options From 0747f92a26b9fdf0d06b12853e56b33f97520052 Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 13 Sep 2019 01:59:21 -0500 Subject: [PATCH 51/65] added gitignore, removed RPI flags from makefile, no longer needed Former-commit-id: 99a0d6b26b6a7f07905e26ce72e12ccdc4234dd3 Former-commit-id: 63ba451e5c4e257babb1c939f6e4aedbdd47037b --- .gitignore | 6 ++++++ Makefile | 12 +++--------- 2 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..70ec37b --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.o +view1090 + +*.swp +.~ +thumbs.db diff --git a/Makefile b/Makefile index 996bd4a..1a67371 100644 --- a/Makefile +++ b/Makefile @@ -10,15 +10,9 @@ SHAREDIR=$(PREFIX)/share/$(PROGNAME) EXTRACFLAGS=-DHTMLPATH=\"$(SHAREDIR)\" endif -ifdef RPI - CFLAGS=-O2 -g -Wall -W `pkg-config --cflags librtlsdr` -std=c99 -DRPI -D_GNU_SOURCE - LIBS=`pkg-config --libs librtlsdr` -lpthread -lm `sdl-config --libs` -lSDL -lSDL_ttf -lSDL_gfx -lwiringPi - CC=gcc -else - CFLAGS=-O2 -g -Wall -W `pkg-config --cflags librtlsdr` - LIBS=`pkg-config --libs librtlsdr` -lpthread -lm -lSDL2 -lSDL2_ttf -lSDL2_gfx - CC=gcc -endif +CFLAGS=-O2 -g -Wall -W `pkg-config --cflags librtlsdr` +LIBS=`pkg-config --libs librtlsdr` -lpthread -lm -lSDL2 -lSDL2_ttf -lSDL2_gfx +CC=gcc all: view1090 From ebdf5e2575ebdef22f94adf0e424652740b423ae Mon Sep 17 00:00:00 2001 From: nathan Date: Sun, 15 Sep 2019 19:54:06 -0500 Subject: [PATCH 52/65] basic label physics setup Former-commit-id: 26342b786be888ee7583be5090e7af6542f686bc Former-commit-id: 31b4071996023f40277e820f97c2a83bce028d86 --- README.md | 4 + draw.c | 314 +++++++++++++++++++++++++++++++++----- draw.o.REMOVED.git-id | 2 +- font.o | Bin 36416 -> 36632 bytes init.o | Bin 45984 -> 46200 bytes input.o.REMOVED.git-id | 2 +- list.o | Bin 46920 -> 47136 bytes mapbox_testing | 6 + monokai.o | Bin 26416 -> 26632 bytes planeObj.c | 14 +- planeObj.o | Bin 42880 -> 43176 bytes status.o.REMOVED.git-id | 2 +- structs.h | 6 + view1090.REMOVED.git-id | 2 +- view1090.o.REMOVED.git-id | 2 +- 15 files changed, 308 insertions(+), 46 deletions(-) create mode 100644 mapbox_testing diff --git a/README.md b/README.md index 50a916f..c59b6db 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,10 @@ ###HARDWARE +best option seems to be pi4 + pijuice zero (w/ rewired i2c) + hyperpixel 4. RTLSDR (stratux) sticks down or needs u shaped adapter. +For future tuner, need to test audio phat w/ little speaker, i2c knob, etc. + + Notes: Pi 3b+ and below are a little underpowerd for unoptimized map drawing Pi 4 is smooth, may have USB issues with RTLSDR? diff --git a/draw.c b/draw.c index 889f381..f0aaf92 100644 --- a/draw.c +++ b/draw.c @@ -235,11 +235,11 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee screenCoords(&prevX, &prevY, dx, dy); if(outOfBounds(currentX,currentY)) { - return; + continue; } if(outOfBounds(prevX,prevY)) { - return; + continue; } double age = pow(1.0 - (double)(now - oldSeen[currentIdx]) / TRAIL_TTL, 2.2); @@ -250,7 +250,7 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee uint8_t colorVal = (uint8_t)floor(255.0 * age); - //thickLineRGBA(appData.renderer, prevX, prevY, currentX, currentY, 4 * appData.screen_uiscale, colorVal, colorVal, colorVal, 127); + thickLineRGBA(appData.renderer, prevX, prevY, currentX, currentY, 2 * appData.screen_uiscale, colorVal, colorVal, colorVal, 64); //tick marks @@ -350,27 +350,6 @@ void drawGeography() { } } -void drawPlaneText(struct planeObj *p, int x, int y) { - - drawStringBG(p->flight, x + 5, y + appData.mapFontHeight, appData.mapBoldFont, white, black); - - char alt[10] = " "; - if (Modes.metric) { - snprintf(alt,10,"%dm", (int) (p->altitude / 3.2828)); - } else { - snprintf(alt,10,"%d'", p->altitude); - } - drawStringBG(alt, x + 5, y + 2*appData.mapFontHeight, appData.mapFont, grey, black); - - char speed[10] = " "; - if (Modes.metric) { - snprintf(speed,10,"%dkm/h", (int) (p->speed * 1.852)); - } else { - snprintf(speed,10,"%dmph", p->speed); - } - drawStringBG(speed, x + 5, y + 3*appData.mapFontHeight, appData.mapFont, grey, black); -} - void drawSignalMarks(struct planeObj *p, int x, int y) { unsigned char * pSig = p->signalLevel; unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] + @@ -380,21 +359,267 @@ void drawSignalMarks(struct planeObj *p, int x, int y) { Uint8 seenFade = (Uint8) (255.0 - (mstime() - p->msSeen) / 4.0); - circleRGBA(appData.renderer, x + 5 * appData.screen_uiscale, y + 10 * appData.screen_uiscale, 2 * appData.screen_uiscale, barColor.r, barColor.g, barColor.b, seenFade); + circleRGBA(appData.renderer, x, y - 5, 2 * appData.screen_uiscale, barColor.r, barColor.g, barColor.b, seenFade); seenFade = (Uint8) (255.0 - (mstime() - p->msSeenLatLon) / 4.0); - hlineRGBA(appData.renderer, x + 10 * appData.screen_uiscale, x + 14 * appData.screen_uiscale, y + 10 * appData.screen_uiscale, barColor.r, barColor.g, barColor.b, seenFade); - vlineRGBA(appData.renderer, x + 12 * appData.screen_uiscale, y + 8 * appData.screen_uiscale, y + 12 * appData.screen_uiscale, barColor.r, barColor.g, barColor.b, seenFade); + hlineRGBA(appData.renderer, x + 5 * appData.screen_uiscale, x + 9 * appData.screen_uiscale, y - 5, barColor.r, barColor.g, barColor.b, seenFade); + vlineRGBA(appData.renderer, x + 7 * appData.screen_uiscale, y - 2 * appData.screen_uiscale - 5, y + 2 * appData.screen_uiscale - 5, barColor.r, barColor.g, barColor.b, seenFade); } + +void drawPlaneText(struct planeObj *p) { + + drawSignalMarks(p, p->x, p->y); + + int maxCharCount; + int currentCharCount; + + int currentLine = 0; + + char flight[10] = " "; + maxCharCount = snprintf(flight,10,"%s", p->flight); + + if(maxCharCount > 0) { + drawStringBG(flight, p->x, p->y, appData.mapBoldFont, white, black); + currentLine++; + } + + char alt[10] = " "; + if (Modes.metric) { + currentCharCount = snprintf(alt,10,"%dm", (int) (p->altitude / 3.2828)); + } else { + currentCharCount = snprintf(alt,10,"%d'", p->altitude); + } + + if(currentCharCount > 0) { + drawStringBG(alt, p->x, p->y + currentLine * appData.mapFontHeight, appData.mapFont, grey, black); + currentLine++; + } + + if(currentCharCount > maxCharCount) { + maxCharCount = currentCharCount; + } + + char speed[10] = " "; + if (Modes.metric) { + currentCharCount = snprintf(speed,10,"%dkm/h", (int) (p->speed * 1.852)); + } else { + currentCharCount = snprintf(speed,10,"%dmph", p->speed); + } + + if(currentCharCount > 0) { + drawStringBG(speed, p->x, p->y + currentLine * appData.mapFontHeight, appData.mapFont, grey, black); + currentLine++; + } + + if(currentCharCount > maxCharCount) { + maxCharCount = currentCharCount; + } + + p->w = maxCharCount * appData.mapFontWidth; + p->h = currentLine * appData.mapFontHeight; +} + +float sign(float x) { + return (x > 0) - (x < 0); +} + + +void resolveLabelConflicts() { + struct planeObj *p = planes; + + while(p) { + + struct planeObj *check_p = planes; + + int p_left = p->x - 10 * appData.screen_uiscale; + int p_right = p->x + p->w + 10 * appData.screen_uiscale; + int p_top = p->y - 10 * appData.screen_uiscale; + int p_bottom = p->y + p->h + 10 * appData.screen_uiscale; + + //debug box + //rectangleRGBA(appData.renderer, p->x, p->y, p->x + p->w, p->y + p->h, 255,0,0, SDL_ALPHA_OPAQUE); + //lineRGBA(appData.renderer, p->cx, p->cy, p->x, p->y, 0,255,0, SDL_ALPHA_OPAQUE); + + //apply damping + + p->ddox -= 0.7f * p->dox; + p->ddoy -= 0.7f * p->doy; + + //spring back to origin + p->ddox -= 0.05f * p->ox; + p->ddoy -= 0.05f * p->oy; + + // // //screen edge + + if(p_left < 10 * appData.screen_uiscale) { + p->ox += (float)(10 * appData.screen_uiscale - p_left); + } + + if(p_right > (appData.screen_width - 10 * appData.screen_uiscale)) { + p->ox -= (float)(p_right - (appData.screen_width - 10 * appData.screen_uiscale)); + } + + if(p_top < 10 * appData.screen_uiscale) { + p->oy += (float)(10 * appData.screen_uiscale - p_top); + } + + if(p_bottom > (appData.screen_height - 10 * appData.screen_uiscale)) { + p->oy -= (float)(p_bottom - (appData.screen_height - 10 * appData.screen_uiscale)); + } + + + //check against other labels + + while(check_p) { + if(check_p->addr != p->addr) { + + int check_left = check_p->x - 5 * appData.screen_uiscale; + int check_right = check_p->x + check_p->w + 5 * appData.screen_uiscale; + int check_top = check_p->y - 5 * appData.screen_uiscale; + int check_bottom = check_p->y + check_p->h + 5 * appData.screen_uiscale; + + //if(check_left > (p_right + 10) || check_right < (p_left - 10)) { + if(check_left > p_right || check_right < p_left) { + check_p = check_p -> next; + continue; + } + + //if(check_top > (p_bottom + 10) || check_bottom < (p_top - 10)) { + if(check_top > p_bottom || check_bottom < p_top) { + check_p = check_p -> next; + continue; + } + + //left collision + if(check_left > p_left && check_left < p_right) { + check_p->ddox -= 0.1f * (float)(check_left - p_right); + } + + //right collision + if(check_right > p_left && check_right < p_right) { + check_p->ddox -= 0.1f * (float)(check_right - p_left); + } + + //top collision + if(check_top > p_top && check_top < p_bottom) { + check_p->ddoy -= 0.1f * (float)(check_top - p_bottom); + } + + //bottom collision + if(check_bottom > p_top && check_bottom < p_bottom) { + check_p->ddoy -= 0.1f * (float)(check_bottom - p_top); + } + } + check_p = check_p -> next; + } + + check_p = planes; + + //check against plane icons (include self) + + p_left = p->x - 5 * appData.screen_uiscale; + p_right = p->x + 5 * appData.screen_uiscale; + p_top = p->y - 5 * appData.screen_uiscale; + p_bottom = p->y + 5 * appData.screen_uiscale; + + while(check_p) { + + int check_left = check_p->x - 5 * appData.screen_uiscale; + int check_right = check_p->x + check_p->w + 5 * appData.screen_uiscale; + int check_top = check_p->y - 5 * appData.screen_uiscale; + int check_bottom = check_p->y + check_p->h + 5 * appData.screen_uiscale; + + if(check_left > p_right || check_right < p_left) { + check_p = check_p -> next; + continue; + } + + if(check_top > p_bottom || check_bottom < p_top) { + check_p = check_p -> next; + continue; + } + + //left collision + if(check_left > p_left && check_left < p_right) { + check_p->ddox -= 0.1f * (float)(check_left - p_right); + } + + //right collision + if(check_right > p_left && check_right < p_right) { + check_p->ddox -= 0.1f * (float)(check_right - p_left); + } + + //top collision + if(check_top > p_top && check_top < p_bottom) { + check_p->ddoy -= 0.1f * (float)(check_top - p_bottom); + } + + //bottom collision + if(check_bottom > p_top && check_bottom < p_bottom) { + check_p->ddoy -= 0.1f * (float)(check_bottom - p_top); + } + + check_p = check_p -> next; + } + + p = p->next; + } + + //update + + p = planes; + + while(p) { + //incorporate accelerate from label conflict resolution + + p->dox += p->ddox; + p->doy += p->ddoy; + + if(fabs(p->dox) > 10.0f) { + p->dox = sign(p->dox) * 10.0f; + } + + if(fabs(p->doy) > 10.0f) { + p->doy = sign(p->doy) * 10.0f; + } + + if(fabs(p->dox) < 1.0f) { + p->dox = 0; + } + + if(fabs(p->doy) < 1.0f) { + p->doy = 0; + } + + p->ox += p->dox; + p->oy += p->doy; + + //printf("p_ox: %f, p_oy %f\n",p->ox, p->oy); + + p->ddox = 0; + p->ddoy = 0; + + p->x = p->cx + (int)round(p->ox); + p->y = p->cy + (int)round(p->oy); + + p = p->next; + } +} + + void drawMap() { struct planeObj *p = planes; time_t now = time(NULL); SDL_Color planeColor; drawGeography(); - drawGrid(); + drawGrid(); + + //for(int i = 0; i < 2; i++) { + resolveLabelConflicts(); + //} //draw all trails first so they don't cover up planes and text @@ -402,6 +627,7 @@ void drawMap() { if ((now - p->seen) < Modes.interactive_display_ttl) { drawTrail(p->oldLon, p->oldLat, p->oldHeading, p->oldSeen, p->oldIdx); } + p = p->next; } @@ -424,13 +650,6 @@ void drawMap() { planeColor = white; } - if(outOfBounds(x,y)) { - int outx, outy; - drawPlaneOffMap(x, y, &outx, &outy, planeColor); - drawPlaneText(p, outx, outy); - } - - if(p->created == 0) { p->created = mstime(); } @@ -457,13 +676,28 @@ void drawMap() { usey = y + (mstime() - p->msSeenLatLon) * vely; } - drawPlaneHeading(usex, usey, p->track, planeColor); - drawSignalMarks(p, usex, usey); - drawPlaneText(p, usex, usey); - lineRGBA(appData.renderer, usex, usey, usex, usey + 4*appData.mapFontHeight, grey.r, grey.g, grey.b, SDL_ALPHA_OPAQUE); + + if(outOfBounds(x,y)) { + drawPlaneOffMap(x, y, &(p->cx), &(p->cy), planeColor); + thickLineRGBA(appData.renderer, p->cx, p->cy, p->x+(p->w>>2), p->y, appData.screen_uiscale, 200,200,200,SDL_ALPHA_OPAQUE); + } else { + drawPlaneHeading(usex, usey, p->track, planeColor); + + p->cx = usex;// + 5; + p->cy = usey;// + 10 * appData.screen_uiscale; + + if(p->cx != 0 && p->cy != 0 && p->x != 0 && p->y != 0) { + + thickLineRGBA(appData.renderer, usex, usey, p->x+(p->w>>2), p->y, appData.screen_uiscale, 200,200,200, SDL_ALPHA_OPAQUE); + } + } + + + drawPlaneText(p); + } else { - drawPlane(x, y, planeColor); + //drawPlane(x, y, planeColor); } } } diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index d84e7d7..8d1d3a5 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -3329d96b9e8da09d38ac06e8cfcb2c9227d0593e \ No newline at end of file +a17d06a73e34e6e65d1ff9ed411da79667154ca6 \ No newline at end of file diff --git a/font.o b/font.o index eb8e2e3577f2bdd21a00b071d8a63bc37253c0de..120e521686b8a969be98ed81022bf71dd8a63f41 100644 GIT binary patch literal 36632 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 AtpET3 literal 36416 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 delta 13622 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 Jq5qnO{|0vb*+>8Y diff --git a/input.o.REMOVED.git-id b/input.o.REMOVED.git-id index a79dc82..8dccc44 100644 --- a/input.o.REMOVED.git-id +++ b/input.o.REMOVED.git-id @@ -1 +1 @@ -2c4ed2ab46ef6a542479d8c3c9ea7de7298325c1 \ No newline at end of file +2305764a62eb8dd80a5f71e908a04bfaa9bc3cc9 \ No newline at end of file diff --git a/list.o b/list.o index e3a4518ca6cacd90b14d5e2af7ebc9d790e8097d..cdfa6838a681ecc277eea074d6ac90be1cb84a0f 100644 GIT binary patch delta 14600 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 EH$JULg#Z8m delta 14339 zcmb8$33wCbx(D!?w8d_Kp~5giF=4YTQUWa?NFkzNxuS%{Q$fKX3aCI+1Qd}_M5PK! zc#jrPmS9B?5JO8*4tflt0ty(9B61X{+i~R*kINN2a^ElWpEkTM_qp>tG&Aq-TjpEl zo0+DpJ>}SY(y=tpvFQ0o=b@>Nz3%E+sh65*OPl6;{8W>>KF@!lrrp$9<1N>#_Fbvg z!R6}U#Cg`ipumN+pv~36a*i!(s%2lo$pgIKcrfqG*0RT?Xqqw{H%jkiYFfucp~F-> zgWcM4@^Y{JmLr)79Igt&zEAC^Tk#PEynnv6KT_>qkk}uRJ4z*LX~F1^()n~z&2>+n zQ%$zY)Up-MD3~}ehn2LA?x=3>%Fy+TshhiHu!CFE^6s2os_EycJZkIY*YtE%c;aB% z^x2x8p<1Z6&gzGrX(#QHILwOihqar1qr=|4Kqcy`64bivjJbA3tDH6kLFK$9I>HLJ zKQ~SNVK$ zqO9deJxH}mZC2(h>_aQ_U@P$x!TgDuK17|qm8`hMd5KIo96HuI(z=gE-8k0tu~}_2 z?HbQLh?wrd`|oXh=_ zVt?mUhOhtgEb>fJLfeAsRC?8)3h&vcVhw3Qa(nxrC3^2B7yaqE{kEc~5)~EJSHydE zMTtUx+pocbvj1--8~%?0)e=YgJ4jSNaA7x(KTp<_&~lX`C9{c+BuVGAnOk?jDoO9&a26{3>2Je3IBf7g zF12B{pVKARr)8f#dv>7KOXH2}*RtCvMtghR{ahi3k<|)?4-YTb~ zzgmA%)HT;<{P-Ds{1zYc?lj)*$GeyEKiPC64NoCU}YW=M^ z-&by|-_823`rX{|Mb&R~{7R=+^2}gfnwFB@H>+P(agM{_1-Rgx!_Iuzq(Qqh9P;{_ zrH?lB99}@x4zFwt=xC{F`3)s$TK8PtlQV*om1JF?rSf>vG>@ttsbBri6Lb6i;krb^MLpe1K+f z&vEHmzi!$9^D=W<`z97lYockF_2SAktv?8&X+_m%IxWgdFD;ussqB^+GpZLCKAKB! z4r*NO896DVy7C4+%go_hpxT_)N8-NPl=lZyWRjuBY2TzF`XF*nHq7RYtt7=F=*fN!j7 z+iHE(x9&LkSyypytL!V&LPMe~Kmsg89udUB=E ztH^n~VcyivI;$F?HRNUO;I{OjP##~_#fW|(^lb{WwnlF_FdBAWEu`Pp zq~Bqf%W^I4C3FROShu3&;X((HpS1>aa;DHPD8%~T=UXK&5!#lbtfx`$5uv*&&N?UY zh^uK|3f)BRsfL+_QE=k<&u%Y|FYDvbi-oqLa@I!et+N^?v?)bc`(TX53r(Rq)(kZP zd7CBFP0neC*&p>jCiD~XvJSVhYMX_2q5x|*%(^{7=Tn$IGLSLpBYb`(4tL=NC z2S}f8n8Prynx|T+?7m7R59=megS~`qAwTOaxc09V+Jr)^sTje@LN`&A^`{K0zC}Xc zr#S1htAIjddrOG1k%!uk^W`D>wjsg8A~x?l6w4C}7l z8~ny`r(u4NYpS!*KICO>k8>U-bQc9!Pj;|Mt`K^J!m4CkQ(>W-DaJaKUt84nqR@_{ z&osJ`B`tq`lDm4?DkHh5bGT%*%aEGqO7ej>pVg`QJnQZ z$XhJ*8FJ4u%qKA?{X$2PkM$i~DR&F?Q90{2^khir7K*U0!(&lYXdkL$y#g!hDWL<& zIomM*g+5BhHDUM0Ao8->J?RqKlLE61{Rmae&NpLNXYLniZlV~Ma0uhLO6cRH-^I^1 zScSF={Wp17f5Dj_66z;EYZk`hOQCHk#5xCSV~T1JZ+5#5Qt zw3^&=4KovW#QTL7l8<#B`Z+ALE0wc8h?VChq16;&U5K^x1EFP9$NHwrYUd9^>&SVp zVQxS_J5h!``e(??x)gaX5xSQGtj#g&iiIAe@V!RyOsrbB2>ls%jTs`o1GA-E#3z$J z&oKXn>wS~Zz2sp%gZ_C#Xk+rTUW7CGL}(g?SeN5ob5>{-MOoiP@3q3LvHRybuhhrvxD0C6I7w{E? zCyF11E+Zf7_vr2O@kZ6qC*`agan7xUmQaLs7@nN+gnmnPtOZzY3WWA1=Y9Mpg|QeY z^aJv;)?ytSBlKPhusX4R-YRqyg;~#{-ZG*5M#K85Y9Mcmg&L$UG)xz+#N|TQl84oU z-l!59A^$?7*n@t4Ug%F)8*4>;HP-iCBK`?Qxvn*+>pw!*P@MHeytQ3`yO2FYeqG|aY$J}cBi9@c?~)(X9r{H)^; z-7Rz~g;?hzdQj+Gin2b8tMRDNl@w>)2>o2>3*=s8m~TM86MC3@te-)D75Y7uvrdI( zVjZ<-&LoPkp2F`&S_s`rb*uw1W7`V7kDL{T`47y=ZbG+_m$eXAR$rkVD8RZ6_nN^% zyHl9;3s>Tj)kX;Ylwzzqu^NmMI+yf^4D%SGw+VHUhqVCDma~L*CqL`JG^^ePLWfg` z^(N>eLQ5&iIv=`H=u(Qau7$1_`aHQGHq4iC585X55cyb7KwlO*iON~8!nLqp=x~a# zdXe|A(4|zz`Zuh}9}7J}&c*y(io487p+54mzJ}+I(?ZKAz&am!8{yr>o^^Q?X8i=C z&`fAG#aItu*0mA3g7hUk3TSUWNpeXAV z&@n=8@f|yDg{`ZqbFY%+L6Mny`k?29YitK$+&)x z32jaKQp4PWC%LbL-bfzS^@#o`bOZTWU+!RCzYg@7-5bX!#5xnRu8Ghhin31cXyv_7 z=pz(o4dThCqtFU+hYa%xTnjyf4kjP#1U%am3FRke)|JqqLU&VybwBhvp`TM7s{`$w zAhZoRm$9nm^EORrbMmt0LFWkVM*-GrpbrT3Q<(Kms698;p}NgHNHNxx(A6UE9@5Fs z50FXu<^&ff=dD(xxtaXL-$7t3b_?ZkWX;4{dQj-o6lMJ!tH)8H$0^Qw5$-#m3;jE} z|7w``VJ-Vk=*{F~J&AX^UxhwE<*buXZzi6v?LOh}=2+jsy}5-@e&=N!;!1Re)>h~a zaz4ht1H@T%6IwxD)+ey?^c6ag0<1fsgN43DVb)_%`wh%K=b02^U556K6M0`D{c*!A zK`-1U^jY$-p2B;aPX3(C!px9fm7nz0ir| zuHD)qyv%l|oxmgtZv`yg}#ys$=~XJy|PsIXRy&%*|Ne z_6W@;FKZ!M^p4Q`D8Tv(uB;P62UD1}1nb*Lp(iNDnu}}a7omS4{Yk?djHeU>Gu`g1 z5P4W{x0WcaozVT{XFY_um@o7$3b9tAMP8wm6lE;G^OZ;#(>+#upVkY^1)p`qXI6gq+YtoED6 zVxff;Vr_=Cy-H{?MOjPGid{k@6jzGb^RCbZD;v+G)_KA2O zocDVoUWk>n&Wewz|B~tq9;;7^3{Ror(}=58&13a&;-`t5tKFSVP)-NZtN70&guaLA z)|Wi2gM_AFVEGq7tR+Gh;#FoMg{q9;RG|ydad#uG&J%r*IL`$l{XJ;cBT4D=lG;@% z(r03Mc*=?gHB|v_X^Cu`MTS;*cYYzMf^JC_L`C{jXx@RO^p_;1KYUJlzC*l+CG+E? z3|*5le0@#^P5T-X{ime#xJIp9ctEvBvYE>YXOnZiQRs%MW_PwA@w2nYRg8Y>uHsZz zn?sYI&ZfERv(0fyDb*dj7^O_5@OmRymZa+SW){YCZc<$3+KXJ}NpY1PhuUHhZ-kpu zrHF4t`RlBBFmWMZ?k1|(Br>c)_iay#s}uSLCuBeU+uc`**|$fex1Xu^CB+-7KQkSO zf(|BuYMK3K2}hFRs^S%DD0urQDX!An3-7;@;wt@TNdHYzT&3UW;vZbUc1FM*Sl#TY zZ?~)(OM!`@w&UyCav{9siTD_FYmcP3I-xPR1bcH_)nC6B{RgYW;G_)dOe=7Sj27`N zxDLlB#Z?70s9<7JT$S@>z(f%r$Ff?8CNN_CqIGv^{Mnm7A&--5Ox=Vrs~47JNFN0~jz z%X*p67}QIF%|>u?Qpw2!HajV-e!nN^)h+mC(m57%jzR`-esBcm)RPeR} z3P*B0|3p^1(e_i)c`i=Dn;jpEobAcKh2Q;L39Q!@Q2yJgEk=-pz7O3Y;`W{QposUe z3fDdp@f#37ofJnuC#0o2@j(|q=L}wF?bk0~$I&HoMSLjEtwO~2U_D(T;zuy`NW|^* z>#VqS>r%^$1MB8`k-?5{5pnwu{33r4e?i2n&@lToQO(b$T2Efr0I!M+-=oXkka3!_ zHQ!O`u3ouyoWpTsLiOp$>$>ADH=XFxoHkWw(244nnR{`Hr*`AW~&4Y13rlBkrqER?rvj5J0xV%D+6AlXSgoL#Nl{VpXgrMzXKv*SrEWWhhcbUvASDG>-CR66(3XhvirDW13Gtc!Ux-w-l3tdf=*>5tZxY{UlnaM12?WNMb zY%)t-S5fAG$*gi+Luv<2rp9#_Wo|W@TFD$TnL5ebZ8Ga5bJS!ST+8U52Tf+Z)a_A| z+2A@z&w0X{P1mi$+hiCP6&~V7ny&l?Cy~C3n~PyM!mX{eN=mm9D=9rjxw3mmaJA>K z88GG16ne;}RaQA)s$fxgu8X-zH|M0?k}fH|kCbLSNh)O0WP5+lk2lE!+2oa(WbtCI zQ`s*_Yj&Y!&9!FG=$jjgmoUk-)sh*vkTNELRAI(x1re1ckH3Zo8)&dr{ugD zMO%rNHCEFNRjgv9OVR}*3q=-*EEZWJa)!uKkuyck5;;3ls;7C{QZv`PFQ4|hl=A<0 zYNm{f9{!uk$lNz-kyDW;{mm`5=5s$4m7U?*Ol2%cT4iUt9-z*&77SZuYb5Df&~KG} zMv?^!B39X2NfufQ`OdN$7e8EvVa^5TQ&J4Jq_mxq7?JX|ZkjJS_4^z8U+yXsIY(r< z$O@5_BIk;nC$dW9e31)8E);o+$VDPg6}edC5|K+qE)%(2@$R?2+MQ###mdMQ_w}?Dj z7TF`xC(L6ISm zy&|`Z+##}0FVMSfmnQe;YGTI7VtNs+rnPKn$ja<9n06Zr*^Ule(%$bBOBi~N$vuZX-t z=Q{oC?jU$efDJsl=RSm{X}a%`~T3<}}-!%FJnwIhC7Jg*jE4(_C|!XHHe-G~b*S znA1XYI>nq8nbWD}wAh@MnA1{oT4qkm&50a8oP0%R%IV}?((nS2g(8bY7MsPQa_^<2 zFN=jN9+msAb>!!6zthey;=Y^bdXVxnd1;cPr1Tqz0Y%s%A1a@mtlbPD-0Fx~i;)(k6_qn!{-mMpu<{dbPxXRh67xXVP;y zy~(7jxB|^4J)hHUCcS{uohH4I(_WK4h0}hMUc~8;NiX4apGhy}^o1t9>^AC^T_#=4 ze9)v9k3&;`EeBpTRx7-=tS_`hZEVxsK8YDFWn?FDd=9 z$Qww?fL49xV@k?cRMmv22eRFMDwSJW}8eK$ELd~Ovc0gG=fY!XU37~;LH>;ZIx(CS{E0zw}_*P2W{Pv2ayPz70Xsv^}fV}O0=rBb3sV&;B=|secT(BCcTr>FpdjYXOZEbeU*x- zwj)t4(>(CPs~is$IKPks-)t=mESe4$PX|k;gEOXsrPINg)4^HO!P(QnvgzO)CtRM4 z4qEfeozQa4b*(C|nq64Fq`Z<=rGkZ4Vfp6STV`|gSGdxeJ^LKGM$-^U@|49DL}{Y) ziM3{&ZtC|6*Thmid^T+=DOI=u3Am^Ev1s?XX;eUPgp>eC?zFS zVj(I)S<5;_?jaLcl>3YVGJ{j4kYc;=#VCZH$1Pcs(@wg3Y0g#3E~|27yJR_)%#WAa zbII0H`X^4(Y~)bRdHj^Nq6)0XNV;4fmd_z6J7S!#n@A<=Vx#?a!vh0#Q=6K?O^r3N z(fGtv&2W68Ze!hOd>}S47_~$XnS8ze(R9k8;>b*|Uzgr99(CST7i{x3SXL@MI2awO z9kHl_qC`n*9@TO*VUnaFNt&anJ*jXsnT(C5(&k!vbSxU?G`;*z#0d{lniPkl>BM+C zJdj96vxUUdH50U@7B^%pk{&V2RFN=0BtAfS8UW6Zk4{Bnsce37bTG>G!R6FIBtDQB z%CclMJ{V1A^XW7V>IZT@gu zi+8&x5bA1mdt2NA=jHZ>^%^u<;nYYXneLw$vO0Qtt6S^qt2fp*)~>6r8B0&Zqg#ig z@n~{%fU=R~z{plIvYMvG>YCx|8ecG8MvfoJef#G2hxdT4Yi$`C{GDRr_vM2 zs72-P_R>gN;Vxe|mKeAsoR;f;ck4D!n=jDj355Fs9WA ziPyc;*Bc6NqQfFvrT?A9Q3Hac>9Kmr0M<8HsnOwhB<77yMq`p5j*Q7Ob|**EQF%(7 zde91{Bk2iaDLY2vgNfbNo@gvar|?iLGOSF<-5L&te12;z6^usX&gZuTx;i>TJ)U5& z&9|cmx0_DxCg|?)wD|hMtv;_W5N_!Wg?v5X78xBYoQMsE6GKC(sA`hmw}bl5%!;V$ zy;iS>>`#nKEZ$-2Z62>DX^o!*`{U!JPp+Z(jTN8^_`ulU`) zK@S-~D$SK~UTg1yVLB|Lp?)3z$49G z9o#G$mPnfF#g~#smP?U ze@BhI?w*c~&c}Jq^H5jNM9Z7HKJpSyUFtv2`Mqv$&>d{l&7^BBT|Mr=&b(WAHuU6C zcPJ0Fd0M-=-Cif(oMZB${fH%ixrtFz9F-nV7Eb1&9 z<`JUNa$acd4Fo(rtvh>rx!#Z+n(JPA>2dVEyTjeple<`310#_n zSFVNBrMPMRLywP4vW5J7(Ca4Sc9hxG6Qp%Y3Z)fBJC9z~#omtIF6aGTPkX3^=E63Q zQgyg(wLm(qHINS+jYZ=LD;yq=4F2C#H#nb7z1>G$rP`CT1SvyxJXTqSlQdPOs65Z!?e3Ec4i81+q|An=1dp36 zSdMmz`!oi@+#Lwex+jZxOGm&OvKHHPis|(jhdZDG3DPICFbi*P zY)1Vd%O_i$hwO!YTvH?YII{n)!6_>|o={71N5H+E*NI8fWJiCS1);%NReFT4HKcvW zb|3lgyk0QFP0O6K2)CDP&`ryeqZ_Hvl=YgXG*Jr1|c-k~R^E~Q6_GD!L9<|UYpQBs~-AAzurUE}LXCmg; z!0q=1Ljj+^({!f4tIy*N?eu%Xw6c5p%nVVm(b)#`yzX9asLSs)W~Xl0Bn$s0niJ+F z&Ut?e#iYae-Oa`3$1On$4{2q0bRubbILfyolf%K$;cPs(Lk2|anoz_+J^HPIf`l%g zasWY3cb8f9GXbZw9y0YL$aWM?)jR2XSH^SjTE+2`3GwsYVIU_mAO}NH-b7SxfO%7# z6t;Gow*bV+gVAv^M@LmCoV0x#lqSYc8ZrbtwDx|+zk(b|xC4a-)&w`W@qzkoSv5pt{dUr(Q>HE%Vu<9T*t9J0_-#V7JFe4=-GK5ei< zq4sbl#>GXB06@doN=k?0YiLS0F*Nr5`qIGfFA4*LO zM(Tz~({-uw(ZM9Wb?>FkCTH=~7b;*N!u>q`TMb=YpI3nL-0G!D72hDY=h$lAR!Af5 zgyAhg!fr<+)ePXhB(hqXgKPkJRd(EPmYAu$W92&_@oVg%Bwpj44#&N2XV%0f`7f8P zPBrCW)#$Z5l{=hS{nFsPdY&`8&6!n`x7&GDO+fYjucFTLo%h-=RrES8?^TXYQd2|C zHD%4)odxf3W=*J`amgy$yFiq)j>XJ4^Lml%SScPc1D6Z?I7%6keJtlQyWL%;<8n+g zQ$nUHJ9e0=W}j|6GM=7^FU%v!Ps1Wjm2-CfsOUZk93+|^i%hlgRv~w&xfQ!=8=A;} z(5BerDD5v=yGLk?EMI9o?W#G3;v}yyvV_aK0-Jh!m)8>>kI^2RndBV7I7$idyC>>z z)}qKDc@L>$rlHdOb}UG_9qs1%%rDinhsBTMEkv1kIWObW&C`G<)EnrrBIDz2w6iQv z%NY?V)lp0Hsz%lHCWfUCWv|uLQu-S`*+_>8GcsO#vBmquhLmY}9P%BNe+F5Do6(3x%2jB$CViNWa>ig(>@%9%)LmGzI@l5mPQ zvmMV1?hFPzY7WcZL}%W%1iy2NN27>H@1V9T*WIqntz9hz?TyZAw5x@oT{-V|72~&? z*_7#*cC$T@opZ*{sE@NjW!?)$cH5Vt242(25c4*8>;a(&TknDyJ2WkA=?Znzt3-ge z?CTrW>*m#)`eo`%rSc}K3Gn3;4`2VqG|O_{5AvcDp0XVQAMMB*d&+SYG?Coc**-}d z%nqO2m|NA%_C~hn%yiZMf-0P`h@8nL4|W(-J8kDW0NrVCNa^*h-t=9rPoM((s2^xc z9lj>N8?XWI?2Sy%+Kwg%Y?2QVXeTj0M#x61y3U@yRG_KblV0F{yV0kyHSwUT$yT;iI#D)!KcAl&&O*K7jmOICz zX8Ml`RlyAr6_OKCkqr^$kBHkmbnZDxJ0J2NxIPvzpsx>3!AsMN9Gg38Yq+BH< z<1GX78La-aiLWbf$td3;Wp*&a0~1O5JUKQorZy49`_qEmNn4hq_$)Kib{b#o8iXg} z6R9Y@f;k4&TyG^mn#X0SGW$F-^(El3I$B#dSFi5vr#IyZ^T}&X{e1(#`H}e;db6WF94UX z{^jWNSGBkt`^mQcN^toLhaCMg!R7n&Ieb01e2*xHZwBYDe(+(J@1`_Ax0)dxHt(P` zbACP_HuqAR`D&qA9t2;jc%Sh9JW&m9-xmhA`@udBDg9ezwM(hdl$>g6%YO+kTkyx6$rkNXJ}r5{qZP7=Z1O4_ki%T)ra- zZjTM?EoVW8t$!`_KVxu)ACN!Kuq^s|jvTiB#(5@xmf|x|PP5`W| zO`h$M51ZeK2JJLB!~cva8dd!Jcy3a0WUbwb|3tpxM}GyTcp2*RRmEqZ!)!aY>sf>j z{*Kar5`+0Y#h*uiKCZYI?fQk{@3Ui~<0W&-^uvEg|G%mDyBOrZD9&HPW;mQ~c^>ras?P{0=zs2Nb`-s9Qf$Jce<9M)6<6PF_;{7S#VO#m~cY z-&Op4@B*~M9>+fL3dO_VOBLsDU-NOM;y*(_Y*hSXqi&s}_>(B-JjIV--fdTW5dNWG z@n1pz8;T!<9Uf8qaV#kJE8YnEe?;+K)bn2zH{YA5uVpJfANKk0ihm8`@t)%IFphH( z8rkFW&lvaRimyODKdty1SP<4JJ_F@!P<$);r$g~qG427yAIEbqQaptAjwo*1<%HtT zVV>?){1w#yD~kUX<8@H+Q&9gq6n_Wv=&<7N%Xj20>syL1!gzdF@g->2qlyx$nB{(Hrr1pkxbJ_La8DgGPqj}&*qZx^8dY`gk7^vz$pX4lg#sDHWA z|2OpKe8rze|1Vbj@37w0Dn10>sQ4#XPd6+61Ju7q@iNpiq`3L3dds>%@xS7^yA=No z>OZ7-4fJD*??t~Q6)!+JQ;I(izj3MJQIvDN;-hHSt%@(e`go_}-$XqRE4~@yb&ulD zVBJ5e_}!?_F~xVl4xdu|3Y7D#;@#+n7ZgvTJ})c&Cj88C#k(+1-%@-v%70t&=ipc0 zQQV$yA1MAF)(aQrw>>XD;RGF9PQp7B-wZzxI0?U4@t>i+%osG-U5EF;^%|kulO$T2NgGeL2Fr$ zC~p4#m3|{Zar5`Ami3h4=C4sL>siIWjpx3g_<4FDq{TYSXfgEB*$`c}wwk!QWQA z2=ne8#jC(SQ2aD-`z6q}+j{U4tn)T+1}{_muXqodr+5kMWRc>(gCAS2_-g2{RQyx0 z+ck=NpubM>TIe?^{uImKOw zH(peHF8C{ouK<5t@p|yzEB*tl*MCy{RM^9NioXHr<$R`HwA{|$<_fp1d$PS}qge4Q~{>wU%D;GZbI3~_G}`pKRbpNIY|#V-S|RD2m6@j}JF06)J}@s+SEdwlHY z(x0u$v0CZhfc3go@p~}tjf!7|d9+#aC1`)M;@6}9+ZF#7{D4>S=TLq?@c{flpW>@v z=buyjM`+ie;uoMFE>?UD@yxj5JJ7C4#Z%y4P<$K4{W8Ue!4D{I&)aJiKLq_76}RV! z`OUHHI`Vte=aAAbLH>y1KgYP-tN5$n_bdJv@COwyf!}yU@l(N{P<$=;Q;OH3|DRRd z3;h=q4}-s~cmVcrT=9#se!Zo52zK(e;;+Duy`%UV^uq^=AA#SnKjO6K-6;G_3GCPA zFM*dS{#o?HJjIXUdFH1Lvg3Xm;@jm)|LcfDRw{14SFch0TKE(5n;F^i??*XJO1}{K zvlWlRZ?q_Ge*4G%ZIf*I#fWcvl>Q$uz9Ge*#yWC=;`buIOYtk=KZg{*9sL9Demt#RFK^eyq5?Pw}+k*JFI2Q~Zy3?u&{a!+f#dhwS;aAM@*V zrSFA({$BBYXz!mC|2)x_<}3aI z#&NOYS3|#A@hj0krz>88{947IgnonK=Jzq_w{sM?_Z`kr{8aQ$o8m_?F6Sw3zlWG# z56$-5P0-t}^lyUwU#R$Z&_Df(-;I3(JHF=2Jako;z6vZFDgD0^W}dlejohy8;U1T&VMLA1p9wS@$HzuA1b~W_EUf}UuJvg zM}1~0-hld4D(;4zoT9kB558RSLHLVRir)ynR`I(~pY@7QLVvU3rO5jfp98;Ye_m?0 zH-UD2R_Wh>evT+UANDz{co_3&Oz|Zy4-=eYMDOa^{VYcxO=5M+{(Q;q=Z|5Bujc4u3W>hGk8A6{ zj(PNMjy}3r^gmJcxf~Z~VLh?SX+t>+6}LYxKTYwyd?Ow9zOP-*2kWn87}qFX z5B(;^qo_}>;`QoI5E69eb@1y>?HI-&GGgg?Jb@t>eSuT}gy*ynAEm%)!6QT$5O z|9-{42zz)$@fGmHPbq!|_zQ{;!0#Pb{9gEN)qEjTCJAK2x*jrN|e^zHcjbBg}}?Y%_t5%lwv;w@NrzM}Y_v3^~zcrD6VfO^^W zd=341n&NMOPb!Y$t;@jK-cS{>w;PoHN0?Xkd$axAHjKx&mHz2cie-II@hzy&>x+zb1BQ}OlapTB@}yI?v}qmPvSeVD(cushaAXfFD5!R_|mf=OxbJF-5e zuIQhx^y@Hwc6`M8FhSAZqV&Iwhj--E2UAz{{Yu}1_FkBykB@9cKdSU!<%ZDl`5b*L z6~gx_eg26(KCZ~oN60JuI;Hl}TUtmywShr`5$!+ps6DMDD`R&8p}82vFgozqEk98R* zvTEb>b8@xxb9D4`a{Mz_|KA6PMLfiId+h?7?SwkR95QqTrI=wFWq31E>oUY7^!;ZL z<|(f4A6NI;S$%&!UC@km?fc)y_@3 z=Z|2Ld{JFgS<8Qt`+ti`Sxwh-4}JeOx;S0^cMX`kY~RQA=dChbfByRhT_)dI3@7rm zx~Q@in;^4wd{fTxOE|5$xi1NH-M-&GPlDx6oUaFyi7=VxjYjd5yK+{NI+0*f(=N;bUC(% z!U+(6;DdwWQjCHMT~fs&jYdE#DjJR=6^^o4q~b9e1?mCR{&wd(J^0;!vh)4ixpU{f zW;W|SwEueC-rOhVwuLqQ#@UNP<*VAoZBFWtxg$}&ZPzJrN1|o5Xl?1I!|nSLB{^|z zpVu{--z6I5M!u)Da1Zh#2WMNk2ctholtYP=sy^3jU6R#ykCxx3-`n-kFM2#c|3u11 zk6T%7gRz$Nfp@&pYTI3pBj-kar4<+dKs(DyiC%PaByX+mes1d1Vd}&rO`@0|sR-W- zg0Xj6R=f+-=4#&F{XRYNy`%emM&yJP_xsFzttZXW>Mgxuq*C{ag;x`$xcv`y*ShJx zQoCITJ0W3s!iWUBgJpHC`zSdzMs7}xll`}Ll(QW-*8RQHD!aw>8B_D?dYB1z-P)AR zc3scZ>e%?=`${U7l~$~%d#!6$T>K(E7++EPVBOUoOJnOQdoODt7jJn;mUo(3x3qtK zTwU)$yJIs)nMhkK%jf>F+UVa%ThF$4gHDu>5IbvtJwr0HjDKWj7Y9B9^=ynAmy%XVv$m&N(uW#<3~H#RGCy^7gC{7z8tr_`dWrJQ z5*TWnb-263qCi(vB>8a_s{=(dkR{TV7uUr!cRC( zp}Y>m(v$Kh-D6of%;!u@cI(QaGP@)=%=oXhaP@A|=h5;q%FAwY%deokQ0(ExS&h-D zCVf^iRRie%=SUYyiRx=^#a07pn$)NU<6J&XI!_u@+hayuCNs-L1&*`%8!pn7j~Ia^jCX_ACgcR+)rVSBhCcTWSyg~Un%&SwBACiJ>ok4Bgmj9b{o&;1kLBAu7m5}P=X#aK6ED5Uypz&yz zH*U80a*R`hd+bR12gy|}cidKGkj{~E)l1kThm(dRm}C4WqE9Bvnn8NrtTp2idAY0{^pLA43H;~vtj(yTfM zHNQgIRnl{fGa38ehorU?sP;n7pCNro0=dSY6MZwWtpAXn!4W$_;%&tpRzFxw5 ztwY#FY^+1?tRv#fGtQC7p?=1b8p%~P*bSDF)=0T(8J-N4q;(Qht%j~8-7bxJrs@Ug zM$&`Gw^05L@@LXwHw+*`YQ5El)sJqD&;4UTiDvYX>lHT9OakX zyvk}z@DHq^WXj(|o!*vgm z9*~gg+t9a2KaucwZrCIeFT3ATBMA9c1|1r#&1*ARPF0z(TehKB5Q$AY)6O3~o zmh@`U^%7D&hgXO{k#3i;Y6c!mkCJu~-$diwibv$rr0XSDbqi|VL%K)GCmR25%!XG; zzryh$%0n2tHz^-0je4y?m}AFD$A~@2I5VN2l4eS#>V42JN%N#c^)1Zp?@4D#%_QT$ z2P5(`=~d({FwWkreiC^b%J)dKUh502h0dgfl0Mn^FJiWLCq0YN??d@*=&=mS%O#+- zJ&0G;;iTs-`TY`}tos;hn?{-4&#@PzpMjDb#)%T&bq=%(M^(1;@Kj~Leqk0`$ zPnskRs@?Ge`WR`vG^^%8Pm<1*^nBx_U_G8A?IZ=Nsd&ydk-jeh)iku~D(Q9!sTO0k z#$l|y8QUmf)$Vw2NhVz*z5?S+!4BDtv{Z6cPvaTak93KY7a0F4%=sat@1T_gefAekWAI7SYKtN`i~9Owb<(_NViChYAy6((pRNH z^%!(L=^1IBX8Zxnw8u!VW30DRehf2YC*>=oV7hS*dhZOR`fo5*?_W{}Nku}ctFb%1 zMY>qRs_W2uCrIBD-wfld!3_C~v{G_aJ7Cl!yT=vMQf$Csfem3b^38=Qg zXf7t5DIwL{F;5;K9W3EU&DgIVAw4R-BI6vzp0kCtzvQYOMyqy_-YMlp17dz`DLacY z>`$bzXn?&(?AZhC)si_|n~O=%8C!ujBuAt~brd=xgLJRdsBXn#8%O#VX;2*pokvph?3st$*CBYjxPRnwqDNNZIqBwTE& z60nDTNs0%U^*!=PH=?5GM2ba=ymr2csgXo^8}vmN%BQ%~vC8UA5QEKO5ar$s&7nMm z^4>oNyapv>3%HBQx5o`HjONm-B)RHdDzX8i@4ahA?j1k&qpc25`D*NT)yN~|@feMk ze~ijsMxX3-^C~NH0>(dj!V7dl5LZ8N!v(NlqvhYA^4)Qd@7++|`_EzIgpYq!ewk&} zMtV&@;TulCkArA_@mD8U*0Yfo>*vZ1c P>t`0Yb#Ib;7Tx?ml(#Sw diff --git a/planeObj.c b/planeObj.c index 6380a15..92b665d 100644 --- a/planeObj.c +++ b/planeObj.c @@ -31,6 +31,18 @@ struct planeObj *createPlaneObj(struct aircraft *a) { p->oldIdx = 0; p->prev_seen = 0; + p->x = 0; + p->y = 0; + p->cx = 0; + p->cy = 0; + + p->ox = 0; + p->oy = 0; + p->dox = 0; + p->doy = 0; + p->ddox = 0; + p->ddoy = 0; + memset(p->oldLon, 0, sizeof(p->oldLon)); memset(p->oldLat, 0, sizeof(p->oldLat)); memset(p->oldHeading, 0, sizeof(p->oldHeading)); @@ -85,7 +97,7 @@ void updatePlanes() { if(p->seenLatLon < a->seenLatLon) { p->msSeenLatLon = mstime(); - + p->oldIdx = (p->oldIdx+1) % 32; p->oldLon[p->oldIdx] = p->lon; diff --git a/planeObj.o b/planeObj.o index 56be23f6d059cd68c3936608cad125ba67305ca7..46f23801888532f97066ddc9d65d3370f7bb62e1 100644 GIT binary patch literal 43176 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 JsS5J`{{ySr>?i;L literal 42880 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 Date: Sat, 21 Sep 2019 20:46:52 -0500 Subject: [PATCH 53/65] misc fixes for label system. rudimentary LOD to speed up wide map drawing Former-commit-id: 84c0bc68e284508d9e16ccceb6f7b7dc35dd4b60 Former-commit-id: 4a3065e9d6762bee1f8d854a176022290563fa5f --- defs.h | 9 +- draw.c | 251 +++++++++++++++++++++++++++----------- draw.o.REMOVED.git-id | 2 +- font.o | Bin 36632 -> 36680 bytes init.c | 9 +- init.o | Bin 46200 -> 47128 bytes input.o.REMOVED.git-id | 2 +- list.o | Bin 47136 -> 47176 bytes monokai.o | Bin 26632 -> 26680 bytes planeObj.o | Bin 43176 -> 43224 bytes status.c | 18 ++- status.o.REMOVED.git-id | 2 +- structs.h | 2 +- view1090.REMOVED.git-id | 2 +- view1090.c | 6 +- view1090.o.REMOVED.git-id | 2 +- 16 files changed, 208 insertions(+), 97 deletions(-) diff --git a/defs.h b/defs.h index f89b6f1..abdf5b9 100644 --- a/defs.h +++ b/defs.h @@ -6,11 +6,6 @@ #include "SDL2/SDL_ttf.h" #include "mapdata.h" -#define SCREEN_WIDTH 320 -#define SCREEN_HEIGHT 480 - -#define UISCALE 1 - #define ROUND_RADIUS 3 //radius of text box corners #define CENTEROFFSET .375 //vertical offset for middle of screen @@ -20,4 +15,6 @@ #define DISPLAY_ACTIVE 30 #define TRAIL_TTL_STEP 2 -#define FRAMETIME 33 \ No newline at end of file +#define FRAMETIME 33 + +#define PAD 5 diff --git a/draw.c b/draw.c index f0aaf92..bebe530 100644 --- a/draw.c +++ b/draw.c @@ -48,6 +48,64 @@ SDL_Color signalToColor(int signal) { return planeColor; } +SDL_Color hsv2SDLColor(double h, double s, double v) +{ + double hh, p, q, t, ff; + long i; + SDL_Color out; + + if(s <= 0.0) { // < is bogus, just shuts up warnings + out.r = (uint8_t)v; + out.g = (uint8_t)v; + out.b = (uint8_t)v; + return out; + } + hh = h; + if(hh >= 360.0) hh = 0.0; + hh /= 60.0; + i = (long)hh; + ff = hh - i; + p = v * (1.0 - s); + q = v * (1.0 - (s * ff)); + t = v * (1.0 - (s * (1.0 - ff))); + + switch(i) { + case 0: + out.r = (uint8_t)v; + out.g = (uint8_t)t; + out.b = (uint8_t)p; + break; + case 1: + out.r = (uint8_t)q; + out.g = (uint8_t)v; + out.b = (uint8_t)p; + break; + case 2: + out.r = (uint8_t)p; + out.g = (uint8_t)v; + out.b = (uint8_t)t; + break; + + case 3: + out.r = (uint8_t)p; + out.g = (uint8_t)q; + out.b = (uint8_t)v; + break; + case 4: + out.r = (uint8_t)t; + out.g = (uint8_t)p; + out.b = (uint8_t)v; + break; + case 5: + default: + out.r = (uint8_t)v; + out.g = (uint8_t)p; + out.b = (uint8_t)q; + break; + } + return out; +} + int screenDist(double d) { double scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; @@ -276,7 +334,7 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee x2 = currentX + round(cross_size*vec[0]); y2 = currentY + round(cross_size*vec[1]); - lineRGBA(appData.renderer,x1,y1,x2,y2,colorVal,colorVal,colorVal,127); + thickLineRGBA(appData.renderer,x1,y1,x2,y2,appData.screen_uiscale,colorVal,colorVal,colorVal,127); //side cross x1 = currentX + round(-cross_size*out[0]); @@ -284,7 +342,7 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee x2 = currentX + round(cross_size*out[0]); y2 = currentY + round(cross_size*out[1]); - lineRGBA(appData.renderer,x1,y1,x2,y2,colorVal,colorVal,colorVal,127); + thickLineRGBA(appData.renderer,x1,y1,x2,y2,appData.screen_uiscale,colorVal,colorVal,colorVal,127); } } @@ -306,11 +364,32 @@ void drawGrid() void drawGeography() { int x1, y1, x2, y2; - for(int i=1; imsSeen) / 4.0); - circleRGBA(appData.renderer, x, y - 5, 2 * appData.screen_uiscale, barColor.r, barColor.g, barColor.b, seenFade); + circleRGBA(appData.renderer, x + appData.mapFontWidth, y - 5, 2 * appData.screen_uiscale, barColor.r, barColor.g, barColor.b, seenFade); seenFade = (Uint8) (255.0 - (mstime() - p->msSeenLatLon) / 4.0); - hlineRGBA(appData.renderer, x + 5 * appData.screen_uiscale, x + 9 * appData.screen_uiscale, y - 5, barColor.r, barColor.g, barColor.b, seenFade); - vlineRGBA(appData.renderer, x + 7 * appData.screen_uiscale, y - 2 * appData.screen_uiscale - 5, y + 2 * appData.screen_uiscale - 5, barColor.r, barColor.g, barColor.b, seenFade); + hlineRGBA(appData.renderer, x + appData.mapFontWidth + 5 * appData.screen_uiscale, x + appData.mapFontWidth + 9 * appData.screen_uiscale, y - 5, barColor.r, barColor.g, barColor.b, seenFade); + vlineRGBA(appData.renderer, x + appData.mapFontWidth + 7 * appData.screen_uiscale, y - 2 * appData.screen_uiscale - 5, y + 2 * appData.screen_uiscale - 5, barColor.r, barColor.g, barColor.b, seenFade); } void drawPlaneText(struct planeObj *p) { - - drawSignalMarks(p, p->x, p->y); - - int maxCharCount; + int maxCharCount = 0; int currentCharCount; int currentLine = 0; - char flight[10] = " "; - maxCharCount = snprintf(flight,10,"%s", p->flight); + if(p->pressure * appData.screen_width< 0.4f) { + drawSignalMarks(p, p->x, p->y); + + char flight[10] = " "; + maxCharCount = snprintf(flight,10," %s", p->flight); + + if(maxCharCount > 0) { + drawStringBG(flight, p->x, p->y, appData.mapBoldFont, white, black); + //roundedRectangleRGBA(appData.renderer, p->x, p->y, p->x + maxCharCount * appData.mapFontWidth, p->y + appData.mapFontHeight, ROUND_RADIUS, white.r, white.g, white.b, SDL_ALPHA_OPAQUE); + //drawString(flight, p->x, p->y, appData.mapBoldFont, white); + currentLine++; + } + } + + if(p->pressure * appData.screen_width < 0.2f) { + char alt[10] = " "; + if (Modes.metric) { + currentCharCount = snprintf(alt,10," %dm", (int) (p->altitude / 3.2828)); + } else { + currentCharCount = snprintf(alt,10," %d'", p->altitude); + } + + if(currentCharCount > 0) { + drawStringBG(alt, p->x, p->y + currentLine * appData.mapFontHeight, appData.mapFont, grey, black); + currentLine++; + } + + if(currentCharCount > maxCharCount) { + maxCharCount = currentCharCount; + } + + char speed[10] = " "; + if (Modes.metric) { + currentCharCount = snprintf(speed,10," %dkm/h", (int) (p->speed * 1.852)); + } else { + currentCharCount = snprintf(speed,10," %dmph", p->speed); + } + + if(currentCharCount > 0) { + drawStringBG(speed, p->x, p->y + currentLine * appData.mapFontHeight, appData.mapFont, grey, black); + currentLine++; + } + + if(currentCharCount > maxCharCount) { + maxCharCount = currentCharCount; + } + } if(maxCharCount > 0) { - drawStringBG(flight, p->x, p->y, appData.mapBoldFont, white, black); - currentLine++; + + Sint16 vx[4] = {p->cx, p->cx + (p->x - p->cx) / 2, p->x, p->x}; + Sint16 vy[4] = {p->cy, p->cy + (p->y - p->cy) / 2, p->y - appData.mapFontHeight, p->y}; + + if(p->cy > p->y + currentLine * appData.mapFontHeight) { + vy[2] = p->y + currentLine * appData.mapFontHeight + appData.mapFontHeight; + vy[3] = p->y + currentLine * appData.mapFontHeight; + } + + bezierRGBA(appData.renderer,vx,vy,4,2,200,200,200,SDL_ALPHA_OPAQUE); + + + thickLineRGBA(appData.renderer,p->x,p->y,p->x,p->y+currentLine*appData.mapFontHeight,appData.screen_uiscale,200,200,200,SDL_ALPHA_OPAQUE); } - - char alt[10] = " "; - if (Modes.metric) { - currentCharCount = snprintf(alt,10,"%dm", (int) (p->altitude / 3.2828)); - } else { - currentCharCount = snprintf(alt,10,"%d'", p->altitude); - } - - if(currentCharCount > 0) { - drawStringBG(alt, p->x, p->y + currentLine * appData.mapFontHeight, appData.mapFont, grey, black); - currentLine++; - } - - if(currentCharCount > maxCharCount) { - maxCharCount = currentCharCount; - } - - char speed[10] = " "; - if (Modes.metric) { - currentCharCount = snprintf(speed,10,"%dkm/h", (int) (p->speed * 1.852)); - } else { - currentCharCount = snprintf(speed,10,"%dmph", p->speed); - } - - if(currentCharCount > 0) { - drawStringBG(speed, p->x, p->y + currentLine * appData.mapFontHeight, appData.mapFont, grey, black); - currentLine++; - } - - if(currentCharCount > maxCharCount) { - maxCharCount = currentCharCount; - } - + p->w = maxCharCount * appData.mapFontWidth; p->h = currentLine * appData.mapFontHeight; } @@ -444,12 +544,12 @@ void resolveLabelConflicts() { //apply damping - p->ddox -= 0.7f * p->dox; - p->ddoy -= 0.7f * p->doy; + p->ddox -= 0.07f * p->dox; + p->ddoy -= 0.07f * p->doy; //spring back to origin - p->ddox -= 0.05f * p->ox; - p->ddoy -= 0.05f * p->oy; + p->ddox -= 0.005f * p->ox; + p->ddoy -= 0.005f * p->oy; // // //screen edge @@ -469,9 +569,10 @@ void resolveLabelConflicts() { p->oy -= (float)(p_bottom - (appData.screen_height - 10 * appData.screen_uiscale)); } + p->pressure = 0; + //check against other labels - while(check_p) { if(check_p->addr != p->addr) { @@ -480,6 +581,10 @@ void resolveLabelConflicts() { int check_top = check_p->y - 5 * appData.screen_uiscale; int check_bottom = check_p->y + check_p->h + 5 * appData.screen_uiscale; + + p->pressure += 1.0f / ((check_p->cx - p->cx) * (check_p->cx - p->cx) + (check_p->cy - p->cy) * (check_p->cy - p->cy)); + + //if(check_left > (p_right + 10) || check_right < (p_left - 10)) { if(check_left > p_right || check_right < p_left) { check_p = check_p -> next; @@ -494,23 +599,23 @@ void resolveLabelConflicts() { //left collision if(check_left > p_left && check_left < p_right) { - check_p->ddox -= 0.1f * (float)(check_left - p_right); + check_p->ddox -= 0.01f * (float)(check_left - p_right); } //right collision if(check_right > p_left && check_right < p_right) { - check_p->ddox -= 0.1f * (float)(check_right - p_left); + check_p->ddox -= 0.01f * (float)(check_right - p_left); } //top collision if(check_top > p_top && check_top < p_bottom) { - check_p->ddoy -= 0.1f * (float)(check_top - p_bottom); + check_p->ddoy -= 0.01f * (float)(check_top - p_bottom); } //bottom collision if(check_bottom > p_top && check_bottom < p_bottom) { - check_p->ddoy -= 0.1f * (float)(check_bottom - p_top); - } + check_p->ddoy -= 0.01f * (float)(check_bottom - p_top); + } } check_p = check_p -> next; } @@ -543,22 +648,22 @@ void resolveLabelConflicts() { //left collision if(check_left > p_left && check_left < p_right) { - check_p->ddox -= 0.1f * (float)(check_left - p_right); + check_p->ddox -= 0.04f * (float)(check_left - p_right); } //right collision if(check_right > p_left && check_right < p_right) { - check_p->ddox -= 0.1f * (float)(check_right - p_left); + check_p->ddox -= 0.04f * (float)(check_right - p_left); } //top collision if(check_top > p_top && check_top < p_bottom) { - check_p->ddoy -= 0.1f * (float)(check_top - p_bottom); + check_p->ddoy -= 0.04f * (float)(check_top - p_bottom); } //bottom collision if(check_bottom > p_top && check_bottom < p_bottom) { - check_p->ddoy -= 0.1f * (float)(check_bottom - p_top); + check_p->ddoy -= 0.04f * (float)(check_bottom - p_top); } check_p = check_p -> next; @@ -617,9 +722,9 @@ void drawMap() { drawGrid(); - //for(int i = 0; i < 2; i++) { + for(int i = 0; i < 4; i++) { resolveLabelConflicts(); - //} + } //draw all trails first so they don't cover up planes and text @@ -648,6 +753,10 @@ void drawMap() { planeColor = grey; } else { planeColor = white; + //srand(p->addr); + // planeColor = hsv2SDLColor(255.0 * (double)rand()/(double)RAND_MAX, 255.0, 200.0); + //planeColor = signalToColor((int)(255.0f * (float)rand()/(float)RAND_MAX)); + //fprintf("%d %d %d\n", planeColor.r, planeColor.g, planeColor.b); } if(p->created == 0) { @@ -679,17 +788,17 @@ void drawMap() { if(outOfBounds(x,y)) { drawPlaneOffMap(x, y, &(p->cx), &(p->cy), planeColor); - thickLineRGBA(appData.renderer, p->cx, p->cy, p->x+(p->w>>2), p->y, appData.screen_uiscale, 200,200,200,SDL_ALPHA_OPAQUE); + + //lineRGBA(appData.renderer, p->cx, p->cy, p->x+(p->w/2), p->y, 200,200,200,SDL_ALPHA_OPAQUE); + } else { drawPlaneHeading(usex, usey, p->track, planeColor); p->cx = usex;// + 5; p->cy = usey;// + 10 * appData.screen_uiscale; - - if(p->cx != 0 && p->cy != 0 && p->x != 0 && p->y != 0) { - - thickLineRGBA(appData.renderer, usex, usey, p->x+(p->w>>2), p->y, appData.screen_uiscale, 200,200,200, SDL_ALPHA_OPAQUE); - } + + //lineRGBA(appData.renderer, usex, usey, p->x+(p->w/2), p->y, 200,200,200, SDL_ALPHA_OPAQUE); + } diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index 8d1d3a5..7c1526e 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -a17d06a73e34e6e65d1ff9ed411da79667154ca6 \ No newline at end of file +5bec8587fd94772a4061e38543ad9846ffb0fc11 \ No newline at end of file diff --git a/font.o b/font.o index 120e521686b8a969be98ed81022bf71dd8a63f41..1b9094e1f1c196d1da92e0fc47a3baa2e7a38cff 100644 GIT binary patch delta 4608 zcmaJ^3s98T75>jEF9mT`xLg#K`aq58pG{MdsSQ$FH%_M`tD=I+vQ<=kAS>d64`3A^ zR1oQBr)r}K9j8iTW425+nrW1@@zL6*w3DJvoQQEIVrr62#2YwhM=Bd&bcVf$_CAD(yIG>oYLsLb7n2$7_R9lg`@>qi=%2O+43) zzYW@&^&x9YhJ`eFR)1vQ@ZdYv;CftmFzp^T5B`BIZV)aF-di5l#M5lt z&E%xX+~IL9|5(PMah#EOf_e8MW1o?j&EvR13ilbY@n0qzMtUfM*_J+m@o*bHP83w4 zbI5dA&H9nX081SkU&(_of8p0KGG#1{f-|LrOon&YvUWhCbQ+c=sh zWH`pfF(1a$GJTAdjz{TV$OFz7ISgZ><;S*kHOoFXI#x;B$oPu2rInRcYfC#;=S)lL zcy;>ic={&x&up>94#9-{>GUzY`A+#zWvxmD(vN==`L7?k@&(;TZ@!OKz~d6Ugc_GA zZw(C-KhpR&(dqJ0J#uC_=`#GYOuCA|ET@di2on!d_&4Ie8ur;jE>qr4YG@AfX1m#2 z+ia6|po^Ki)57*6Y>)f-322U+9PrF>(g$dtW6E8e6|23aG1ntF$K=D4S>U7=logot zKK8TB$3@lzV4v%xKcaB1N%PUj{qgAH{ucZN({ndhU4aLqqMg|HV2nG(7- zhSA(NJZEHe9^^54Qtj>$4IKh+p-Hc!jX6722F_@lTj(nE(H}6Q$VruGEfRd-+lzdZ zfy@Oa&4O!zpm$Kl{S549ISdyUv`{w+7rJRIPAxR)B6?X~hFsJl_lyX~Hz@A$IQO7) zk&sIiI$lFxM{to~&k4moS_pr!Qyx^;?YzcZf}Ua_&+(10+BFS5*I{=b>0^sc!|5Lu z%Pz&b7awLva`rno7CU7c*8r;}hl(nnL+)GWF%zwe1tp_>u}LmmS?r`q9hpnwNM2V4 z8#RL<@=ArxmV%v!&}Hahv__$(hIYfg+@y5mEqBvkv@I7j z8mE>!sTouzYbMjfq zTwzi!Tq^`ufwC2D`UNhoaMD|_uQcf}@>U9YR@H^L{*UMCJ$P4Ib*FKqDaWbWG(zKi z7hUY3M4?Y<=qAvrPv{v0S2^ho|TW0FE_69#cEg$2y$ctfW}oH{oIQFA7c8&>LuF^mBy{)zEfyt`W2iSJt@c zr^u;r(-iEla8f_?R0z3Gt#^%PH4S#JRmJjHmci>4a*8_7(3nfm<`r}trrLu_YyA;ItntZ*3SF(CegtX+?Z?F$H^(-9gULm`a6=1yfnM%^4|1a^`>Ib$!NA8oAAo10 z;7?Y~Mw1?*eWQ~mBgp(1mCyGyz6&{7mFHTgq3O!14xNndQmFMx7#)f{ zEcPPE=z%EI`sPnnkBI;>YlZ!dD9@p)4Nt8=No~A*S4WiHRrqT~-AxUxQfP0K-nw6B zRT=$fl-`=>w&LH9(p&r_wO=-M(yiQE{E_Op5*OANJ*p@v%8^|&n5zs@qx9AUzg1Ua zjHZ8C@lAN^1Rowxy`b4>s}pj*Vp&TGLY`4* zBuyDAeOF=MBINrTI!U2-k;iDPI+qdKli@&&G4L|_Z4LdGLQBxLMcAt~G!Z>p1g>w1 zmj^W@a@Sq~Z51-0qsr?AI2iq_LL(dWnaWK!JdECnLahwVQ?~ce%IE;~_=r@hO{#jN zp_9=J4UIf1vJhl+qK3{=o+lx*LGUvrz_JLg1|i*w8Ohn#6_Y=Z4Z^-%Lle;1AaJ%J zUjAA`tbg3Cb`Cx4_3zsJ7u2Et0QPNyKD4CcV~z7bRpQT{pnm`_+y2{t@DL0`>{nMO?oaSuW2XAvO{T>097Z7aDwGG^fXLmnO SJK^1(OVtRltUz#g)_(wkd)Wj4 delta 4542 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 Yr~)ey{_Wy{@82!?f0>i9Lw*1M0Ww*`e*gdg diff --git a/input.o.REMOVED.git-id b/input.o.REMOVED.git-id index 8dccc44..5a96a3c 100644 --- a/input.o.REMOVED.git-id +++ b/input.o.REMOVED.git-id @@ -1 +1 @@ -2305764a62eb8dd80a5f71e908a04bfaa9bc3cc9 \ No newline at end of file +b7c0644a5ba34c2548772d880bce685146ce9e95 \ No newline at end of file diff --git a/list.o b/list.o index cdfa6838a681ecc277eea074d6ac90be1cb84a0f..a8039d47d9792f31741445617028f0442f1361e6 100644 GIT binary patch delta 6099 zcma)=32>A}7RSFH!V&IpHLWIO0)YT-J_f@Pb%_HOW1vI=qDw%A=yHTRKo~9w0d^}9 zBpLr;h@3+Z2nsTUM5D40Jb>L*nbp$GZlQ$ric75qb+^!!+V|yqpHA9xi>{iUuix*z z*WK^y*WEMwzH*)a%2k>oioyfO$B0=~`7w8@*5|v#dv4%l{J{Y?ZZV9Rw;5F8z1DML zjNKS*H7>Wc8)G`7FyVfYfOitMPq0N3Gus%(nJz}hUy*6&TMeVrSb7K;9cQ#MjD(-s zZQ2c2hS9&dgUOaWmbhKIr^HWr0?+oDe0zEedB-&3)sBmTX2&kuMS|E{)h{tgh_mpy z9}|=DoO}GVvu?v^72H!`T5d)Ezce>baC3l7E4Z0rHxCyKZdU%a)wGIj>$T}oRvvu? zSxL8xD_ECg-gS*NZGGx!+TjGl7}`6@77Xp=Jh=Gb4o5Q?pC_e=Yl!RHbNWaB-^TF# ztec5r`rK?c8~P5+h_)ZeBM>8=yJ;U^^d0!~sit*FyxB2K==Td_@C0t!M@>IZ>roWN z3S8|sAjx_p!-Ah+SaM<;>#4mP(~|o%+nOjyP86fCFS+j> znS|!i>q`?;#E_qCEpg$`#SfDBB>tV8I@nK7M#l(M)|zTwhcR~hiqmdwx3A%W{=GzU z)$IP+$?cXbowaOP{?b`hr^mnBwPMHg4l15<$trR7m(iZSyU=GU!gKuMA;ir!MH#$v zeWD7*R9``aBpDF7QWQbu21E}8>3I?=b4}%}S(mWgIo`fP6KT#x?mVA3f$%)j6_bD~ z^Tw)WeQm{)n!!1E=Sww`=3Q{*FSp-(83)AM*-SoozljM_z}ID^JTrkcs)=^4|q zm(K7kmde@}tTJ4qXOKg5aW9)bpiwu1L_72N=W4VXb&GwX02$>`b9i~O9N_=wJ@mU(jI6PClJTsUiK3`rP2EkUMAH=N=2*uQ=@-J z1JQ!sHtp8d{&qb35w|?x68-VS@>EybB)q&lRXsv`iB)Pf-E@e2sp_RoBN}}Qo_td* zM-J615hTqOtf|`B7EYfjsLPik74`Y1YRluw)O5mduked$C|n`c8_BkPP}6x4;T0vc z%Dn+oj746+FXkZEFa%dh@gyo&`oyPbqUWTl z*j4nJK1bYYsmi$HVI5kU-4E~TL!uWNSDWH8)S41Xsme8`I>PJV{*Ep6r=w|&RBPzG zvP!N-Pr<#`CxXabYpNixvs0SRn+UJs39<{}$cngiiK5=W6=ZUsLo#*(S&Q1{51Q%{>pZ0CTt@?W=*c}ks! znJ|^ve6co+vzjK24FTF4Vz>E~;9S3<>6D^yn>FU}HlN7Gb*cgHb}634)a|Bvo!`sY zo-JqnK0@22`kd(`jTRx&?4fbH-_@!w#yvelTtem3J~0MOPfInECw5RX3&34wiY3UR zx)_CJQa!*6_m7%pBf@1;1aN^g*W-HG2Vx{5J5Gx<1j~JDzY{p#o}DC3LsNM`Tt)6P zJ~0^KXH2?DHBh}DaXY0t%|U!!v+4uyPM><0&!o#5orn@F5^{DOQt$94lf(0KMpy**ZlCxPxw}nT^yO4Pj|;o~E|Q4#uK<*qiYb^W1RFdci8EgPP={>x_5<2=DWlJ4NphiUP-5O{a#Z&%5!{A z)7b*|K1p|p^nIrI7`gjOtP9F_`%+aSD=z2JJEMLC-jG!3ye_wBv>tgODV{=c$hxM~ zhJ4~A#C}uI{cpduO=i;by;!xsz|+Lp?)aU`15D;TcjO6)_8O-AsgP>4M%!>+On|pS zW@c-2HV0<5CLhl+U#iK6^WL%!A?j0C;VB615*7-qwn*z>H~O) zUe;&~-)XNR=YY)oR-#9G%4oY*~p5;!&HgZgQp^p0MqtUfIi@|6jnx@en zywdK0`&p?nHF_IgN2ef*=nRdv;(c)*3W+Y$=trD11qc%@(&)Fm+P0yA=x&WBC)(4k zMBG6+><>(>I1I8ubA3*;n#^-~%aWs^raOubcE$RG?J~cQ(zLFfne3%KTUe2_)96kVEugjUM53n}gsXSui__ zT8r-<9_{=nxiwnnr$&C1+?rjv6+kMhqvV#pliQo3}O^ceUm4RmQ25C>?7IhdDq)kyk0z2#p@&SL;QH=s2d9 zi8YkP^s&k$M2O}@*;>6@|I1m0&ZHxhS{gmZbR|4Q_e6QNCeymv(lCx9hv<3DHo~?M z1d0Alqw%~keT+JySEH!4;EuEB@6kjwhK~d%c^0#6C%B)JsvA>hzQr8>bYu~|Pot$w zA44J01)As1Jf(buiLTacYuGk~2BOC``e&vuA?|sp&S{<_j zUPuvXRpl@EU81z=dib0Wxu~le5xahl-Ft6{lOyOpmwqxs^u#Kvcc7N)_i&x+6r@*Y zxMDn5T|J8awyUkq5Wm6o>WucwhuP-s2H^7Go_M&%O+Ua^)nvF1Pe;R$UbtA3LjQwZ fugRc`aQcfGqAONWJrT7pX2ce8p4@=%tJ3rOo^x;C zzJ2??etG*V&(5zr>$-~x6+MPE6Mv{$&}^WJKYe>ge*>yJ?oDgB%P=N%FsOA5SkKAL z>_MhAxSC)O9ug?*G+cP`Zl{d_Bk68pi}r@matJ+yjHH}6!|?t*zNLA(GK_99n(~?8| z#S?KQmErzkB(`?xkl{9Vuj9i#+i%t&u6OD2%Q*D+B;TY%7}vGO&|mezKka61IE&i8 zzH4V(>zWwvC&`Ow?3y;zda5Ejv|2H+zsUA1G>mj!rD1{ph=EQ-Jk7`c8tKPmOiAq= zGn;}nsma2RgQ;Em-B0>Y(#}#uMW3I|TH^V?6bDIMhPZCMGasiXBdM0UGenE!ax;5; z(HY0vV=FM6>#@D@47SceT)V1y-NvR?T^ja&t9TmI63fPm7OD-MNUM46ALCZ~y`BCZ zL(Sw|F&w@rrdW&YDM9fHHd9}RC`r=cohn5bJ*I|43qNw49HIJ}=9c%xF zm=+SbD3}%$<*1ovdj8W9Ur!sNrggE2)tbWV$eu2h$>#p1p%R7DbH#IrPB+CGcxOn3 zj<%h2Pt%D@5txxH>Jga{6wOdS!&Fbls*hpRYs>@i&osph6`xBU(E7~A3H>4(7c|vXKE%vXo17+~f`x!l{ zp&6)|C)HUxz*f7aq3@%C(1q=6v~`00>sTHI-~5p0yHu3U@9nwa!}uF8qS=ZQM*8jRMamp)eYukX`FrVFU%E> zqhz5}e@?aaOEk_Q)GREfEYA*^VlWCrxgrnIkfbbc3Fev9nIWuhe-7n|ZTdOTfBN9y>~ zriySL3{Psx9|5sMs=4$EwAxe+t%iR|P^?735>u_@JUgjzPNHT>P+d%p88E)p&};B5 zm7)^&EiG0HIiM3;+FU2-afmK8#Z-8gNpS`}mYM1Yp6jf}ybbxpNk-AKT=4OQov|AFJPHYI&$VxohUTDRg``-WTM-fw1fC75L0otKq%j2|&xX_qF5zvshCAy$ zQRRQGEKW3_Ze^~zz@*-MXK+YW$Sw-1Dn8poG;|;;ilq1&=ZZ}6CK`)^qIFeZRf15b zIDVCy!h6VDEkzUst8-N*b1rF|QZ%flBgv8bP(we1Z%wY4heGO4BDyA|>YTcIN7Eg+ zhWr<#`jOF04ZR%^LVaBAAJx!)s3r7aM#pOCXo$5^O=WbFhMt9gZ7~I2Z41aoz(nw zQoYU9#nYx~WIjb?T~HLDo_fGvVv5I*S0dF6&c_EdKApT0DfXbe#8elUGfLxpg$A;a z#4|pnq21wI|0PugFRW;cfvLL1?&^l|hQ=h{5Te?kHsq@B_%(4u<2;X&4VKR}8-gMm zi5r7r6|y%qmOH77}1!8#*Mk2?^7`L#T;<~$6pMJ zfe@Rd8qEvatEtU`f0HRDBaiy!C?Vz$PTcbv^D1gKNihp`#0(+vrOU!Z^rcgxCnB4J zYO@nKE}72x>j_aB5+9+UG$>L~Q)<#ps)72=@NJRm2nX>^P3ul%ZwadN{7$;6p+QuT z?ifDPUufuOh;A|IJ?GtOiuDLke*yVh%hX$3Wb$}@j)!6Rw*|!~DA;CF(w9@e8+F@q zJ&o-!aC?sO@F{P@(>ZF%sMs#m2fTn@8afxz?biFiyF=cU$`y9J#`&oWGIuOg9XLt$ zXz&Qs?vV6$uHRv*F}%hL8fOLkJ0;yEvUZx{pD5T_Y+X=pjr3MmnK+-lcf1~n?1)r- z_#L!HL*GMTM2aG8j#$@}bCICf5AQBh(EV?hRVK&K^B@%M3j5pfd3Nl!O}2BjE6c45 zZC_gy>jxlvx6BG?T0im~b+{&fl0z~^lV@_YC!%7vRQVeE1HYx0Axh{fMlDbLE>Ftg z-6Pdu7uv^#zK#H)=Uph5ix}tc$loKwS6pc9dzkeG!_&E-^fhrfcW zL?WMX%X40EOslmmN5aeAtWGXYcbCmHmOD0EaPIYU@%g02wC+dV%Q8IFh4yw?%hs%Y z&ntS;#kc;i;j~E_{}Layxh{S$hfKfxtupq1SD4Q^ZJ&23aIVJG)@c)TNVctQb@5~W zv9QHP1+w=_bwbnn9S7w!3iryEQ5V_*FYIlP(|en%AKg;27G{ecMEA<9B(`9M*}D0@ z&8XKUw{Bk5Jno>$6S%gfAy6j6eO)N$aLnEym)x?plcV#nOK#2nd5mos&bpk7!^qr!iP5}wQPv{a2txC468^&tn?UPxh8d}X4 zg>p@PfUEs6O+Jo8@&;~!CyR=G&wj`Ki1?&Is3naubeI|8hZT}+w&VSG>*%V z6VJQ(+o(MX%Vk!o3$=FP3od5AamlSnzRbJU-zB&B-Q(=J1|v$IJnTZP1<$cTVtx=*m> zD-io-))$)YL(OcbuWRzzEI0TlJF5W8f)BTWjb5TR+ z6b87*p1Oy13uA%qxPHjRy zq176?n04zAA@qiZ9%Hl%Y6%Vcj97Dgc3u!U5Qn5%prPY!vat$&LicHClr4XPyhAcC zDa9sR>$OhGFh-RoKf@KHqb9H89O$CS9e!Ul9Fp{p2df_p->Xv4M=kY3kxl(0v3>*! z>3KBu86vH!=G9z}SYG9;JS)U_)K}e;IA=012tBIr5%l?2ogtbdLj4>>sXq(f;S6CQ z?{J3adLQgM{D4S6ltg{tJCbqhz&Pu(!>NV=GW$dL@Xl}4$53BIEl1T8_PwJsndF#d>8hJorN2x$>Tms${1AXsc=uo8)zsur_ejnW3xfvV1`J$I|Gj0iv_9;=TkdVA}jbkd?(ao~nPqq^GQQs+~ zP0FAzbZ^r~v~SmaFDtQ`bW39QE3CvJbieBV_dVkuPqM6^bOkUyYEK~UTmv)um46kr zbisZJqKDVKZ4KelvXL&LJA3lGd2;O&8BX=!Ts zf$i?it^*H__@J8^>WcQWtW@X2x{p4izp)xB*H$mVldDZA&4I&(W(pg$bW(c|?vdK0vT~zPrXVmndh5cc`a-#MXGk9$|@Yq-X0^))ib`qf#~kJaWVk8Zh8evf9Nmzb^b?LKUpts`lM;VNl<$u&|bG^y|uX*CnYMYj4Q z8jEamiyp(#Yqe0GMQf2Z>$F2R2)YxUL}zid+XOugx8GJ95b$et7J?#VqILrc``}R zc#gSD*oVX(io*UR+>@ebio8j-$>p_vL}+%RX_7W?@`#=g^h1P+-sTxMLhP8gmNa-6m1qW{Y235 z@DTkC)60UEBREB?^Jtv1Sv`n^65Bk)^Du;W^w_!&MW95hS5Q|n&%DguiiBnxA|4i5m0pB_d_EdKIpKHm~wya*)vMg)iVwKgtD}Bk0X|><(nBV`wKA zx43Rfh3GcaG;PlD$)Zxw?eGxY!iTy=g04r9=vL0+rGmB~MD#Gz)qba zI*GRM(ry!UDBRPjFE7k)K~Ew;^he%B-VpR-G)=cv2g1|+>Sg>u?RxlT*y=gdQ=5Zk zYImT0hBjHei}&FrjxEeJsB&$(@g9~g=!@`_+i`ajFuy!oZAGZuR+LTU(GCB6xoy_6 zyh3za3wMP!hj^Xm3mQhCLel}buEI8XoJGGDn)eVU4;gHIUeL9O5IxPgwq4La!!=W@ z-yw6RU(G@NOl|78*pCTiE1F3e#9>k%ftqEjN8zEi7lPD|LTHxX1bE7S$|)Ch5j8cT zlQaw9o=w{(`<*H@X$Z{LY9;Ds+h!m~TPrk+5hf3nJP(fxIuQ}_FcCk@_ET)WN^N@b zSY8uKI+j;%R^LL+vDHR+=4e%d;yHGDEytG42@s3FTPn89sa9{HbB;F0_$0Ahi0a|4 z(rO0ss;Ka}F!u;eDw?Wn^$Ucnw8>;Y9YWKH2x(r2YpzY+eAI?ePwg}`&(&rl*G&yS zxnd!XLi=3X)19k%t)OlETbqRaxA0WkYB_?{T0M)#YQHK&Yqd6Saot}R`t|4}HHxZ4=-Irp)A77N-oAT2 z-+SM==broH?Y>iL?J2cBTcv~^^Cn!+2rpWa-urOBOt*!v(;rN?`Z*klsSdg_M;F4` zch#enWNCb;$Kr`S4^6ZSMX|!gWV`T80}l2rR|}BZZ$rS5_8!R#38!b%LqA8FML#il zPdV9<*4E46Xo#1WIMRkudBOk7NhvR>^PbF?&L$Wig&mk>iqPa-+p^m;W zb5hDVD%kqE*Y-Z2(ft6r24|^}dus<5_TKxU>ow=z@uLp+Qdv+rTKxzn$1-m^?G}Gv z|2X>4Z>-~M5y;Udr@w8^6*L(kqSLf(_6j-^oz(tToXxS+ex#1I%%?rEbU0QDWg7fr zwMl;1Hg6I%5y7#RI*l;hZy`d;U$Z}#h4NcCbG7N!69$LlzMwVm$2Vzm~2=z0x zd0zE80`&Y2mgZUN1$5+DW@ECgz9MQ(LNres ze}+vH629AJ4P5!!G%y`3=qmX0wfY?M^DT4q0lVfTq1lNrwJ?W+K1&{V@SPOCE1j$5K!=%VLtTpeebf`RrMy_{h2I9!CgK&wySEAXm6B1F#@&{1F+ z&H8tQ{yL%sI^ots=<{^FxxvA`AVjMWd|I1LY4$6>67(p-L@Ni_^oF2cAVSpBlj9CY zLZYpTyL$r8LT&Q-y?q7!D?CJxv+G%c{unKV+ShFC7Do$uFUz*)3Hw3zq(a!!&{b%; zZ*psmf_}k1GzNJT4m#?$E$9@S)|Rq*ih1y z-`oC;kL*2oioE7?ZfBvOAE1ru{*yiYiJ)iERiu4ac;#3t=uNi2DeOs^wg+zu`#`v# z(PlW)?ShU%fM^lZ-GcfNBHGAwpP&oSNpv~WBZB@MQKDOzo)UByT*cb-=V^al&_BUX zw43W*5%gOGi6(N^T^BSHVWPvBI+DISE^b7MwQoGrG(m6j-qK&#lQ`ysg#9W!6ST=@ zI$Y52p@rxKrau&P1llH8YB9P3p#<|oeG!+PtW(Puazlu&$ zUgn%!EtJaE9h2q65Tk&j%2Z*FCj|we$NTZ;iwYyDYzzSvxw`~ z37QE1BukAzkTe@OD_$0wcM&Ffgz2k-UPFZF8K!RtIuFiLZ60CYHVK*o578r>KRX27 zik4EXK16G&rG{aDsbwlT+Mfw!0aTeb6@%^goEEeJZld|TLtPYf2?9jRm|hd~6hdX| z)DXDJEj1kea&5AB1haWJh>su;EN@V6AyTeY2X2>JW-_1YYJ~C;cq%BLd7jP@bUIop zya_KQ<3PnkIwGn{OPz$fQv1GQ*S3oaNnGA3>?b%JyM_HCLY3Nl!*rjZN$4bMI9-ki z`UIlnPZ?ZQbW&r@d7+sMKhftnm9Gdo6~QV?J&rJGcJjpQIZxBr#X~tCkt(gu;dYf} zKH~a=IGAzGFX8cPwGFj?ucGbEuM>Ku;(&jI?*OmjC89!a-u)_s{Tg>;s<0o2d$KmW z+1e;*D*{BfuyZd6`UXNow{q6MBIq7;68)IzYC%sUO0=8ldO;7sHAR~-e8$-#=xO+g z{_a709<&R39lQ@oU|&Z%DYDr%=%Y6V*9{v`HKwaoh*s}!D@@u1T@ ztJdxa58D7i@9=xGg#C5+s;z{6eXy*0glb1ewPg%vN3oFZLA2UZ8{m4DmLu+DozT1w zKhbtRP|XuG6TxR=85$TRUfTE4|Rba@yd`VwY_WmfZh`*2dl`%;X+3`;FTXogO>GXU?+s5iTLz@8IQ%KAEO=JATTQqWTP z>tahvuuiKqY_79RfHU!!P!2_eGz)Q?^oQ`+OiPubmhNlOI@2;u+=*)TBJSvFbj{Q> zNLNYoAI|-iLh~uy^|23PU%h2oxt$M$=BEhNd(CWKGcF0b8_{}gUgh@h2zmyt2Frbm zQ#Oasv2hPOc<_pa{c8jpG<}$EZt$uiMCdt++YOd0!afY+G>*5^&Gy9zG-}^Urm?Sh z&aa+@1)|nnj`B8PFXle%LT961@f$(&`CXp~`%v!VAB6oMtUoX8WgP9x!aj;W?Z2_@ zk2_-Bh;KNte%uum!u%h?PXuhDkc(wDwIZK-= zK_{@Ib?^{v67*us0lHeyLUfs+pYcB|YtTk?ouHf9t6!mu=ng?M*sDEIv$feTsEh*TTj`obih3-6W8VrSFgZ1@6rDO)U>hx diff --git a/planeObj.o b/planeObj.o index 46f23801888532f97066ddc9d65d3370f7bb62e1..e2a0fd7166bbd23b72d0a2773463afecbf570439 100644 GIT binary patch delta 8104 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 delta 7975 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 C%KNqe diff --git a/status.c b/status.c index f9e09bb..852c8f0 100644 --- a/status.c +++ b/status.c @@ -4,8 +4,6 @@ #include "monokai.h" #include "SDL2/SDL2_gfxPrimitives.h" -#define PAD 5 - void updateStatus() { // struct aircraft *a = Modes.aircrafts; @@ -102,12 +100,12 @@ void drawStatusBox(int *left, int *top, char *label, char *message, SDL_Color co int messageWidth = (strlen(message) + ((strlen(message) > 0 ) ? 1 : 0)) * appData.messageFontWidth; //newline if no message or label - if(strlen(label) == 0 && strlen(message) == 0 ) { - boxRGBA(appData.renderer, *left, *top, appData.screen_width - PAD, *top + appData.messageFontHeight,0, 0, 0, 0); - *left = PAD; - *top = *top - appData.messageFontHeight - PAD; - return; - } + // if(strlen(label) == 0 && strlen(message) == 0 ) { + // boxRGBA(appData.renderer, *left, *top, appData.screen_width - PAD, *top + appData.messageFontHeight,0, 0, 0, 0); + // *left = PAD; + // *top = *top - appData.messageFontHeight - PAD; + // return; + // } if(*left + labelWidth + messageWidth + PAD > appData.screen_width) { // if(*left + PAD < appData.screen_width) { @@ -200,8 +198,8 @@ void drawBattery(int *left, int *top, double level) { void drawStatus() { - int left = PAD + 2 * appData.messageFontHeight ; - int top = appData.screen_height - 2 * appData.messageFontHeight - PAD; + int left = PAD; + int top = appData.screen_height - appData.messageFontHeight - PAD; char strLoc[20] = " "; snprintf(strLoc, 20, "%3.3fN %3.3f%c", appData.centerLat, fabs(appData.centerLon),(appData.centerLon > 0) ? 'E' : 'W'); diff --git a/status.o.REMOVED.git-id b/status.o.REMOVED.git-id index 8c415a8..e8a5452 100644 --- a/status.o.REMOVED.git-id +++ b/status.o.REMOVED.git-id @@ -1 +1 @@ -30a2da16b88ee34ce3413fff471b01c956184f32 \ No newline at end of file +90ec17d3fd60fd6950fbb50080a31747734eec21 \ No newline at end of file diff --git a/structs.h b/structs.h index a1fe80b..5e64226 100644 --- a/structs.h +++ b/structs.h @@ -77,7 +77,7 @@ struct planeObj { int x, y, cx, cy, w, h; float ox, oy, dox, doy, ddox, ddoy; - + float pressure; }; struct planeObj *planes; diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id index 5c9e4c9..fbe62e2 100644 --- a/view1090.REMOVED.git-id +++ b/view1090.REMOVED.git-id @@ -1 +1 @@ -8994067f92a4d800070c11716a732a5636bb6e5b \ No newline at end of file +2e266c7f3d943cd7251613fc0eddc9208d5bb05a \ No newline at end of file diff --git a/view1090.c b/view1090.c index 413353a..71b5780 100644 --- a/view1090.c +++ b/view1090.c @@ -71,9 +71,9 @@ void view1090InitConfig(void) { appData.centerLat = Modes.fUserLat; // Display options - appData.screen_uiscale = UISCALE; - appData.screen_width = SCREEN_WIDTH; - appData.screen_height = SCREEN_HEIGHT; + appData.screen_uiscale = 1; + appData.screen_width = 0; + appData.screen_height = 0; appData.screen_depth = 32; appData.fullscreen = 0; diff --git a/view1090.o.REMOVED.git-id b/view1090.o.REMOVED.git-id index 05895e4..8adde1b 100644 --- a/view1090.o.REMOVED.git-id +++ b/view1090.o.REMOVED.git-id @@ -1 +1 @@ -a549061b45cd62ae3ca46ebf3b8e29c4956b9641 \ No newline at end of file +547bceb30b8891c365837c7f01eac3b9c227fa8e \ No newline at end of file From 30606084c07e5072c9dcdc0a20acb98f3ed407b7 Mon Sep 17 00:00:00 2001 From: nathan Date: Sun, 19 Jan 2020 22:22:58 -0800 Subject: [PATCH 54/65] map quadtree in progress Former-commit-id: 106b914c5f91b0e3c49ff6bca47e9eb9ceed9a63 Former-commit-id: 9b2e2e01cf6c78915925df32c1b004a0c9d2505c --- README.md | 83 +++--- draw.c | 92 ++++++- draw.o.REMOVED.git-id | 2 +- font.o | Bin 36680 -> 36504 bytes gmon.out | Bin 0 -> 39807 bytes init.c | 1 + init.o | Bin 47128 -> 47992 bytes input.o.REMOVED.git-id | 2 +- list.o | Bin 47176 -> 47000 bytes mapdata.c.REMOVED.git-id | 2 +- mapdata.h | 43 +++- mapdata.o.REMOVED.git-id | 2 +- monokai.o | Bin 26680 -> 26504 bytes planeObj.o | Bin 43224 -> 43040 bytes prof_output_nogeography | 517 ++++++++++++++++++++++++++++++++++++++ prof_output_withgeography | 517 ++++++++++++++++++++++++++++++++++++++ status.c | 2 +- status.o.REMOVED.git-id | 2 +- testing.svg | 19 ++ view1090.REMOVED.git-id | 2 +- view1090.c | 16 +- view1090.o.REMOVED.git-id | 2 +- 22 files changed, 1238 insertions(+), 66 deletions(-) create mode 100644 gmon.out create mode 100644 prof_output_nogeography create mode 100644 prof_output_withgeography create mode 100644 testing.svg diff --git a/README.md b/README.md index c59b6db..a1eacc5 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,50 @@ #spidr1090 + +###INSTALLATION + +Tested and working on Ubuntu 18.04, Raspbian Stretch, Buster + +1. Install SDL and RTL-SDR libararies +``` +sudo apt-get install libsdl2-dev libsdl2-ttf-dev libsdl2-gfx-dev librtlsdr-dev +``` + Note: On Raspbian the SDL2 package requires X to be running. See the Raspberry Pi section for notes on running from the terminal and other improvements. + +2. Download and build spidr +``` +cd ~ +git clone https://www.github.com/nmatsuda/spidr +cd spidr +make clean; make +``` + +3. Download and build dump1090 +``` +cd ~ +git clone http://www.github.com/MalcolmRobb/dump1090) +cd dump1090 +make clean; make + +4. Run +``` +~/dump1090/dump1090 --net +cd spidr +./view1090 --fullsceen + +### Runtime Options + +--server [domain name or ip] Specify a dump1090 server. Renamed from the view1090 "--net-bo-ip-addr" argument +--metric Display metric units rather than imperial. + +--screensize [width] [height] Specify a specific resolution to pass to SDL_RenderSetLogicalSize, otherwise use resolution of display +--uiscale [scale] Scale up UI elements by integer amounts for high resolution screen +--fullscreen Render fullscreen rather than in a window + + + ### TODO -* change plane history from fixed array to linked list of planeObj, handle cleanup -* status box layout system -* status box tap for info - * trails w/ altitudes +* build for ios and android * menu system (toggles for UI elements) * map system (automatically load open source) * separate fully from view1090 (which interface?) @@ -20,13 +60,13 @@ Notes: Pi 3b+ and below are a little underpowerd for unoptimized map drawing Pi 4 is smooth, may have USB issues with RTLSDR? Up squared is good, but large -Up Core may be fine but bad connection options - try up core? +Up Core may be fine but bad connection options? PiJuice is by far best battery option. FCC/CE certified! Need to test stratux low power dongles. 987Mhz? -Waveshare 4.3" HDMI(B) is very good, slightly too large for handheld. Uses a lot of power, around 500ma +Waveshare 4.3" HDMI(B) and 5.5" AOLED are both very good, a little too large for handheld. Uses a lot of power, around 500ma for the 4.3", the AMOLED scales by the overal screen brightness. Pimoroni Hyperpixel 4.0 is the right size, but takes over default I2C pins so conflicts with PiJuice, unless some pin remapping. Also lower power, around 150ma Adafruit PiTFT 2.8" capacitive touch is ok, but a little small. Not sure about power draw. Docs claim no multitouch? @@ -88,34 +128,3 @@ Recommended: PiJuice 18650 batteries (18mm x 65mm). ~2200mAH ea. Adafruit pack + PowerBoost Charger, ~$40 http://www.ebay.com/itm/3-7-volts-6400-mAh-1S2P-18650-Li-Ion-Battery-Pack-PCB-protected-Panasonic-Cells-/221923032745?hash=item33aba4bea9:g:0-IAAOSw14xWLSr2 - -###INSTALLATION - -Tested and working on Ubuntu 18.04, Raspbian Stretch - -1. Install SDL and RTL-SDR libararies -``` -sudo apt-get install libsdl2-dev libsdl2-ttf-dev libsdl2-gfx-dev librtlsdr-dev -``` -2. Download and build spidr -``` -cd ~ -git clone https://www.github.com/nmatsuda/spidr -cd spidr -make clean; make -``` - -3. Download and build dump1090 -``` -cd ~ -git clone http://www.github.com/MalcolmRobb/dump1090) -cd dump1090 -make clean; make - -4. Run -``` -~/dump1090/dump1090 -cd spidr -./view1090 --screensize 240 400 --fullsceen - -### Runtime Options diff --git a/draw.c b/draw.c index bebe530..e6287c5 100644 --- a/draw.c +++ b/draw.c @@ -2,7 +2,7 @@ #include "structs.h" #include "SDL2/SDL2_rotozoom.h" #include "SDL2/SDL2_gfxPrimitives.h" - +#include "mapdata.h" //color schemes #include "parula.h" #include "monokai.h" @@ -128,6 +128,16 @@ void pxFromLonLat(double *dx, double *dy, double lon, double lat) { *dy = 6371.0 * (lat - appData.centerLat) * M_PI / 180.0f; } +void latLonFromScreenCoords(double *lat, double *lon, int x, int y) { + double scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; + + double dx = appData.maxDist * (x - (appData.screen_width>>1)) / (0.95 * scale_factor * 0.5 ); + double dy = appData.maxDist * (y - (appData.screen_height * CENTEROFFSET)) / (0.95 * scale_factor * 0.5 ); + + *lat = 180.0f * dy / (6371.0 * M_PI) + appData.centerLat; + *lon = 180.0 * dx / (cos(((*lat + appData.centerLat)/2.0f) * M_PI / 180.0f) * 6371.0 * M_PI) + appData.centerLon; +} + void screenCoords(int *outX, int *outY, double dx, double dy) { *outX = (appData.screen_width>>1) + ((dx>0) ? 1 : -1) * screenDist(dx); @@ -361,7 +371,77 @@ void drawGrid() drawString("100km", (appData.screen_width>>1) + (0.707 * p100km) + 5, (appData.screen_height * CENTEROFFSET) + (0.707 * p100km) + 5, appData.mapFont, pink); } +void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, double screen_lon_min, double screen_lon_max) { + + if(tree == NULL) { + return; + } + + double dx, dy; + int x, y; + + if (!(tree->lat_min < screen_lat_min && + tree->lat_max > screen_lat_max && + tree->lon_min < screen_lon_min && + tree->lon_max > screen_lon_max)) { + return; + } + + + Polygon *currentPolygon = tree->polygons; + + while(currentPolygon != NULL) { + // Sint16 *px = (Sint16*)malloc(sizeof(Sint16*)*currentPolygon->numPoints); + // Sint16 *py = (Sint16*)malloc(sizeof(Sint16*)*currentPolygon->numPoints); + + // for(int i=0; inumPoints; i++) { + + // pxFromLonLat(&dx, &dy, currentPolygon->points[i].lat, currentPolygon->points[i].lon); + // screenCoords(&x, &y, dx, dy); + + // px[i] = x; + // py[i] = y; + // } + + // double alpha = 1.0; + + pxFromLonLat(&dx, &dy, currentPolygon->lat_min, currentPolygon->lon_min); + screenCoords(&x, &y, dx, dy); + + int top = y; + int left = x; + + pxFromLonLat(&dx, &dy, currentPolygon->lat_max, currentPolygon->lon_max); + screenCoords(&x, &y, dx, dy); + + int bottom = y; + int right = x; + + //polygonRGBA (appData.renderer, px, py, currentPolygon->numPoints, alpha * purple.r + (1.0-alpha) * blue.r, alpha * purple.g + (1.0-alpha) * blue.g, alpha * purple.b + (1.0-alpha) * blue.b, 255 * alpha); + + rectangleRGBA(appData.renderer, left, top, right, bottom, purple.r, purple.g, purple.b, 255); + + + currentPolygon = currentPolygon->next; + } + + //drawPolys(tree->nw, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + //drawPolys(tree->sw, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + //drawPolys(tree->ne, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + //drawPolys(tree->se, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); +} + void drawGeography() { + + double screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max; + + latLonFromScreenCoords(&screen_lon_min, &screen_lat_min, 0, 0); + latLonFromScreenCoords(&screen_lon_max, &screen_lat_max, appData.screen_width, appData.screen_height); + + drawPolys(&root, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + + + return; int x1, y1, x2, y2; int skip = (int)(appData.maxDist / 25.0f); @@ -376,11 +456,11 @@ void drawGeography() { dx = 1; dy = 1; for(int j = 0; j < skip; j++) { - if(!mapPoints_relative[(i - skip + j) * 2]) { + if(!mapPoints[(i - skip + j) * 2]) { dx = 0; } - if(!mapPoints_relative[(i - skip + j) * 2 + 1]) { + if(!mapPoints[(i - skip + j) * 2 + 1]) { dy = 0; } } @@ -389,7 +469,7 @@ void drawGeography() { continue; } - pxFromLonLat(&dx, &dy, mapPoints_relative[(i - skip) * 2], mapPoints_relative[(i - skip) * 2 + 1]); + pxFromLonLat(&dx, &dy, mapPoints[(i - skip) * 2], mapPoints[(i - skip) * 2 + 1]); if(!dx || !dy) { continue; @@ -403,7 +483,7 @@ void drawGeography() { double d1 = sqrt(dx * dx + dy * dy); - pxFromLonLat(&dx, &dy, mapPoints_relative[i * 2], mapPoints_relative[i * 2 + 1]); + pxFromLonLat(&dx, &dy, mapPoints[i * 2], mapPoints[i * 2 + 1]); if(!dx || !dy) { continue; @@ -752,7 +832,7 @@ void drawMap() { if((int)(now - p->seen) > DISPLAY_ACTIVE) { planeColor = grey; } else { - planeColor = white; + planeColor = green; //srand(p->addr); // planeColor = hsv2SDLColor(255.0 * (double)rand()/(double)RAND_MAX, 255.0, 200.0); //planeColor = signalToColor((int)(255.0f * (float)rand()/(float)RAND_MAX)); diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index 7c1526e..f402cfa 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -5bec8587fd94772a4061e38543ad9846ffb0fc11 \ No newline at end of file +737abac0c33061fb6e1c86993e1b329d8a451dcd \ No newline at end of file diff --git a/font.o b/font.o index 1b9094e1f1c196d1da92e0fc47a3baa2e7a38cff..75c233bf95cb4ceb203437a7334de8e1358b8055 100644 GIT binary patch delta 6586 zcmaJ_4Rln+6@Ih%hw!t6WHQl2LXaegzOKlRqQszwB}RmWBoG250RkkEpA94dH6{TB z!+*RYqzdiQ`bUq-8rn*&!b+i_95h<22v)XHd(cvi;13?q-r09w5^jrgPUg*g-#2&e z+?jXhZI0}8Y~SJ7lHu6?sDDVELwH)Ba}4V(!r^q^r22@3hGE2nVHGN|f52vWZ^P(k zI5m(EH48h@y189O?(2hE-Ime8D12D$7!5~T?H>EF-PdZz9>R8_)$XO+1FUv$-OiwP zU)}kI)o~tzZO(7gmf?&^p;>Nx3&}3$uF>F;KGM|+d-^5xYDEvjt&z7Jg!lTbN`DWL zl50alvvqqwxYZe}J7=P-&Ry+L7dOFi-U-Lzo-I0vOs`Qmq>mAsg%7O^^`neXEZXgU ztr0sCV{^W%9~u1xx@UPhMdMwbrew(cVmRJ^oSNGY-7s)Ph7lQEj2%lqqc_|bKUnmE zy!c__5Ih<`G_Oy8Ei#NWU5T+y3~*TUp8A2IZk~>-E`$6DRzue*)D+_@;tb>Z08xW& z#c|jy2S=VnxG4@^l`8oYZ2C}|F7g~TxCyrKE5!c-6$vS0E@A6*NRjVY+D#EH4dVjg zI5N{78HadhCj|~Cq=_fs^8~%96q$?*yj>=b_<84tbl}Rb;(SCp+V2a0l1U-oGvfch z@43(+E#K#a6#wh{gM|N#?-LS}-5;QAfL@!3(+5+RA=bk%ZbnzqMSj?Mk#86`XjFvT zBHh!cNEh*xAN+|KBW&)9EmM}p5IwyZ>8q{!4xDNW+@_MQ*YWM#&+(QA!etmkwH?Pi z{q}|(Z(X70CdVu+T{3BL`J!b@TThRe6xMq8ZL4Ej506_J-nu+@ylDO4-VYoi9sCoe z7y?Hp);hkAgRzrt5_7;iNvbn+l%|qLEnWQudpHc2L3BHvdsjUx^mo^k3F zz5%*CXFUwt#1ByFk!l8=?!Pj26f}EG@gW2}()B(DUzhK!N2i4-d~I|I6V}tVJP%?f zyG0dvCQFeF<&#bIW++7%#tf!x20v02moWB2XCPik%OKBjp9+EDW$oGmO?hv^i3!8Ct{ z(&=thMkgmM;!1DhAuzob)7Y&=rn)%kB#+WgqeXjndDnn;AU z8K!s@#7tAX39gx&#YzawlxpR5)+EXL62)SNrT{vS-A(Lp#tw$mS+(LmXqn{}n;|$$ zssd8J%apHxvsj8(S~H8E4Rd@i;oaG@#6fV)k?QxDbac5Ky3)I5J_V(7Owj|HQ4^PJ zY2rh7YnMhq09hApYbs;!f)2D$1gUeS$Y{NFZj=!3LUx%A{Gi4xW$X$TOd^gCAmVTPk^=s zZdFgLm$6&GRW6l}*gD3xLn*Qsh;3qQ1T-U?Kx^O1*mMY#n?gWGxjW}R((GfJFpBnm zhP&vb9Afw}XsnPT2U;rJVmkz}-V2$Prh0<(qNf#aJxt#+FN3#Is^i4=V(jPOt29Lt zw4r7M-BZ^y&14YwOR)&l{a=cK5VO!NUI5QRQ``oP3#IrMv@EO@yTQ50tqxF93@{6? zgLjb>yP#>2DL#gMi`-%rh{bNTf%f+@)9-}R#Zv7dHbyT4i@l;Zpc&b}5gX6g&me&8 zlaz8&8Cwe-i%rZFsY^`J1fC_u;wJDfajQ#|Cd-+A9XP#G42Mjwsm9VB-N-awf!8Zl z5wRN?I}Uuv7Et_K80&*JuPK&+sM;(Npt;H|UWb!a`^9`{S?U&VLvX1SQE+i-t>e2C zs9H8oRZ^a;=yhdKo`JSyQYbjP%v3!otFK|2J>aUA;xyz`o9Ya0)h?!~f#zzdj*^8v zj6DSbw2%uYt4(n&#MGGLNw~GfR8Ld*zGnJrXsnUqW@xFY#e?FkmEr(o*4~hxZaE*S z?+JatcWv(}T44d<`jesaD-GKfOz)wUR6|Ft%xPq7fNt-N48MmmXA8rBP5P(7vs~8u z8JkAi_Zq{ekhP->Uq{=1g5e+0#yK+NWq2*Ecq;@S#G93|L+A{?2+oIO{i}@qj-qme;djyEPcVEw zeK7u$;S=eUeaZ08XqPTo_>j)%?xk&up(AE*Q#)D4J|E!)Mb{-3+&1*eMXexk?xtOQR~G1KC<)^;Mn4&vvs+-;5y(d!Z580B33JVemgJ>)&B)HL)kU;X3KQ zOdnt$cf<8upOgNRZn)O}M91hq-EgfRK>7W=g?DAxcrtXE4Je=i4m#`hR=s4uy$rW6 zkZZtKFV!GowQ+4If~;jh8?tvZHig*fAR4-UoY`Z4MINpL7qYw9*iVQ(1f>l!=Oe~m zAod%E+x|G{?Xu^}AWsq?fOB2T*b-ccF2kS$**l2UkbDw@_|q>V|7;_TFu0xV?9~z`0VY-w|ua zB$;A(7_yOli?Jh!4T2ZhuNnJCoK+Vm_>j${!)#l=WRb?b(1z?>#>SH6hd`{7s)@1o ztGEqZ$nM}QS>6k!$i7ajy;EOPd=5f0vM0N-I!aS%Y&!&y{eiJ-D6fV?2eL8r>&AXN zqUZ*QgVfbhB{Ft0SsnbxsGg%8x+iAM4&!AsGcFZ5A>tX0s@L>$krA#;SD)<GS``>!4!e2!a1M-I#^HCWBZ%2dSH~ r93^XE_NFm03*6QW2jKZlBV#ght)2(YV(-9OtM@)MyW`;Yb+P{iazjdp delta 6605 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 HYLEUOYFSzE diff --git a/gmon.out b/gmon.out new file mode 100644 index 0000000000000000000000000000000000000000..cbb6f49c8d0dac4a334e1651fa2ca6505616d503 GIT binary patch literal 39807 zcmeI5ONbm*6o#veh*5$~l95p}(z@^w6YUwJA&JI{B$|X|Xc3H}kWwRpk4%}4yCA)g zEEJ@dJ~joqQ4q^aL~vDt#@$eYZX^jEe4}WS_}Z9w&-u@l>Ylqx>*_BEr_WdCo>TSR z+Y`bp^5nB~`{QWjYOV#?HH%xjwnx!EhdNI@KDU2g$5;RR!2?DbpaB}70UDqI8lV9h zpaB}70UDqI8lV9hpaB}70UDqI8lV9hpaB}70UDqI8lV9hpaB}70UDqI8lV9hpaB}7 z0UDqI8lV9hpaB}70UDqI8lV9hpaB}70UDqI8lV9hpaB}70UDqI8lV9hpaB}70UDqI z8lV9hpaB}70UDqI8lV9hpaB}70UDqI8lV9h2pJgt4>Csc(3*FWXIp-Q9pEcOvd}H0~L!b^tDOA#Svh zME4@D64)MrQvwGD4;QGsUSR7!BOrJtBY4Kfw z)d>7dV1Evkoz$YdQIsL^Jv#!k=Ky{0Yh4=m41Qw0U7<5SQmL?gV0igUQrYML`sK$2 zrUwBZkXLcn689&Lp4ZROhG!7p6IdQX^0PtN@i>10&@aDGVD>iPR@*DxxV|)T*WY$? z)_sms+lI<+>UMPB*TQJQDiszXn9rlq_teTV1f!#<^n+H)^oBvdTwxM|xxp!WUac$* z`sY;G{9t&{3K^6b^n(SOC_!^bxK1WoT z{D5TkJH(GJaLd~UUpJ^`}6M8157}xC!utc~$e#8o+tmD}@b%lh@#;9M?EA_{znA z`aNo`MdG*P8>vhUdY=k&gI?WIsVqjIRyJ=L?s-Hi+Xj74g#&}WCn{T5J_K`vemAwU zGI+-yZi2h?YdA1CeYOT0_Lu$qRp^aD2K^vamxW;0;OXztQ!9H08ynG6VQKJF+be~Y z!8f+nDqFWBxy-&tlEv*1?1o?-f@KJ{*JIFei#n)lNmifU3&A`Dix4bBFxiah{>OzL X#cl|u+fcc%2@&c-Fu5mCSp?ueYcDw@ literal 0 HcmV?d00001 diff --git a/init.c b/init.c index 46d5643..720cd3a 100644 --- a/init.c +++ b/init.c @@ -2,6 +2,7 @@ #include "structs.h" void init(char *title) { + // raspberry pi compiler flag enables these options #ifdef RPI putenv((char*)"FRAMEBUFFER=/dev/fb1"); diff --git a/init.o b/init.o index 60eada60fbb9e10121585d6f7cddf46360135efc..129f6da5576fef0e9286074f6db2df9c54e526db 100644 GIT binary patch literal 47992 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 literal 47128 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 SR}$1??&uyfcL8!LJNyUeB4VZh delta 8433 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 Zbk}JQo3*i!`^xC9HAl?a4LA|)|1asnQ|kZ# diff --git a/mapdata.c.REMOVED.git-id b/mapdata.c.REMOVED.git-id index 62add43..3a02d0f 100644 --- a/mapdata.c.REMOVED.git-id +++ b/mapdata.c.REMOVED.git-id @@ -1 +1 @@ -7ed2e5c3d762695e6aaf4111584830b537a549a0 \ No newline at end of file +212d4fb6e7ea7b3c502081037abbac1fbdd9fccf \ No newline at end of file diff --git a/mapdata.h b/mapdata.h index bcdd7c1..2dc6d4e 100644 --- a/mapdata.h +++ b/mapdata.h @@ -1,4 +1,43 @@ +#ifndef MAPPOINTS_H +#define MAPPOINTS_H + double *mapPoints_relative; -double *mapPoints_x; -double *mapPoints_y; int mapPoints_count; + +extern double mapPoints[]; + +typedef struct Point{ + double lat; + double lon; + struct Point *next; +} Point; + +typedef struct Polygon{ + double lat_min; + double lat_max; + double lon_min; + double lon_max; + + Point *points; + int numPoints; + + struct Polygon *next; +} Polygon; + +typedef struct QuadTree{ + double lat_min; + double lat_max; + double lon_min; + double lon_max; + + Polygon *polygons; + + struct QuadTree *nw; + struct QuadTree *sw; + struct QuadTree *ne; + struct QuadTree *se; +} QuadTree; + +QuadTree root; + +#endif \ No newline at end of file diff --git a/mapdata.o.REMOVED.git-id b/mapdata.o.REMOVED.git-id index c37fba4..abf0145 100644 --- a/mapdata.o.REMOVED.git-id +++ b/mapdata.o.REMOVED.git-id @@ -1 +1 @@ -c95610367de3a9e8503644016da9760739f94993 \ No newline at end of file +1c1e7d6bdf081956022b7592b8d59a929da2f463 \ No newline at end of file diff --git a/monokai.o b/monokai.o index 8a201795ce6391505025af9a1b3783a33d9a8d0a..03c4bd0d030293b931e0edf9d9acac10805ee7d6 100644 GIT binary patch delta 7462 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 GkNZDt@(Wr3 delta 7550 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 Q9=Btj%^!*?=jO%#56d4UvH$=8 diff --git a/planeObj.o b/planeObj.o index e2a0fd7166bbd23b72d0a2773463afecbf570439..44e6d2644d4415c37a5bb0f025618c55079d618c 100644 GIT binary patch delta 10022 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 +[3] 100.0 0.00 0.03 main [3] + 0.00 0.03 323/323 draw [1] + 0.00 0.00 324/324 getInput [31] + 0.00 0.00 323/323 interactiveRemoveStaleAircrafts [32] + 0.00 0.00 323/323 modesReadFromClient [33] + 0.00 0.00 1/1 view1090InitConfig [66] + 0.00 0.00 1/1 view1090Init [65] + 0.00 0.00 1/1 setupConnection [64] + 0.00 0.00 1/1 init [61] +----------------------------------------------- + 0.02 0.00 600/600 drawMap [2] +[4] 66.7 0.02 0.00 600 resolveLabelConflicts [4] + 0.00 0.00 172/172 sign [36] +----------------------------------------------- + 0.01 0.00 2147/2147 drawMap [2] +[5] 33.3 0.01 0.00 2147 drawTrail [5] + 0.00 0.00 2456/4608 pxFromLonLat [8] + 0.00 0.00 2456/4608 screenCoords [9] + 0.00 0.00 1846/2831 outOfBounds [10] + 0.00 0.00 613/1598 CROSSVP [14] +----------------------------------------------- + 0.00 0.00 450/9666 drawGrid [39] + 0.00 0.00 9216/9666 screenCoords [9] +[6] 0.0 0.00 0.00 9666 screenDist [6] +----------------------------------------------- + 0.00 0.00 473/4935 draw [1] + 0.00 0.00 1312/4935 drawSignalMarks [16] + 0.00 0.00 3150/4935 drawMap [2] +[7] 0.0 0.00 0.00 4935 mstime [7] +----------------------------------------------- + 0.00 0.00 2152/4608 drawMap [2] + 0.00 0.00 2456/4608 drawTrail [5] +[8] 0.0 0.00 0.00 4608 pxFromLonLat [8] +----------------------------------------------- + 0.00 0.00 2152/4608 drawMap [2] + 0.00 0.00 2456/4608 drawTrail [5] +[9] 0.0 0.00 0.00 4608 screenCoords [9] + 0.00 0.00 9216/9666 screenDist [6] +----------------------------------------------- + 0.00 0.00 985/2831 drawMap [2] + 0.00 0.00 1846/2831 drawTrail [5] +[10] 0.0 0.00 0.00 2831 outOfBounds [10] +----------------------------------------------- + 0.00 0.00 2147/2147 updatePlanes [41] +[11] 0.0 0.00 0.00 2147 findPlaneObj [11] +----------------------------------------------- + 0.00 0.00 1770/1770 drawPlaneText [15] +[12] 0.0 0.00 0.00 1770 drawStringBG [12] +----------------------------------------------- + 0.00 0.00 450/1650 drawGrid [39] + 0.00 0.00 1200/1650 drawStatusBox [19] +[13] 0.0 0.00 0.00 1650 drawString [13] +----------------------------------------------- + 0.00 0.00 457/1598 drawPlaneOffMap [22] + 0.00 0.00 528/1598 drawPlaneHeading [20] + 0.00 0.00 613/1598 drawTrail [5] +[14] 0.0 0.00 0.00 1598 CROSSVP [14] +----------------------------------------------- + 0.00 0.00 985/985 drawMap [2] +[15] 0.0 0.00 0.00 985 drawPlaneText [15] + 0.00 0.00 1770/1770 drawStringBG [12] + 0.00 0.00 656/656 drawSignalMarks [16] +----------------------------------------------- + 0.00 0.00 656/656 drawPlaneText [15] +[16] 0.0 0.00 0.00 656 drawSignalMarks [16] + 0.00 0.00 1312/4935 mstime [7] + 0.00 0.00 656/656 signalToColor [18] +----------------------------------------------- + 0.00 0.00 656/656 signalToColor [18] +[17] 0.0 0.00 0.00 656 setColor [17] +----------------------------------------------- + 0.00 0.00 656/656 drawSignalMarks [16] +[18] 0.0 0.00 0.00 656 signalToColor [18] + 0.00 0.00 656/656 setColor [17] +----------------------------------------------- + 0.00 0.00 600/600 drawStatus [40] +[19] 0.0 0.00 0.00 600 drawStatusBox [19] + 0.00 0.00 1200/1650 drawString [13] +----------------------------------------------- + 0.00 0.00 528/528 drawMap [2] +[20] 0.0 0.00 0.00 528 drawPlaneHeading [20] + 0.00 0.00 528/1598 CROSSVP [14] +----------------------------------------------- + 0.00 0.00 107/493 modesInitErrorInfo [63] + 0.00 0.00 386/493 decodeModesMessage [25] +[21] 0.0 0.00 0.00 493 modesChecksum [21] +----------------------------------------------- + 0.00 0.00 457/457 drawMap [2] +[22] 0.0 0.00 0.00 457 drawPlaneOffMap [22] + 0.00 0.00 457/1598 CROSSVP [14] +----------------------------------------------- + 0.00 0.00 181/387 ICAOAddressWasRecentlySeen [35] + 0.00 0.00 206/387 addRecentlySeenICAOAddr [34] +[23] 0.0 0.00 0.00 387 ICAOCacheHashAddress [23] +----------------------------------------------- + 0.00 0.00 386/386 modesReadFromClient [33] +[24] 0.0 0.00 0.00 386 decodeBinMessage [24] + 0.00 0.00 386/386 decodeModesMessage [25] + 0.00 0.00 386/386 useModesMessage [27] +----------------------------------------------- + 0.00 0.00 386/386 decodeBinMessage [24] +[25] 0.0 0.00 0.00 386 decodeModesMessage [25] + 0.00 0.00 386/386 modesMessageLenByType [26] + 0.00 0.00 386/493 modesChecksum [21] + 0.00 0.00 206/206 addRecentlySeenICAOAddr [34] + 0.00 0.00 181/181 ICAOAddressWasRecentlySeen [35] + 0.00 0.00 167/167 decodeAC13Field [37] + 0.00 0.00 72/72 decodeAC12Field [45] + 0.00 0.00 3/22 decodeID13Field [49] +----------------------------------------------- + 0.00 0.00 386/386 decodeModesMessage [25] +[26] 0.0 0.00 0.00 386 modesMessageLenByType [26] +----------------------------------------------- + 0.00 0.00 386/386 decodeBinMessage [24] +[27] 0.0 0.00 0.00 386 useModesMessage [27] + 0.00 0.00 373/373 interactiveReceiveData [29] +----------------------------------------------- + 0.00 0.00 373/373 interactiveReceiveData [29] +[28] 0.0 0.00 0.00 373 interactiveFindAircraft [28] +----------------------------------------------- + 0.00 0.00 373/373 useModesMessage [27] +[29] 0.0 0.00 0.00 373 interactiveReceiveData [29] + 0.00 0.00 373/373 interactiveFindAircraft [28] + 0.00 0.00 72/72 mstime [46] + 0.00 0.00 55/55 decodeCPR [48] + 0.00 0.00 17/17 interactiveCreateAircraft [53] + 0.00 0.00 17/17 decodeCPRrelative [52] +----------------------------------------------- + 0.00 0.00 110/330 cprNFunction [43] + 0.00 0.00 220/330 decodeCPR [48] +[30] 0.0 0.00 0.00 330 cprNLFunction [30] +----------------------------------------------- + 0.00 0.00 324/324 main [3] +[31] 0.0 0.00 0.00 324 getInput [31] +----------------------------------------------- + 0.00 0.00 323/323 main [3] +[32] 0.0 0.00 0.00 323 interactiveRemoveStaleAircrafts [32] + 0.00 0.00 6/6 interactiveRemoveStaleDF [54] +----------------------------------------------- + 0.00 0.00 323/323 main [3] +[33] 0.0 0.00 0.00 323 modesReadFromClient [33] + 0.00 0.00 386/386 decodeBinMessage [24] +----------------------------------------------- + 0.00 0.00 206/206 decodeModesMessage [25] +[34] 0.0 0.00 0.00 206 addRecentlySeenICAOAddr [34] + 0.00 0.00 206/387 ICAOCacheHashAddress [23] +----------------------------------------------- + 0.00 0.00 181/181 decodeModesMessage [25] +[35] 0.0 0.00 0.00 181 ICAOAddressWasRecentlySeen [35] + 0.00 0.00 181/387 ICAOCacheHashAddress [23] +----------------------------------------------- + 0.00 0.00 172/172 resolveLabelConflicts [4] +[36] 0.0 0.00 0.00 172 sign [36] +----------------------------------------------- + 0.00 0.00 167/167 decodeModesMessage [25] +[37] 0.0 0.00 0.00 167 decodeAC13Field [37] + 0.00 0.00 10/22 decodeID13Field [49] + 0.00 0.00 10/19 ModeAToModeC [50] +----------------------------------------------- + 0.00 0.00 165/165 decodeCPR [48] +[38] 0.0 0.00 0.00 165 cprModFunction [38] +----------------------------------------------- + 0.00 0.00 150/150 drawMap [2] +[39] 0.0 0.00 0.00 150 drawGrid [39] + 0.00 0.00 450/9666 screenDist [6] + 0.00 0.00 450/1650 drawString [13] +----------------------------------------------- + 0.00 0.00 150/150 draw [1] +[40] 0.0 0.00 0.00 150 drawStatus [40] + 0.00 0.00 600/600 drawStatusBox [19] +----------------------------------------------- + 0.00 0.00 150/150 draw [1] +[41] 0.0 0.00 0.00 150 updatePlanes [41] + 0.00 0.00 2147/2147 findPlaneObj [11] + 0.00 0.00 108/108 mstime [44] + 0.00 0.00 17/17 createPlaneObj [51] +----------------------------------------------- + 0.00 0.00 150/150 draw [1] +[42] 0.0 0.00 0.00 150 updateStatus [42] +----------------------------------------------- + 0.00 0.00 55/110 cprDlonFunction [47] + 0.00 0.00 55/110 decodeCPR [48] +[43] 0.0 0.00 0.00 110 cprNFunction [43] + 0.00 0.00 110/330 cprNLFunction [30] +----------------------------------------------- + 0.00 0.00 108/108 updatePlanes [41] +[44] 0.0 0.00 0.00 108 mstime [44] +----------------------------------------------- + 0.00 0.00 72/72 decodeModesMessage [25] +[45] 0.0 0.00 0.00 72 decodeAC12Field [45] + 0.00 0.00 9/22 decodeID13Field [49] + 0.00 0.00 9/19 ModeAToModeC [50] +----------------------------------------------- + 0.00 0.00 72/72 interactiveReceiveData [29] +[46] 0.0 0.00 0.00 72 mstime [46] +----------------------------------------------- + 0.00 0.00 55/55 decodeCPR [48] +[47] 0.0 0.00 0.00 55 cprDlonFunction [47] + 0.00 0.00 55/110 cprNFunction [43] +----------------------------------------------- + 0.00 0.00 55/55 interactiveReceiveData [29] +[48] 0.0 0.00 0.00 55 decodeCPR [48] + 0.00 0.00 220/330 cprNLFunction [30] + 0.00 0.00 165/165 cprModFunction [38] + 0.00 0.00 55/110 cprNFunction [43] + 0.00 0.00 55/55 cprDlonFunction [47] +----------------------------------------------- + 0.00 0.00 3/22 decodeModesMessage [25] + 0.00 0.00 9/22 decodeAC12Field [45] + 0.00 0.00 10/22 decodeAC13Field [37] +[49] 0.0 0.00 0.00 22 decodeID13Field [49] +----------------------------------------------- + 0.00 0.00 9/19 decodeAC12Field [45] + 0.00 0.00 10/19 decodeAC13Field [37] +[50] 0.0 0.00 0.00 19 ModeAToModeC [50] +----------------------------------------------- + 0.00 0.00 17/17 updatePlanes [41] +[51] 0.0 0.00 0.00 17 createPlaneObj [51] +----------------------------------------------- + 0.00 0.00 17/17 interactiveReceiveData [29] +[52] 0.0 0.00 0.00 17 decodeCPRrelative [52] +----------------------------------------------- + 0.00 0.00 17/17 interactiveReceiveData [29] +[53] 0.0 0.00 0.00 17 interactiveCreateAircraft [53] +----------------------------------------------- + 0.00 0.00 6/6 interactiveRemoveStaleAircrafts [32] +[54] 0.0 0.00 0.00 6 interactiveRemoveStaleDF [54] +----------------------------------------------- + 0.00 0.00 5/5 cleanup [85] +[55] 0.0 0.00 0.00 5 closeFont [55] +----------------------------------------------- + 0.00 0.00 5/5 init [61] +[56] 0.0 0.00 0.00 5 loadFont [56] +----------------------------------------------- + 0.00 0.00 1/1 anetTcpGenericConnect [60] +[57] 0.0 0.00 0.00 1 anetCreateSocket [57] +----------------------------------------------- + 0.00 0.00 1/1 setupConnection [64] +[58] 0.0 0.00 0.00 1 anetNonBlock [58] +----------------------------------------------- + 0.00 0.00 1/1 setupConnection [64] +[59] 0.0 0.00 0.00 1 anetTcpConnect [59] + 0.00 0.00 1/1 anetTcpGenericConnect [60] +----------------------------------------------- + 0.00 0.00 1/1 anetTcpConnect [59] +[60] 0.0 0.00 0.00 1 anetTcpGenericConnect [60] + 0.00 0.00 1/1 anetCreateSocket [57] +----------------------------------------------- + 0.00 0.00 1/1 main [3] +[61] 0.0 0.00 0.00 1 init [61] + 0.00 0.00 5/5 loadFont [56] + 0.00 0.00 1/1 initMaps [62] +----------------------------------------------- + 0.00 0.00 1/1 init [61] +[62] 0.0 0.00 0.00 1 initMaps [62] +----------------------------------------------- + 0.00 0.00 1/1 view1090Init [65] +[63] 0.0 0.00 0.00 1 modesInitErrorInfo [63] + 0.00 0.00 107/493 modesChecksum [21] +----------------------------------------------- + 0.00 0.00 1/1 main [3] +[64] 0.0 0.00 0.00 1 setupConnection [64] + 0.00 0.00 1/1 anetTcpConnect [59] + 0.00 0.00 1/1 anetNonBlock [58] +----------------------------------------------- + 0.00 0.00 1/1 main [3] +[65] 0.0 0.00 0.00 1 view1090Init [65] + 0.00 0.00 1/1 modesInitErrorInfo [63] +----------------------------------------------- + 0.00 0.00 1/1 main [3] +[66] 0.0 0.00 0.00 1 view1090InitConfig [66] +----------------------------------------------- + + This table describes the call tree of the program, and was sorted by + the total amount of time spent in each function and its children. + + Each entry in this table consists of several lines. The line with the + index number at the left hand margin lists the current function. + The lines above it list the functions that called this function, + and the lines below it list the functions this one called. + This line lists: + index A unique number given to each element of the table. + Index numbers are sorted numerically. + The index number is printed next to every function name so + it is easier to look up where the function is in the table. + + % time This is the percentage of the `total' time that was spent + in this function and its children. Note that due to + different viewpoints, functions excluded by options, etc, + these numbers will NOT add up to 100%. + + self This is the total amount of time spent in this function. + + children This is the total amount of time propagated into this + function by its children. + + called This is the number of times the function was called. + If the function called itself recursively, the number + only includes non-recursive calls, and is followed by + a `+' and the number of recursive calls. + + name The name of the current function. The index number is + printed after it. If the function is a member of a + cycle, the cycle number is printed between the + function's name and the index number. + + + For the function's parents, the fields have the following meanings: + + self This is the amount of time that was propagated directly + from the function into this parent. + + children This is the amount of time that was propagated from + the function's children into this parent. + + called This is the number of times this parent called the + function `/' the total number of times the function + was called. Recursive calls to the function are not + included in the number after the `/'. + + name This is the name of the parent. The parent's index + number is printed after it. If the parent is a + member of a cycle, the cycle number is printed between + the name and the index number. + + If the parents of the function cannot be determined, the word + `' is printed in the `name' field, and all the other + fields are blank. + + For the function's children, the fields have the following meanings: + + self This is the amount of time that was propagated directly + from the child into the function. + + children This is the amount of time that was propagated from the + child's children to the function. + + called This is the number of times the function called + this child `/' the total number of times the child + was called. Recursive calls by the child are not + listed in the number after the `/'. + + name This is the name of the child. The child's index + number is printed after it. If the child is a + member of a cycle, the cycle number is printed + between the name and the index number. + + If there are any cycles (circles) in the call graph, there is an + entry for the cycle-as-a-whole. This entry shows who called the + cycle (as parents) and the members of the cycle (as children.) + The `+' recursive calls entry shows the number of function calls that + were internal to the cycle, and the calls entry for each member shows, + for that member, how many times it was called from other members of + the cycle. + +Copyright (C) 2012-2018 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Index by function name + + [14] CROSSVP [1] draw [21] modesChecksum + [35] ICAOAddressWasRecentlySeen [39] drawGrid [63] modesInitErrorInfo + [23] ICAOCacheHashAddress [2] drawMap [26] modesMessageLenByType + [50] ModeAToModeC [20] drawPlaneHeading [33] modesReadFromClient + [34] addRecentlySeenICAOAddr [22] drawPlaneOffMap [46] mstime + [57] anetCreateSocket [15] drawPlaneText [44] mstime + [58] anetNonBlock [16] drawSignalMarks [7] mstime + [59] anetTcpConnect [40] drawStatus [10] outOfBounds + [60] anetTcpGenericConnect [19] drawStatusBox [8] pxFromLonLat + [55] closeFont [13] drawString [4] resolveLabelConflicts + [47] cprDlonFunction [12] drawStringBG [9] screenCoords + [38] cprModFunction [5] drawTrail [6] screenDist + [43] cprNFunction [11] findPlaneObj [17] setColor + [30] cprNLFunction [31] getInput [64] setupConnection + [51] createPlaneObj [61] init [36] sign + [45] decodeAC12Field [62] initMaps [18] signalToColor + [37] decodeAC13Field [53] interactiveCreateAircraft [41] updatePlanes + [24] decodeBinMessage [28] interactiveFindAircraft [42] updateStatus + [48] decodeCPR [29] interactiveReceiveData [27] useModesMessage + [52] decodeCPRrelative [32] interactiveRemoveStaleAircrafts [65] view1090Init + [49] decodeID13Field [54] interactiveRemoveStaleDF [66] view1090InitConfig + [25] decodeModesMessage [56] loadFont diff --git a/prof_output_withgeography b/prof_output_withgeography new file mode 100644 index 0000000..9c55a8a --- /dev/null +++ b/prof_output_withgeography @@ -0,0 +1,517 @@ +Flat profile: + +Each sample counts as 0.01 seconds. + % cumulative self self total + time seconds seconds calls ms/call ms/call name + 38.46 0.05 0.05 62 0.81 2.10 drawGeography + 23.08 0.08 0.03 7006834 0.00 0.00 screenDist + 23.08 0.11 0.03 3503324 0.00 0.00 screenCoords + 15.39 0.13 0.02 3508939 0.00 0.00 pxFromLonLat + 0.00 0.13 0.00 3502994 0.00 0.00 outOfBounds + 0.00 0.13 0.00 1057 0.00 0.00 mstime + 0.00 0.13 0.00 698 0.00 0.00 drawTrail + 0.00 0.13 0.00 698 0.00 0.00 findPlaneObj + 0.00 0.13 0.00 682 0.00 0.00 drawString + 0.00 0.13 0.00 510 0.00 0.00 drawStringBG + 0.00 0.13 0.00 478 0.00 0.00 modesChecksum + 0.00 0.13 0.00 372 0.00 0.00 ICAOCacheHashAddress + 0.00 0.13 0.00 371 0.00 0.00 decodeBinMessage + 0.00 0.13 0.00 371 0.00 0.00 decodeModesMessage + 0.00 0.13 0.00 371 0.00 0.00 modesMessageLenByType + 0.00 0.13 0.00 371 0.00 0.00 useModesMessage + 0.00 0.13 0.00 351 0.00 0.00 interactiveFindAircraft + 0.00 0.13 0.00 351 0.00 0.00 interactiveReceiveData + 0.00 0.13 0.00 251 0.00 0.00 CROSSVP + 0.00 0.13 0.00 248 0.00 0.00 drawStatusBox + 0.00 0.13 0.00 248 0.00 0.00 resolveLabelConflicts + 0.00 0.13 0.00 234 0.00 0.00 cprNLFunction + 0.00 0.13 0.00 199 0.00 0.00 ICAOAddressWasRecentlySeen + 0.00 0.13 0.00 178 0.00 0.00 drawPlaneText + 0.00 0.13 0.00 175 0.00 0.00 decodeAC13Field + 0.00 0.13 0.00 173 0.00 0.00 addRecentlySeenICAOAddr + 0.00 0.13 0.00 172 0.00 0.00 sign + 0.00 0.13 0.00 170 0.00 0.00 drawSignalMarks + 0.00 0.13 0.00 170 0.00 0.00 setColor + 0.00 0.13 0.00 170 0.00 0.00 signalToColor + 0.00 0.13 0.00 117 0.00 0.00 cprModFunction + 0.00 0.13 0.00 89 0.00 0.00 drawPlaneHeading + 0.00 0.13 0.00 89 0.00 0.00 drawPlaneOffMap + 0.00 0.13 0.00 82 0.00 0.00 mstime + 0.00 0.13 0.00 78 0.00 0.00 cprNFunction + 0.00 0.13 0.00 63 0.00 0.00 getInput + 0.00 0.13 0.00 62 0.00 2.10 draw + 0.00 0.13 0.00 62 0.00 0.00 drawGrid + 0.00 0.13 0.00 62 0.00 2.10 drawMap + 0.00 0.13 0.00 62 0.00 0.00 drawStatus + 0.00 0.13 0.00 62 0.00 0.00 interactiveRemoveStaleAircrafts + 0.00 0.13 0.00 62 0.00 0.00 modesReadFromClient + 0.00 0.13 0.00 62 0.00 0.00 updatePlanes + 0.00 0.13 0.00 62 0.00 0.00 updateStatus + 0.00 0.13 0.00 57 0.00 0.00 decodeAC12Field + 0.00 0.13 0.00 57 0.00 0.00 mstime + 0.00 0.13 0.00 39 0.00 0.00 cprDlonFunction + 0.00 0.13 0.00 39 0.00 0.00 decodeCPR + 0.00 0.13 0.00 18 0.00 0.00 decodeCPRrelative + 0.00 0.13 0.00 13 0.00 0.00 createPlaneObj + 0.00 0.13 0.00 13 0.00 0.00 interactiveCreateAircraft + 0.00 0.13 0.00 7 0.00 0.00 decodeID13Field + 0.00 0.13 0.00 6 0.00 0.00 interactiveRemoveStaleDF + 0.00 0.13 0.00 5 0.00 0.00 closeFont + 0.00 0.13 0.00 5 0.00 0.00 loadFont + 0.00 0.13 0.00 1 0.00 0.00 anetCreateSocket + 0.00 0.13 0.00 1 0.00 0.00 anetNonBlock + 0.00 0.13 0.00 1 0.00 0.00 anetTcpConnect + 0.00 0.13 0.00 1 0.00 0.00 anetTcpGenericConnect + 0.00 0.13 0.00 1 0.00 0.00 init + 0.00 0.13 0.00 1 0.00 0.00 initMaps + 0.00 0.13 0.00 1 0.00 0.00 modesInitErrorInfo + 0.00 0.13 0.00 1 0.00 0.00 setupConnection + 0.00 0.13 0.00 1 0.00 0.00 view1090Init + 0.00 0.13 0.00 1 0.00 0.00 view1090InitConfig + + % the percentage of the total running time of the +time program used by this function. + +cumulative a running sum of the number of seconds accounted + seconds for by this function and those listed above it. + + self the number of seconds accounted for by this +seconds function alone. This is the major sort for this + listing. + +calls the number of times this function was invoked, if + this function is profiled, else blank. + + self the average number of milliseconds spent in this +ms/call function per call, if this function is profiled, + else blank. + + total the average number of milliseconds spent in this +ms/call function and its descendents per call, if this + function is profiled, else blank. + +name the name of the function. This is the minor sort + for this listing. The index shows the location of + the function in the gprof listing. If the index is + in parenthesis it shows where it would appear in + the gprof listing if it were to be printed. + +Copyright (C) 2012-2018 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + + Call graph (explanation follows) + + +granularity: each sample hit covers 2 byte(s) for 7.69% of 0.13 seconds + +index % time self children called name + 0.00 0.13 62/62 main [3] +[1] 100.0 0.00 0.13 62 draw [1] + 0.00 0.13 62/62 drawMap [2] + 0.00 0.00 124/1057 mstime [11] + 0.00 0.00 62/62 updatePlanes [44] + 0.00 0.00 62/62 updateStatus [45] + 0.00 0.00 62/62 drawStatus [41] +----------------------------------------------- + 0.00 0.13 62/62 draw [1] +[2] 100.0 0.00 0.13 62 drawMap [2] + 0.05 0.08 62/62 drawGeography [4] + 0.00 0.00 698/698 drawTrail [8] + 0.00 0.00 406/3503324 screenCoords [5] + 0.00 0.00 406/3508939 pxFromLonLat [7] + 0.00 0.00 62/62 drawGrid [9] + 0.00 0.00 593/1057 mstime [11] + 0.00 0.00 248/248 resolveLabelConflicts [25] + 0.00 0.00 178/3502994 outOfBounds [10] + 0.00 0.00 178/178 drawPlaneText [28] + 0.00 0.00 89/89 drawPlaneOffMap [37] + 0.00 0.00 89/89 drawPlaneHeading [36] +----------------------------------------------- + +[3] 100.0 0.00 0.13 main [3] + 0.00 0.13 62/62 draw [1] + 0.00 0.00 63/63 getInput [40] + 0.00 0.00 62/62 interactiveRemoveStaleAircrafts [42] + 0.00 0.00 62/62 modesReadFromClient [43] + 0.00 0.00 1/1 view1090InitConfig [66] + 0.00 0.00 1/1 view1090Init [65] + 0.00 0.00 1/1 setupConnection [64] + 0.00 0.00 1/1 init [61] +----------------------------------------------- + 0.05 0.08 62/62 drawMap [2] +[4] 100.0 0.05 0.08 62 drawGeography [4] + 0.03 0.03 3502560/3503324 screenCoords [5] + 0.02 0.00 3508175/3508939 pxFromLonLat [7] + 0.00 0.00 3502560/3502994 outOfBounds [10] +----------------------------------------------- + 0.00 0.00 358/3503324 drawTrail [8] + 0.00 0.00 406/3503324 drawMap [2] + 0.03 0.03 3502560/3503324 drawGeography [4] +[5] 46.2 0.03 0.03 3503324 screenCoords [5] + 0.03 0.00 7006648/7006834 screenDist [6] +----------------------------------------------- + 0.00 0.00 186/7006834 drawGrid [9] + 0.03 0.00 7006648/7006834 screenCoords [5] +[6] 23.1 0.03 0.00 7006834 screenDist [6] +----------------------------------------------- + 0.00 0.00 358/3508939 drawTrail [8] + 0.00 0.00 406/3508939 drawMap [2] + 0.02 0.00 3508175/3508939 drawGeography [4] +[7] 15.4 0.02 0.00 3508939 pxFromLonLat [7] +----------------------------------------------- + 0.00 0.00 698/698 drawMap [2] +[8] 0.0 0.00 0.00 698 drawTrail [8] + 0.00 0.00 358/3503324 screenCoords [5] + 0.00 0.00 358/3508939 pxFromLonLat [7] + 0.00 0.00 256/3502994 outOfBounds [10] + 0.00 0.00 73/251 CROSSVP [23] +----------------------------------------------- + 0.00 0.00 62/62 drawMap [2] +[9] 0.0 0.00 0.00 62 drawGrid [9] + 0.00 0.00 186/7006834 screenDist [6] + 0.00 0.00 186/682 drawString [13] +----------------------------------------------- + 0.00 0.00 178/3502994 drawMap [2] + 0.00 0.00 256/3502994 drawTrail [8] + 0.00 0.00 3502560/3502994 drawGeography [4] +[10] 0.0 0.00 0.00 3502994 outOfBounds [10] +----------------------------------------------- + 0.00 0.00 124/1057 draw [1] + 0.00 0.00 340/1057 drawSignalMarks [32] + 0.00 0.00 593/1057 drawMap [2] +[11] 0.0 0.00 0.00 1057 mstime [11] +----------------------------------------------- + 0.00 0.00 698/698 updatePlanes [44] +[12] 0.0 0.00 0.00 698 findPlaneObj [12] +----------------------------------------------- + 0.00 0.00 186/682 drawGrid [9] + 0.00 0.00 496/682 drawStatusBox [24] +[13] 0.0 0.00 0.00 682 drawString [13] +----------------------------------------------- + 0.00 0.00 510/510 drawPlaneText [28] +[14] 0.0 0.00 0.00 510 drawStringBG [14] +----------------------------------------------- + 0.00 0.00 107/478 modesInitErrorInfo [63] + 0.00 0.00 371/478 decodeModesMessage [18] +[15] 0.0 0.00 0.00 478 modesChecksum [15] +----------------------------------------------- + 0.00 0.00 173/372 addRecentlySeenICAOAddr [30] + 0.00 0.00 199/372 ICAOAddressWasRecentlySeen [27] +[16] 0.0 0.00 0.00 372 ICAOCacheHashAddress [16] +----------------------------------------------- + 0.00 0.00 371/371 modesReadFromClient [43] +[17] 0.0 0.00 0.00 371 decodeBinMessage [17] + 0.00 0.00 371/371 decodeModesMessage [18] + 0.00 0.00 371/371 useModesMessage [20] +----------------------------------------------- + 0.00 0.00 371/371 decodeBinMessage [17] +[18] 0.0 0.00 0.00 371 decodeModesMessage [18] + 0.00 0.00 371/371 modesMessageLenByType [19] + 0.00 0.00 371/478 modesChecksum [15] + 0.00 0.00 199/199 ICAOAddressWasRecentlySeen [27] + 0.00 0.00 175/175 decodeAC13Field [29] + 0.00 0.00 173/173 addRecentlySeenICAOAddr [30] + 0.00 0.00 57/57 decodeAC12Field [46] + 0.00 0.00 7/7 decodeID13Field [53] +----------------------------------------------- + 0.00 0.00 371/371 decodeModesMessage [18] +[19] 0.0 0.00 0.00 371 modesMessageLenByType [19] +----------------------------------------------- + 0.00 0.00 371/371 decodeBinMessage [17] +[20] 0.0 0.00 0.00 371 useModesMessage [20] + 0.00 0.00 351/351 interactiveReceiveData [22] +----------------------------------------------- + 0.00 0.00 351/351 interactiveReceiveData [22] +[21] 0.0 0.00 0.00 351 interactiveFindAircraft [21] +----------------------------------------------- + 0.00 0.00 351/351 useModesMessage [20] +[22] 0.0 0.00 0.00 351 interactiveReceiveData [22] + 0.00 0.00 351/351 interactiveFindAircraft [21] + 0.00 0.00 57/57 mstime [47] + 0.00 0.00 39/39 decodeCPR [49] + 0.00 0.00 18/18 decodeCPRrelative [50] + 0.00 0.00 13/13 interactiveCreateAircraft [52] +----------------------------------------------- + 0.00 0.00 73/251 drawTrail [8] + 0.00 0.00 89/251 drawPlaneOffMap [37] + 0.00 0.00 89/251 drawPlaneHeading [36] +[23] 0.0 0.00 0.00 251 CROSSVP [23] +----------------------------------------------- + 0.00 0.00 248/248 drawStatus [41] +[24] 0.0 0.00 0.00 248 drawStatusBox [24] + 0.00 0.00 496/682 drawString [13] +----------------------------------------------- + 0.00 0.00 248/248 drawMap [2] +[25] 0.0 0.00 0.00 248 resolveLabelConflicts [25] + 0.00 0.00 172/172 sign [31] +----------------------------------------------- + 0.00 0.00 78/234 cprNFunction [39] + 0.00 0.00 156/234 decodeCPR [49] +[26] 0.0 0.00 0.00 234 cprNLFunction [26] +----------------------------------------------- + 0.00 0.00 199/199 decodeModesMessage [18] +[27] 0.0 0.00 0.00 199 ICAOAddressWasRecentlySeen [27] + 0.00 0.00 199/372 ICAOCacheHashAddress [16] +----------------------------------------------- + 0.00 0.00 178/178 drawMap [2] +[28] 0.0 0.00 0.00 178 drawPlaneText [28] + 0.00 0.00 510/510 drawStringBG [14] + 0.00 0.00 170/170 drawSignalMarks [32] +----------------------------------------------- + 0.00 0.00 175/175 decodeModesMessage [18] +[29] 0.0 0.00 0.00 175 decodeAC13Field [29] +----------------------------------------------- + 0.00 0.00 173/173 decodeModesMessage [18] +[30] 0.0 0.00 0.00 173 addRecentlySeenICAOAddr [30] + 0.00 0.00 173/372 ICAOCacheHashAddress [16] +----------------------------------------------- + 0.00 0.00 172/172 resolveLabelConflicts [25] +[31] 0.0 0.00 0.00 172 sign [31] +----------------------------------------------- + 0.00 0.00 170/170 drawPlaneText [28] +[32] 0.0 0.00 0.00 170 drawSignalMarks [32] + 0.00 0.00 340/1057 mstime [11] + 0.00 0.00 170/170 signalToColor [34] +----------------------------------------------- + 0.00 0.00 170/170 signalToColor [34] +[33] 0.0 0.00 0.00 170 setColor [33] +----------------------------------------------- + 0.00 0.00 170/170 drawSignalMarks [32] +[34] 0.0 0.00 0.00 170 signalToColor [34] + 0.00 0.00 170/170 setColor [33] +----------------------------------------------- + 0.00 0.00 117/117 decodeCPR [49] +[35] 0.0 0.00 0.00 117 cprModFunction [35] +----------------------------------------------- + 0.00 0.00 89/89 drawMap [2] +[36] 0.0 0.00 0.00 89 drawPlaneHeading [36] + 0.00 0.00 89/251 CROSSVP [23] +----------------------------------------------- + 0.00 0.00 89/89 drawMap [2] +[37] 0.0 0.00 0.00 89 drawPlaneOffMap [37] + 0.00 0.00 89/251 CROSSVP [23] +----------------------------------------------- + 0.00 0.00 82/82 updatePlanes [44] +[38] 0.0 0.00 0.00 82 mstime [38] +----------------------------------------------- + 0.00 0.00 39/78 cprDlonFunction [48] + 0.00 0.00 39/78 decodeCPR [49] +[39] 0.0 0.00 0.00 78 cprNFunction [39] + 0.00 0.00 78/234 cprNLFunction [26] +----------------------------------------------- + 0.00 0.00 63/63 main [3] +[40] 0.0 0.00 0.00 63 getInput [40] +----------------------------------------------- + 0.00 0.00 62/62 draw [1] +[41] 0.0 0.00 0.00 62 drawStatus [41] + 0.00 0.00 248/248 drawStatusBox [24] +----------------------------------------------- + 0.00 0.00 62/62 main [3] +[42] 0.0 0.00 0.00 62 interactiveRemoveStaleAircrafts [42] + 0.00 0.00 6/6 interactiveRemoveStaleDF [54] +----------------------------------------------- + 0.00 0.00 62/62 main [3] +[43] 0.0 0.00 0.00 62 modesReadFromClient [43] + 0.00 0.00 371/371 decodeBinMessage [17] +----------------------------------------------- + 0.00 0.00 62/62 draw [1] +[44] 0.0 0.00 0.00 62 updatePlanes [44] + 0.00 0.00 698/698 findPlaneObj [12] + 0.00 0.00 82/82 mstime [38] + 0.00 0.00 13/13 createPlaneObj [51] +----------------------------------------------- + 0.00 0.00 62/62 draw [1] +[45] 0.0 0.00 0.00 62 updateStatus [45] +----------------------------------------------- + 0.00 0.00 57/57 decodeModesMessage [18] +[46] 0.0 0.00 0.00 57 decodeAC12Field [46] +----------------------------------------------- + 0.00 0.00 57/57 interactiveReceiveData [22] +[47] 0.0 0.00 0.00 57 mstime [47] +----------------------------------------------- + 0.00 0.00 39/39 decodeCPR [49] +[48] 0.0 0.00 0.00 39 cprDlonFunction [48] + 0.00 0.00 39/78 cprNFunction [39] +----------------------------------------------- + 0.00 0.00 39/39 interactiveReceiveData [22] +[49] 0.0 0.00 0.00 39 decodeCPR [49] + 0.00 0.00 156/234 cprNLFunction [26] + 0.00 0.00 117/117 cprModFunction [35] + 0.00 0.00 39/78 cprNFunction [39] + 0.00 0.00 39/39 cprDlonFunction [48] +----------------------------------------------- + 0.00 0.00 18/18 interactiveReceiveData [22] +[50] 0.0 0.00 0.00 18 decodeCPRrelative [50] +----------------------------------------------- + 0.00 0.00 13/13 updatePlanes [44] +[51] 0.0 0.00 0.00 13 createPlaneObj [51] +----------------------------------------------- + 0.00 0.00 13/13 interactiveReceiveData [22] +[52] 0.0 0.00 0.00 13 interactiveCreateAircraft [52] +----------------------------------------------- + 0.00 0.00 7/7 decodeModesMessage [18] +[53] 0.0 0.00 0.00 7 decodeID13Field [53] +----------------------------------------------- + 0.00 0.00 6/6 interactiveRemoveStaleAircrafts [42] +[54] 0.0 0.00 0.00 6 interactiveRemoveStaleDF [54] +----------------------------------------------- + 0.00 0.00 5/5 cleanup [86] +[55] 0.0 0.00 0.00 5 closeFont [55] +----------------------------------------------- + 0.00 0.00 5/5 init [61] +[56] 0.0 0.00 0.00 5 loadFont [56] +----------------------------------------------- + 0.00 0.00 1/1 anetTcpGenericConnect [60] +[57] 0.0 0.00 0.00 1 anetCreateSocket [57] +----------------------------------------------- + 0.00 0.00 1/1 setupConnection [64] +[58] 0.0 0.00 0.00 1 anetNonBlock [58] +----------------------------------------------- + 0.00 0.00 1/1 setupConnection [64] +[59] 0.0 0.00 0.00 1 anetTcpConnect [59] + 0.00 0.00 1/1 anetTcpGenericConnect [60] +----------------------------------------------- + 0.00 0.00 1/1 anetTcpConnect [59] +[60] 0.0 0.00 0.00 1 anetTcpGenericConnect [60] + 0.00 0.00 1/1 anetCreateSocket [57] +----------------------------------------------- + 0.00 0.00 1/1 main [3] +[61] 0.0 0.00 0.00 1 init [61] + 0.00 0.00 5/5 loadFont [56] + 0.00 0.00 1/1 initMaps [62] +----------------------------------------------- + 0.00 0.00 1/1 init [61] +[62] 0.0 0.00 0.00 1 initMaps [62] +----------------------------------------------- + 0.00 0.00 1/1 view1090Init [65] +[63] 0.0 0.00 0.00 1 modesInitErrorInfo [63] + 0.00 0.00 107/478 modesChecksum [15] +----------------------------------------------- + 0.00 0.00 1/1 main [3] +[64] 0.0 0.00 0.00 1 setupConnection [64] + 0.00 0.00 1/1 anetTcpConnect [59] + 0.00 0.00 1/1 anetNonBlock [58] +----------------------------------------------- + 0.00 0.00 1/1 main [3] +[65] 0.0 0.00 0.00 1 view1090Init [65] + 0.00 0.00 1/1 modesInitErrorInfo [63] +----------------------------------------------- + 0.00 0.00 1/1 main [3] +[66] 0.0 0.00 0.00 1 view1090InitConfig [66] +----------------------------------------------- + + This table describes the call tree of the program, and was sorted by + the total amount of time spent in each function and its children. + + Each entry in this table consists of several lines. The line with the + index number at the left hand margin lists the current function. + The lines above it list the functions that called this function, + and the lines below it list the functions this one called. + This line lists: + index A unique number given to each element of the table. + Index numbers are sorted numerically. + The index number is printed next to every function name so + it is easier to look up where the function is in the table. + + % time This is the percentage of the `total' time that was spent + in this function and its children. Note that due to + different viewpoints, functions excluded by options, etc, + these numbers will NOT add up to 100%. + + self This is the total amount of time spent in this function. + + children This is the total amount of time propagated into this + function by its children. + + called This is the number of times the function was called. + If the function called itself recursively, the number + only includes non-recursive calls, and is followed by + a `+' and the number of recursive calls. + + name The name of the current function. The index number is + printed after it. If the function is a member of a + cycle, the cycle number is printed between the + function's name and the index number. + + + For the function's parents, the fields have the following meanings: + + self This is the amount of time that was propagated directly + from the function into this parent. + + children This is the amount of time that was propagated from + the function's children into this parent. + + called This is the number of times this parent called the + function `/' the total number of times the function + was called. Recursive calls to the function are not + included in the number after the `/'. + + name This is the name of the parent. The parent's index + number is printed after it. If the parent is a + member of a cycle, the cycle number is printed between + the name and the index number. + + If the parents of the function cannot be determined, the word + `' is printed in the `name' field, and all the other + fields are blank. + + For the function's children, the fields have the following meanings: + + self This is the amount of time that was propagated directly + from the child into the function. + + children This is the amount of time that was propagated from the + child's children to the function. + + called This is the number of times the function called + this child `/' the total number of times the child + was called. Recursive calls by the child are not + listed in the number after the `/'. + + name This is the name of the child. The child's index + number is printed after it. If the child is a + member of a cycle, the cycle number is printed + between the name and the index number. + + If there are any cycles (circles) in the call graph, there is an + entry for the cycle-as-a-whole. This entry shows who called the + cycle (as parents) and the members of the cycle (as children.) + The `+' recursive calls entry shows the number of function calls that + were internal to the cycle, and the calls entry for each member shows, + for that member, how many times it was called from other members of + the cycle. + +Copyright (C) 2012-2018 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Index by function name + + [23] CROSSVP [4] drawGeography [15] modesChecksum + [27] ICAOAddressWasRecentlySeen [9] drawGrid [63] modesInitErrorInfo + [16] ICAOCacheHashAddress [2] drawMap [19] modesMessageLenByType + [30] addRecentlySeenICAOAddr [36] drawPlaneHeading [43] modesReadFromClient + [57] anetCreateSocket [37] drawPlaneOffMap [47] mstime + [58] anetNonBlock [28] drawPlaneText [38] mstime + [59] anetTcpConnect [32] drawSignalMarks [11] mstime + [60] anetTcpGenericConnect [41] drawStatus [10] outOfBounds + [55] closeFont [24] drawStatusBox [7] pxFromLonLat + [48] cprDlonFunction [13] drawString [25] resolveLabelConflicts + [35] cprModFunction [14] drawStringBG [5] screenCoords + [39] cprNFunction [8] drawTrail [6] screenDist + [26] cprNLFunction [12] findPlaneObj [33] setColor + [51] createPlaneObj [40] getInput [64] setupConnection + [46] decodeAC12Field [61] init [31] sign + [29] decodeAC13Field [62] initMaps [34] signalToColor + [17] decodeBinMessage [52] interactiveCreateAircraft [44] updatePlanes + [49] decodeCPR [21] interactiveFindAircraft [45] updateStatus + [50] decodeCPRrelative [22] interactiveReceiveData [20] useModesMessage + [53] decodeID13Field [42] interactiveRemoveStaleAircrafts [65] view1090Init + [18] decodeModesMessage [54] interactiveRemoveStaleDF [66] view1090InitConfig + [1] draw [56] loadFont diff --git a/status.c b/status.c index 852c8f0..cfd8a15 100644 --- a/status.c +++ b/status.c @@ -225,7 +225,7 @@ void drawStatus() { snprintf(strSig, 18, "%.0f%%", 100.0 * Status.avgSig / 1024.0); drawStatusBox(&left, &top, "sAvg", strSig, green); - // drawStatusBox(&left, &top, "||||", "MENU", grey); + //drawStatusBox(&left, &top, "x", "exit", grey); // if(Status.closeCall != NULL) { // drawStatusBox(&left, &top, "", "", black); //this is effectively a newline diff --git a/status.o.REMOVED.git-id b/status.o.REMOVED.git-id index e8a5452..135328c 100644 --- a/status.o.REMOVED.git-id +++ b/status.o.REMOVED.git-id @@ -1 +1 @@ -90ec17d3fd60fd6950fbb50080a31747734eec21 \ No newline at end of file +ad8dd0e24a66f4d0d8df1297c6b9d65e3e429797 \ No newline at end of file diff --git a/testing.svg b/testing.svg new file mode 100644 index 0000000..3ab5971 --- /dev/null +++ b/testing.svg @@ -0,0 +1,19 @@ + + + + +Polygon + + + + + +-122.00493847.118663 + + + + diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id index fbe62e2..7d1f834 100644 --- a/view1090.REMOVED.git-id +++ b/view1090.REMOVED.git-id @@ -1 +1 @@ -2e266c7f3d943cd7251613fc0eddc9208d5bb05a \ No newline at end of file +59d9fddeaaf6bf38d20131f49c0ce5c67d56749c \ No newline at end of file diff --git a/view1090.c b/view1090.c index 71b5780..47944fd 100644 --- a/view1090.c +++ b/view1090.c @@ -178,24 +178,12 @@ void showHelp(void) { "-----------------------------------------------------------------------------\n" "| view1090 dump1090 Viewer Ver : "MODES_DUMP1090_VERSION " |\n" "-----------------------------------------------------------------------------\n" - "--interactive Interactive mode refreshing data on screen\n" - "--interactive-rows Max number of rows in interactive mode (default: 15)\n" - "--interactive-ttl Remove from list if idle for (default: 60)\n" - "--interactive-rtl1090 Display flight table in RTL1090 format\n" - "--modeac Enable decoding of SSR modes 3/A & 3/C\n" - "--net-bo-ipaddr TCP Beast output listen IPv4 (default: 127.0.0.1)\n" + "--server TCP Beast output listen IPv4 (default: 127.0.0.1)\n" "--net-bo-port TCP Beast output listen port (default: 30005)\n" "--lat Reference/receiver latitide for surface posn (opt)\n" "--lon Reference/receiver longitude for surface posn (opt)\n" - "--no-crc-check Disable messages with broken CRC (discouraged)\n" - "--no-fix Disable single-bits error correction using CRC\n" - "--fix Enable single-bits error correction using CRC\n" - "--aggressive More CPU for more messages (two bits fixes, ...)\n" "--metric Use metric units (meters, km/h, ...)\n" "--help Show this help\n" - "\n-----------------------------------------------------------------------------\n" - "| SDL DISPLAY OPTIONS |\n" - "-----------------------------------------------------------------------------\n" "--uiscale UI global scaling\n" "--screensize \n" "--fullscreen Start fullscreen\n" @@ -258,6 +246,8 @@ int main(int argc, char **argv) { Modes.net_input_beast_port = atoi(argv[++j]); } else if (!strcmp(argv[j],"--net-bo-ipaddr") && more) { strcpy(View1090.net_input_beast_ipaddr, argv[++j]); + } else if (!strcmp(argv[j],"--server") && more) { + strcpy(View1090.net_input_beast_ipaddr, argv[++j]); } else if (!strcmp(argv[j],"--modeac")) { Modes.mode_ac = 1; } else if (!strcmp(argv[j],"--interactive-rows") && more) { diff --git a/view1090.o.REMOVED.git-id b/view1090.o.REMOVED.git-id index 8adde1b..c6417f6 100644 --- a/view1090.o.REMOVED.git-id +++ b/view1090.o.REMOVED.git-id @@ -1 +1 @@ -547bceb30b8891c365837c7f01eac3b9c227fa8e \ No newline at end of file +015246b1fb747817b20ce17e660e6fb65096a4ff \ No newline at end of file From d32b54eeacf5e48bf61dd0694e39689f1ac65150 Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 20 Jan 2020 00:01:45 -0800 Subject: [PATCH 55/65] quadtree working, poly drawing Former-commit-id: 0d727f9d56c6a08570a6ba61ce8f3c0a32cb0ea6 Former-commit-id: 959417aa28f3404ffaa0ac4fe1f20971933df828 --- draw.c | 138 ++++++++++++++++++++++++++++++--------- draw.o.REMOVED.git-id | 2 +- mapdata.c.REMOVED.git-id | 2 +- mapdata.o.REMOVED.git-id | 2 +- view1090.REMOVED.git-id | 2 +- 5 files changed, 110 insertions(+), 36 deletions(-) diff --git a/draw.c b/draw.c index e6287c5..99f78a1 100644 --- a/draw.c +++ b/draw.c @@ -373,70 +373,144 @@ void drawGrid() void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, double screen_lon_min, double screen_lon_max) { + // int skip = (int)(appData.maxDist / 25.0f); + // if(skip < 2) { + // skip = 2; + // } + int skip = 1; + + if(tree == NULL) { return; } + if (tree->lat_min > screen_lat_max || screen_lat_min > tree->lat_max) { + return; + } + + if (tree->lon_min > screen_lon_max || screen_lon_min > tree->lon_max) + return; + double dx, dy; int x, y; - if (!(tree->lat_min < screen_lat_min && - tree->lat_max > screen_lat_max && - tree->lon_min < screen_lon_min && - tree->lon_max > screen_lon_max)) { - return; - } + drawPolys(tree->nw, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + drawPolys(tree->sw, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + drawPolys(tree->ne, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + drawPolys(tree->se, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + + // if(!(tree->lat_min > screen_lat_min && + // tree->lat_max < screen_lat_max && + // tree->lon_min > screen_lon_min && + // tree->lon_max < screen_lon_max)){ + // //printf("%f %f\n", tree->lat_min, screen_lat_min); + // return; + // } + + //Draw quadtree bounds + // pxFromLonLat(&dx, &dy, tree->lon_min, tree->lat_min); + // screenCoords(&x, &y, dx, dy); + + // int top = y; + // int left = x; + + // pxFromLonLat(&dx, &dy, tree->lon_max, tree->lat_max); + // screenCoords(&x, &y, dx, dy); + + // int bottom = y; + // int right = x; + +// rectangleRGBA(appData.renderer, left, top, right, bottom, red.r, red.g, red.b, 255); + Polygon *currentPolygon = tree->polygons; while(currentPolygon != NULL) { - // Sint16 *px = (Sint16*)malloc(sizeof(Sint16*)*currentPolygon->numPoints); - // Sint16 *py = (Sint16*)malloc(sizeof(Sint16*)*currentPolygon->numPoints); - // for(int i=0; inumPoints; i++) { - // pxFromLonLat(&dx, &dy, currentPolygon->points[i].lat, currentPolygon->points[i].lon); - // screenCoords(&x, &y, dx, dy); + Sint16 *px = (Sint16*)malloc(sizeof(Sint16*)*currentPolygon->numPoints); + Sint16 *py = (Sint16*)malloc(sizeof(Sint16*)*currentPolygon->numPoints); - // px[i] = x; - // py[i] = y; + Point *currentPoint = currentPolygon->points; + + int i = 0; + while(currentPoint != NULL){ + pxFromLonLat(&dx, &dy, currentPoint->lon, currentPoint->lat); + screenCoords(&x, &y, dx, dy); + + px[i] = x; + py[i] = y; + + i++; + + for(int k = 0; k < skip; k++) { + currentPoint = currentPoint->next; + if(currentPoint == NULL) + break; + } + } + + double alpha = 1.0; + //filledPolygonRGBA (appData.renderer, px, py, i, 0, 0, 0, 255); + + polygonRGBA (appData.renderer, px, py, i, alpha * purple.r + (1.0-alpha) * blue.r, alpha * purple.g + (1.0-alpha) * blue.g, alpha * purple.b + (1.0-alpha) * blue.b, 255 * alpha); + + + //// line version + + // int x1,y1,x2,y2; + + // if(currentPolygon->points == NULL) + // continue; + + // Point *prevPoint = currentPolygon->points; + // Point *currentPoint = prevPoint->next; + + // while(currentPoint != NULL){ + // pxFromLonLat(&dx, &dy, prevPoint->lon, prevPoint->lat); + // screenCoords(&x1, &y1, dx, dy); + + // pxFromLonLat(&dx, &dy, currentPoint->lon, currentPoint->lat); + // screenCoords(&x2, &y2, dx, dy); + + // double alpha = 1.0; + // thickLineRGBA(appData.renderer, x1, y1, x2, y2, appData.screen_uiscale, alpha * purple.r + (1.0-alpha) * blue.r, alpha * purple.g + (1.0-alpha) * blue.g, alpha * purple.b + (1.0-alpha) * blue.b, 255 * alpha); + + // prevPoint = currentPoint; + // currentPoint = currentPoint->next; // } - // double alpha = 1.0; + ////bounding boxes - pxFromLonLat(&dx, &dy, currentPolygon->lat_min, currentPolygon->lon_min); - screenCoords(&x, &y, dx, dy); + // pxFromLonLat(&dx, &dy, currentPolygon->lon_min, currentPolygon->lat_min); + // screenCoords(&x, &y, dx, dy); - int top = y; - int left = x; + // int top = y; + // int left = x; - pxFromLonLat(&dx, &dy, currentPolygon->lat_max, currentPolygon->lon_max); - screenCoords(&x, &y, dx, dy); + // pxFromLonLat(&dx, &dy, currentPolygon->lon_max, currentPolygon->lat_max); + // screenCoords(&x, &y, dx, dy); - int bottom = y; - int right = x; + // int bottom = y; + // int right = x; - //polygonRGBA (appData.renderer, px, py, currentPolygon->numPoints, alpha * purple.r + (1.0-alpha) * blue.r, alpha * purple.g + (1.0-alpha) * blue.g, alpha * purple.b + (1.0-alpha) * blue.b, 255 * alpha); - rectangleRGBA(appData.renderer, left, top, right, bottom, purple.r, purple.g, purple.b, 255); + // rectangleRGBA(appData.renderer, left, top, right, bottom, purple.r, purple.g, purple.b, 255); currentPolygon = currentPolygon->next; } - - //drawPolys(tree->nw, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); - //drawPolys(tree->sw, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); - //drawPolys(tree->ne, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); - //drawPolys(tree->se, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); } void drawGeography() { double screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max; - latLonFromScreenCoords(&screen_lon_min, &screen_lat_min, 0, 0); - latLonFromScreenCoords(&screen_lon_max, &screen_lat_max, appData.screen_width, appData.screen_height); + latLonFromScreenCoords(&screen_lat_min, &screen_lon_min, 0, 0); + latLonFromScreenCoords(&screen_lat_max, &screen_lon_max, appData.screen_width, appData.screen_height); + + //printf("lat_min: %f, lat_max: %f, lon_min: %f, lon_max: %f\n", screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); drawPolys(&root, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); @@ -911,7 +985,7 @@ void draw() { updateStatus(); - SDL_SetRenderDrawColor( appData.renderer, 0, 0, 0, 0); + SDL_SetRenderDrawColor( appData.renderer, 0, 15, 30, 0); SDL_RenderClear(appData.renderer); diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index f402cfa..f1ac2e9 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -737abac0c33061fb6e1c86993e1b329d8a451dcd \ No newline at end of file +b44aeb09f69d729d671d17f19bfd669b615a3702 \ No newline at end of file diff --git a/mapdata.c.REMOVED.git-id b/mapdata.c.REMOVED.git-id index 3a02d0f..0d655a8 100644 --- a/mapdata.c.REMOVED.git-id +++ b/mapdata.c.REMOVED.git-id @@ -1 +1 @@ -212d4fb6e7ea7b3c502081037abbac1fbdd9fccf \ No newline at end of file +1392d6dd9fcc07ddac1768bd620a3355a2f836eb \ No newline at end of file diff --git a/mapdata.o.REMOVED.git-id b/mapdata.o.REMOVED.git-id index abf0145..d3d8c64 100644 --- a/mapdata.o.REMOVED.git-id +++ b/mapdata.o.REMOVED.git-id @@ -1 +1 @@ -1c1e7d6bdf081956022b7592b8d59a929da2f463 \ No newline at end of file +76782b1a281904545022bc5880c90dcc50d20ec5 \ No newline at end of file diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id index 7d1f834..e724a1e 100644 --- a/view1090.REMOVED.git-id +++ b/view1090.REMOVED.git-id @@ -1 +1 @@ -59d9fddeaaf6bf38d20131f49c0ce5c67d56749c \ No newline at end of file +4a7d01d6e64697656eef39194bc58105fdcba550 \ No newline at end of file From 346fc7c7300d56d377b501cd3dd7d80782badc29 Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 21 Jan 2020 23:24:29 -0800 Subject: [PATCH 56/65] svg conversion in python, full 48 us states Former-commit-id: 3a0b1aecf360eace691027c4ce9e69d6641b63ff [formerly 74aafae150f8cd26b383bf37449cc861162ce7f5] [formerly 916991bafcbdcd5096382e11b1a75ca8da4d36ad] Former-commit-id: 36a8b9b689b6df1a5a9a61de58887b9c7f882100 Former-commit-id: 11eb7d9d63cea49d8dfb82c5d32e67aa694e4f24 --- Makefile | 4 +- allstates.c.REMOVED.git-id | 1 + allstates.o.REMOVED.git-id | 1 + draw.c | 100 +++++++++++++++----------- draw.o.REMOVED.git-id | 2 +- font.o | Bin 36504 -> 37488 bytes input.o.REMOVED.git-id | 2 +- list.o | Bin 47000 -> 47984 bytes map_conversion/41.svg.REMOVED.git-id | 1 + map_conversion/all.svg.REMOVED.git-id | 1 + map_conversion/mapconverter.py | 14 ++++ mapdata.c.REMOVED.git-id | 2 +- mapdata.o | Bin 0 -> 25608 bytes mapdata.o.REMOVED.git-id | 1 - monokai.o | Bin 26504 -> 27488 bytes planeObj.o | Bin 43040 -> 44040 bytes status.o.REMOVED.git-id | 2 +- view1090.REMOVED.git-id | 2 +- 18 files changed, 84 insertions(+), 49 deletions(-) create mode 100644 allstates.c.REMOVED.git-id create mode 100644 allstates.o.REMOVED.git-id create mode 100644 map_conversion/41.svg.REMOVED.git-id create mode 100644 map_conversion/all.svg.REMOVED.git-id create mode 100644 map_conversion/mapconverter.py create mode 100644 mapdata.o delete mode 100644 mapdata.o.REMOVED.git-id diff --git a/Makefile b/Makefile index 1a67371..21e5a7e 100644 --- a/Makefile +++ b/Makefile @@ -19,8 +19,8 @@ all: view1090 %.o: %.c $(CC) $(CFLAGS) $(EXTRACFLAGS) -c $< -view1090: view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o - $(CC) -g -o view1090 view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o $(LIBS) $(LDFLAGS) +view1090: view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o allstates.o + $(CC) -g -o view1090 view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o allstates.o $(LIBS) $(LDFLAGS) clean: rm -f *.o view1090 diff --git a/allstates.c.REMOVED.git-id b/allstates.c.REMOVED.git-id new file mode 100644 index 0000000..9bbece1 --- /dev/null +++ b/allstates.c.REMOVED.git-id @@ -0,0 +1 @@ +e1983f2439326aba30a2576504aac03b2f3cd2fc \ No newline at end of file diff --git a/allstates.o.REMOVED.git-id b/allstates.o.REMOVED.git-id new file mode 100644 index 0000000..76f110e --- /dev/null +++ b/allstates.o.REMOVED.git-id @@ -0,0 +1 @@ +9bee8f55a87c0c25e624b913e8e728619074d9ee \ No newline at end of file diff --git a/draw.c b/draw.c index 99f78a1..43414bc 100644 --- a/draw.c +++ b/draw.c @@ -373,13 +373,6 @@ void drawGrid() void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, double screen_lon_min, double screen_lon_max) { - // int skip = (int)(appData.maxDist / 25.0f); - // if(skip < 2) { - // skip = 2; - // } - int skip = 1; - - if(tree == NULL) { return; } @@ -429,57 +422,82 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou while(currentPolygon != NULL) { - Sint16 *px = (Sint16*)malloc(sizeof(Sint16*)*currentPolygon->numPoints); - Sint16 *py = (Sint16*)malloc(sizeof(Sint16*)*currentPolygon->numPoints); + ////polygon mode + // Sint16 *px = (Sint16*)malloc(sizeof(Sint16*)*currentPolygon->numPoints); + // Sint16 *py = (Sint16*)malloc(sizeof(Sint16*)*currentPolygon->numPoints); - Point *currentPoint = currentPolygon->points; + // Point *currentPoint = currentPolygon->points; - int i = 0; - while(currentPoint != NULL){ - pxFromLonLat(&dx, &dy, currentPoint->lon, currentPoint->lat); - screenCoords(&x, &y, dx, dy); + // int i = 0; + // while(currentPoint != NULL){ + // pxFromLonLat(&dx, &dy, currentPoint->lon, currentPoint->lat); + // screenCoords(&x, &y, dx, dy); - px[i] = x; - py[i] = y; + // px[i] = x; + // py[i] = y; - i++; + // i++; - for(int k = 0; k < skip; k++) { - currentPoint = currentPoint->next; - if(currentPoint == NULL) - break; - } - } + // for(int k = 0; k < skip; k++) { + // currentPoint = currentPoint->next; + // if(currentPoint == NULL) + // break; + // } + // } - double alpha = 1.0; - //filledPolygonRGBA (appData.renderer, px, py, i, 0, 0, 0, 255); + // double alpha = 1.0; + // //filledPolygonRGBA (appData.renderer, px, py, i, 0, 0, 0, 255); - polygonRGBA (appData.renderer, px, py, i, alpha * purple.r + (1.0-alpha) * blue.r, alpha * purple.g + (1.0-alpha) * blue.g, alpha * purple.b + (1.0-alpha) * blue.b, 255 * alpha); + // polygonRGBA (appData.renderer, px, py, i, alpha * purple.r + (1.0-alpha) * blue.r, alpha * purple.g + (1.0-alpha) * blue.g, alpha * purple.b + (1.0-alpha) * blue.b, 255 * alpha); //// line version - // int x1,y1,x2,y2; + int x1,y1,x2,y2; - // if(currentPolygon->points == NULL) - // continue; + if(currentPolygon->points == NULL) + continue; - // Point *prevPoint = currentPolygon->points; - // Point *currentPoint = prevPoint->next; + Point *prevPoint = currentPolygon->points; + Point *currentPoint = prevPoint->next; - // while(currentPoint != NULL){ - // pxFromLonLat(&dx, &dy, prevPoint->lon, prevPoint->lat); - // screenCoords(&x1, &y1, dx, dy); + while(currentPoint != NULL){ + pxFromLonLat(&dx, &dy, prevPoint->lon, prevPoint->lat); + screenCoords(&x1, &y1, dx, dy); + + if(outOfBounds(x1,y1)) { + prevPoint = currentPoint; + currentPoint = currentPoint->next; + continue; + } + + double d1 = dx* dx + dy * dy; + + pxFromLonLat(&dx, &dy, currentPoint->lon, currentPoint->lat); + screenCoords(&x2, &y2, dx, dy); + + if(outOfBounds(x2,y2)) { + prevPoint = currentPoint; + currentPoint = currentPoint->next; + continue; + } + + + if((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1) < 100){ + currentPoint = currentPoint->next; + continue; + } + + double d2 = dx* dx + dy * dy; - // pxFromLonLat(&dx, &dy, currentPoint->lon, currentPoint->lat); - // screenCoords(&x2, &y2, dx, dy); + double alpha = 1.0 - (d1+d2) / (3* appData.maxDist * appData.maxDist); - // double alpha = 1.0; - // thickLineRGBA(appData.renderer, x1, y1, x2, y2, appData.screen_uiscale, alpha * purple.r + (1.0-alpha) * blue.r, alpha * purple.g + (1.0-alpha) * blue.g, alpha * purple.b + (1.0-alpha) * blue.b, 255 * alpha); + lineRGBA(appData.renderer, x1, y1, x2, y2, alpha * purple.r + (1.0-alpha) * blue.r, alpha * purple.g + (1.0-alpha) * blue.g, alpha * purple.b + (1.0-alpha) * blue.b, 255 * alpha); - // prevPoint = currentPoint; - // currentPoint = currentPoint->next; - // } + prevPoint = currentPoint; + currentPoint = currentPoint->next; + + } ////bounding boxes diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index f1ac2e9..e4b7902 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -b44aeb09f69d729d671d17f19bfd669b615a3702 \ No newline at end of file +876851c7cb19383223314e1599b55727c8695ce2 \ No newline at end of file diff --git a/font.o b/font.o index 75c233bf95cb4ceb203437a7334de8e1358b8055..3cc27a7d80e6be75c805c8e17ba0e80fa66a2a7f 100644 GIT binary patch literal 37488 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 biW2U>MT13@e*Yj-`pdZfzg5|oQl|eusnxvz literal 36504 zcmcJY349yXweV-WBu<>zPMpLJiHSq@&550zKw{aJY-8C{BssB3c#2}nj)*rTISV{W zAZ0Ou7ATZ`FJ*g_rBF&K5J*`QnaN4&~1)?2J=D&}wuEJ?`hH>aX;k0U_t3rpnT3w;m zV8h-I=XN&i%b7J7qYTx}EUnzXXPq%Py!SKDmn7io&*JjrV2f8kR z;<<)Cbq)QtVd(3+p~o7Ao~7)ev<*X#C)@W`7d7lV7PD^{`meg7g){4hI%noU26_A3 z6W}&RX={}O4MT5L{-$B*35AE=;QL?b{(j%#!-or}?ZMxp)jC;Q9$2cmuD zp8mdM`K-jz@NYDl%c$)i?CI>AlPvFuMte+>q`tHhZOUuca9;qP0YBf++U)*NV&g4 zcd2rJjqY;gK8)_UWWHR(M9&iCG0C$^d9uh;tvos8X;7YA^7xf!1bNz&C(ryAlyHmk zj5fawo^8rA#>4^-C{Gc2lFBpQybwZmDbFO+1D-v~Q(}g|bB6Min&(1ldzELZc?EdR zQJz`mRiJi(@+>m%0ncU1Q$e2VlxHz{Zc&~kjY-``!F+O>leQWK3&@!@DPj~X zBxg3P+i(>uGBI;XrL~uaW#(@oha%-!PHGdNA7KGhnk&pr zI?YuDYs`CL@>9ykQcU)&r2tNI9TkextR~Mm6~|@%4C0Sho*GJEg7Vaor&M|B$TL-W z+~g@&9uK89Q+eviGfR0I$TM4c8p$(9d5$B`T;*vZ&phSvl4rj1G?Qn6^0bg87AlX= zd>Tr<1k7?Hm|_ez2?ClgOrUpK#`2r!rs=4tuzDPt2I|DgKrs_k9qbrn91YY$SF!AkKp{iW)JEB1l8ICMezGkgCZNFJy*Hcqs|iL4j^Bp+^tyT>eAlGfKk-8AKZS$H=%wTRP{M19!-TK@*ad>8u3M& zr)uZ8<6i?OD?ATQo(IM+d}gd;RQwa8p2pG`l4D60kSruwL~h zFNxDeZkgO$HN77Bw zL$aP^1Ib2`$B}Fz=_T1rvW29Nq@Uz^k^z!Ik|C0?9c_*+sIO zk~>N6BDtI7$s|u9`R^o8CHXCqr;*%4@^q4Cl01v#*(A>)IYjbYlKV)WNAi4<-y!*3 zk{6J?kmN-qzen<7l9!PDKFLc-UPkhAl2?$tlH^q+uO@j7$!keoNAh}-H;}xMe8(P4Zci&yjqd+B;O|a4#{^(zDM$plVJ)qOp|U|>Xxl;IqH_HZX?ufq`Kv)+bDG# zt#0}1Hb&jXs#}4&6{=g2x{Xt}@#qbJ(C^&i5uo={}E`rNjbIP zAB8I+T_f^-0&W$QiwjgLXbgtLKzqE}_f8u5Z{VSI^|F!?55WGF*0qwnw_uH8_b9~b zF`;DiBj8p~Yb9eI2e(>JOU9yGt*0dg=vM1#NfEl$dRj6L-D*88DaK+|tGp(lyH2?$ zqPs!4C!yP`+$HE%Yi>y?xbXU^%aL~~_jGh`Q|_bC-J{$y z&^@5sGtr$??pf&GrQCDSc6*e2F1pWA?)g6e_XV&Az*ZiSR{#bbk#{6WYP^yKNpMnQ zlq~usSRmCHQy^{Qslt-VAHy?QqzSS>48MaJ?#EcRb zy32Evrv^Q5j#Qr7x50B=zVg)J)6bSd<#D5(wz0>9o&omMqh}X;8nC!~*mK+=NbQ`$ zvRy_=3-SvJ%XYK#;=-~HjV}YY=2sP#?PQhf3d^>!^9O}x{h;l`esK%9L7UwFQCQY# z1>A)m9da)hfz*C#_xzkaeoSnCp?W072BM8G`0<1VZ9@K$1`Rqi3;A~%W6;=GG4_wh z`vCfd>LNkpsV;Kl+>+Mtc-qGB<58zn@lBnOOu62I zVwx($%>|e|rc2i}l;$zY!-soFt}28XsvNO-%)NMnYx*wmV0L&--)-}hBQcM`0gqQX z3iB9zcEYP1Map{=d0m(RUNcabHMrrn29lU1VJxMuG9?4F#;lyIYnDr#(LFF}-vLnenc!c~Lb4YTYE=e(P%X1_?XTnho7(%s5nO1v~ z9p+WvhiBSy^qFP$Rw=W$isfNNXRDOyR#AqY;cSMP&SqHg&CM|X6KKPKxf$j_eT$$z z-_Q(mDLB0unwWn>Gjynw)0*KF=HJ{5ssW(I)CEI^F7vA2L-cZVo5k9$^C<{K6;w!7 zrqwVOkW!9TLZ3QTgQ!MUbFMtG~ z$Y3QH1uz&wsqTn<(;8U~s%mDXVJyUQXLVsgvvI&JQvP?c45PwWj2^tQHd@Y!k1kOR z=BXSr<({9Na!0c*^`eU{XX$*%PhA$9czeqEMamhr(wf|rWtij4Sp~)U*#%Py#+lk?1Lq^A*;tG*#!iQH7DHe`F+@EEny+w~N&_OTn~b1nC1o{^ zIb^T+_~}sn;v92rJ{CzAVZvO9J{1z2Xca9NGnxct$pa-WO9__+ys#{A7$k$`oJ>i; z1bu`(%dAqvm_ljh>b$1fstf96wq(G2WU-mD%(Mz~-DG9tIg`=u)uor#OvZwh=UO() zg0`3rUMwe+1-(b5ih$l3HZPQCW|>)8jH$Kdw^IYm$~7t}-t3_>Olav!$Y9R7XP8D- z>4h~AVXnrQ^E~hvN@u>}m()zg7z^x$ZKMpW;x2TCmFF*`S}aP{0{S}SWGt>Qu$}q} zRIOnP<^W)z$`kcdOhebEvQw_~OxI`1biI}7rBGsnu_ubny%(2{BEUiWq?ZSB+vLYI@Vaybv3@My!@aHd&m z3r9YU?=U8`^BP8~2W#IwDMju4i-m&PIgSgg;%eU-s~SP=)O|AZFxkQ>>mr#(NIP|T zFk5!z4Y^^_enVZ)JL?mFarz)H%U0(N24&>BA&F(?F(7 z16HO#u`&&4r#*-CF`;wN+At<`(bie*k~StD;%pwXvh!=FZdK^F+Bwxq$giC`j|{zA zca|?wX=|rWFhlPy<2-c2-_*OSIpszxhgR)8j*;qk+80PEvMcRI$2UM>q-bZM6)UKn zMT}JP+P5mD$gZ@TP7}JicIsHFtIHUp81Mrfl*=zwVAo7n1>e8PWVpdp^M}q}MbZ;4 zCt=<8fpV6CQ;unVQ7{%Hz4Zf)WG)^|#23fqlexz;lX7^{BVoFWle-6^oVqSRu+CcrZv(*#A{8B2`b4rb z)?Zbz4Gf0v&S)37p&ArbVJKLv-_jr_%%q9kiEuO??};UnDl8f6jfT+;AJq=_0qz7h zD0WAa{R7ExM}It;N~ABjXb|24=~JXPlH8`0p?F~|QeOx7Ve5kaf!MBSPa@@yM>{YZ z4owWkyCNN!G=m+n&L|dFhj&E!I{G_p3cb-pBGMh*+P^EM6_56HM&l`eGKqG8B;eDx z&PXx>9x_&Zup@~@feVWU2I%KlP--v~1koxpN_8Gkn^eB`_$}EdSL9@6zizbUnAta- zmUl+poQcQ(=+kQsWlw3#?#Y^O{{HB-+4&XgE^lgY+R>gk_Tb*^lk$#%7;7;?An&Q; zpJLU;!>X2}>OkI8@RE&bV%dVVu9jL~ojZ(ox7X;zGba$cspM8@ps~IoR1t}QD482*w(+(3vEd~#^~vfbmF^3ltQyR7!V3G+RdrrtqlddMmUV!VpUjW;cskndqeGhci4~R ztE*gLxDwl9T`JV7f~&Qz(dTgmLmppXqbpG7Ot{G(4nlOd!9B$p+S=08;@jBbgb>B+ z_K;QFQ0b2C(M}@_ridrE4t5!?fq^>c5=J7{-52TcMt4Mepxn{E9kDnZUph?R*b;IF zT3n$RS2x!clAWN6Czq;OP#x|(&&rsl18GCWtr4hiNxKZ z)<6psy1%Q7O`S5P-|ua#r6L=_WF$GL^0&glHuV9w3+iPIz)NIFut#qsvE2wa`of+@ zuRA=@15v_gHB}O7Ij^hT*BS~}F2Vnx#!&ddc+^>{W_MkqE9myRYeUA)SYK!VPAFkl zudJmj5OB47pexkuPDT^{XxxwUgEJ|A04yJ@4Y=J{OI6Nr$2L_Wt15N6;cFU0%`QLn z+wiibRh7=fT(#kh9gDhMFyvFc+Df%H0CjMt;BHZUGS&7OyPdnuUE3ORJLCF&8^P3Q z-JS7RG79~y)9CN%^m12AC8_KJ-O14dp}Fd6ysl=yI}mhnF>2{0z>sPKPrSc3sOC^- z%x0K7jK$mfd!vi{V1iBzc19L=$C8T^1F=pqcA;qvm}GnU8geg6ube^ToJUy!S zTDJ74F_ZGI5c(^HUvzZOYG*iD0}N5?ZV90c8=?_dX}Y0@B$APi?bt!WUGOHQGmaNW zBHC2VLEMvDd@XK6y-nHa)NiV(YxKf&$FrS^rTUgDP+#LzuJtwhp~(XVERm6Tw=+=9 znpQ6j&>9tu8=djUPW1+7O?`UFmM>o}tX}K#*0y?GAzuKOGn~L1qOtC6N&6aZs8trr z0sk8jp5q*S2?mtU>-G9-n~aX0{zTMT3as`)`+8f0#z3T#EbE94b!~PzYv?z?=#iM1 zHGR-VPCZCB6GN zBFr-Ba|zVD!4+(vG#uTp5?a~lO$4LSK5rz6lR*u%NWw@!myGs>JEH^1Z7P;nLe&7N z#j$EjRdvrc-97C#ppK4<@``0pw*ckhXjZSQrCxM6L{-j;BNBrhkr?lY#E?fMMm-`i z@DYizk4O!Fni*9Ubq#IERZ}mT0;~>m<_32l1Ph_J23jgL{SG9R-Rxc7uIVrhCX}iB z>Aq|w;)jitHO?(s+ZqVCTWZ^btu?JJjUlH&1HpzyPsoVu=nlrzyy55|Rcfhq#)0zq zYD01`0Bvsdh8q3ecBeY^QdhmJQEZQDXwTRJ`#(L$;R@{OkHa!yM0ds1ifvT`(uV=v z=u>MTFFTY|`W6y43-tkCD=$=5613F%1MUsZ0%FMP>WHDHS?ZJS1 zy;DEn@`en4D6mhC5Ls@Hn%ym}hJA->mCys5FW3-8cZ3r#0G%0lDn*~h-HW5hP!ad~ zR+l&E3NBl+gt}WIvLhPa8cB!>km(JWUgI#y_C%9O5e_NUG`6?`?P`jyjr54+4Ca{z zU$YyhwHjChX%4TU9h{>?u!Dl-!hw`cVLKIp2L#-~iD0#J3s72t;kN0`X&W4B+ZK15 z=-=43?&g3SMxdCyq0`}{-5u$57QpXn4Z59ZiPI~lDKSNf>1mlWu4qEhfMPllQ_*T8 z9_{MrAA~0-^?*Zjsl&KpVU*hhXIaD(j;OT9sjRjLR!3EfiRD#W8_Ro~Gj5a9D;lEN z87gK8pAoj6QLOak&~v6B2D0c8txjbz7i@HfwmH3GW;@;)ifb<{$hFEgwzUD42A5F- zM=6;fGoX*sc=Wqqo^~eb#Yx4{!l0~{{ef7rW1CT#%E^KpcxGxUwR|Etg>2J zLmSlid`-=+K$GkS4Zc=Y>zHr_z$(Lm~B8?^Y9+{c*dpYN?uN zrCsvE11dUn=B+)dS*&j4^83XK2BeBA&JO_;)zK#%b)ebAYdug{j|Md3wXV{e zAnM<+H)!nK1q&A*jDj)npqDla^rX}Z)fbDL+M|JWopow#3BpF&;CT)nRA8XW2R^;g zwRX9VR$m5}GfhvWSlB(4!Z4mnvABCG#q#c{TxQg_w3gRaR+g`o+0p{vPOc{ zYMx55Iq*~p%XunS8+3X?wcMzVz8npwcDa}b4QHH09pRoTX%Kmc<*AYesgee%T1K_N zLp&PwKKLprwYVdz^oP_s*!am)D;O=b*uk6yTTx7)rYDwchOe@qJ8hN-rEUMzcGy`< zNK{l4h-i2qqM|@VO@W9G1w`!cfQT&~5Ydo8L`wo$O-AI^FxDr=J}8Kt9uTqF15%q- zak1qC9kDn85gR`@bV0w+f~Wb`pmQ3qI%<$+hMve)e3rA$h_Jov^IKcm<1$Xduq?r2 zL8ZDaRX6BP2-6K)*SMh(&K5KF1pOgG>OnB9W@9*09_UX{B~vOZ^04X-Rw+dr_|nY}V{ z7>z}9PrceE?})~e;W+NQV6V%^aq59ensr;G6O7<6VbI;&sOnU29beh^AaulK_4|#n zPB=TGl{9@h4R;L2;iJr+!QMXAtDv8{>-bD~`3lw7ZT*u@e0l4x5_Xgf?9v90*`2T@ zcNQ4})Nv`TE3i=*9NJzXqJq9=mPsa#h$Ww1D9ic(5+wD)QRO*8W*h#`dM+!E3(TT1jodA647R2hh;GTZ5qYGwR% z9JUd0y`@TDM;#vxibc#3CMx3yTk0&PBW#(pEp>B8MIHKLxpRbxh0hTtmOw|?YG?Vt zX709H_%tdFa74c)x&;?XfqgC$Y4Cfe(~0I*mvy z-Vu-RXU2|=S}rRcQXG3|5K_u|y1F@`Aw++JmvwDipv+ zXy!Xj>1x(@LB^^&*>pweLZZ&9C6_DLBpDsB~$8dRIx zMU{i(tNd2ws){AcDk|qGjxRF6WxX|Xa=3YYK|a&#EaXJull;P<~d9t6=Wl+`0mP@92WL z09*y7piongR|{_gW88Bv4qSgiktuF{dfWzxJKTjYN#z)y9L^M;jjz09xUy642|7Zv z@x_)5S2n&TlHtlW;Op5Lu51Ip=9YeCt1sE41!Svl^=IH?(innl^?jSPux$9LjZ9ZI zd@nE4m2JQq%Hql+e|mk#5+AO<@a-aTVUFW%_SgLgznzw;l=upMCcbtU-ZTtv8-||% z9LrM;cf7Pky1|_(-$BwbjV*A;>rImI6*9PI(!T`wIODH}%i)gKW$I>J4fjm?KO2T0 z9EQI(4F7N#{uOYlFAo74Z@@-_KT~H6})wo|uon@sy zM$f!Aw|@ryjjv3Iy=;a9R{M!;+S>-Ha=^#=!)#~Oi#YU|aw2UDoZ1q{^(WNSI`C~0 zzN7tdj{g#VFbXd{B9Y^3k(!r+8!vo&4d3C^Tz|a?^(Wc*GH~OC9KJPS>HioZT*z@u z>vSGR2p6W0>k5YB^_IGkzYN@3U-wI?|96}Ikv4rjrC_?#Y+U`UmCCQ&#wSC6#0&N9 zcEJ9Q7v_uOL6@h>rf;{yF*ZKkrhlc4&#>`3n9F({wCUUJ@Z2!^Z`$xs#iAT=$?a( z1DEc%n$Ksz!L(AMej|4*%nL89HW!Wj^GK>6&#`YGQm+Q9eCs%HjZGiZ|2r>@HGIo0c(`8SrR()7m-7~dE&dN)L>>}+GjBAX6nqtSBDh{qH!Gbdxxc<4_$xT6!1aN; zS^B@@j_{e_BY8p3=Ja&=yODn>>YyN#sh1w;4Zcc?(Ol?cKDn(`Bw{mB6Iy!9%hB>4B(e@O6Ovzx^KZ=VSM9JkA7f`7p2ey^#ny8le%b#|2C zpK$pL1wWhT>q&x7<^JOzhHnA2)>8M%h!UR!t-iAhwJt_$n`B1d@<|K z61>_QP*47>qfTQ`9l8{)hxyp zg6sCZS#bSz?&k&9?fbgmXK?=?&-K&g(Y#FX4Xm%9&$Rw+%$Ey&-G5pIznbeC5qv3^ zuUGH}-v8_t+{^3KnS!_Q{C1(>YdM`;1=sfcx!~XB=cy+J*LL`g;6LT(m)D2kp9-$O zef)*sH}Uv2xu0q~-^+ZY;0KtG75q2Miv@p+`DDRAWq5bcnO`b6{O}E3R|`Iw`Hh0lWqzyRE1BOZ zxQF?Dg10h%Q1DLXj|!e({-oe%F#na{U+_Hqg5df&_GQ8U&d+ym2>vm47`WaQ{36~b zd?0uO=lhA^2lTm$;P>%7^OfMQ^1djW^U?j5mmOo2;G=oJR48~cKPOHU+~oCcir|&J zpPw#xEvGX_@N;+^EfRba&$mkjpUeBn)q)rEJh)D9z0Yc;1b>zFV}k4bYro)Mu>PRn>K9uL;}pT)=5{zkv6Lw+p_7`}5s`pTW;-_X~a_`yUegSG>H=`1)M%SJ`fd z1^zU6Gyq&rF$@x_J+nFyG`Ukn3 z%LU)V{xyP+Vf(uTui$=OFStIJX%_rPZ0DfhxjYZI3qFZ?Sn$)iA4Ubgh`HWhV=#8L z(>R@zg#HE0cM5(z^HT+Xo4NW+Bq=-pjrow!&t*G*SMW*9FA;nW^D70vmB-Qbf}1@5 z-z<0&+u;tuyLsIGSnw9k_W{APxxF3{ypr>MT<~Z3x#O3DH*z}93m)e2{*vHPF8}L- zU&iUbE%;vC48Zli;1BR~>|X@Gm)F@(1;3H={X+2XbA3$?$6z$&J_g2$O3E4be8;(JYaX**oT`i+9$ z&fF*X!^~R+f1dd!!QWvX5&Sde-GU#*=Q+KCk70j8a8(<_*e&=Sd_HiR;LCX&ohkUy z+&}jT{zv8)3ci*1A(sk%H?LDy3%;8BrS7NN{{1{Z+$!{M%FiPY z3cjE99~Jyzw)2yM-@yAKy4NWM z`_Blb`E*K1JlpRiw_ck1@7VLR({M9n{Dd!8-Q*~I$i3+~aM zBM82M*M-Xkzn;r~t>9;Kzr9KDB(LMQ3;q%Jl?e^Kyt+;3kM{9$gdw*>zkm-CN;mvenT68t`1XAcR!lIP)n2(ImJ z@_B}C_XBLVJi*&|Toel4&GRArh%j9`opU%p_~l;*zlHbJGX;NEukV7ZzZU?%k}bIU zD}sixTJWpb&eeh+#qClrcmbEQMextKJo?;7*Q=WCuvzH;kjHh0;M;i~I8pE)^15@9 z;FGyO>=JxEx65gQ=kvHbOYpmRT|Qs%*LeJ1EO4HD1&yfT_j^~rh1;38)`wq_<%0h=&*v_|f53KV7W{c0*X@G;jnj_`{t>5hlHfbJ zzLyC82Ct9T3qGIw^N$3d!Sm#Uf`7(#drI(Hw$F=#cXK-bDY%dO=U)VWkK6G}!SCgE z9mV}ox1;{N`#iz9IL76IbF&yf6#R3x^FIXdwdzLo7$FSwo`f`aGpysF=?)a4n&>1-GJ`aR2?%&}fGZS~qC^#8!^c$Q5c zr~YalFINlwtz4d)ZJbR&x!f!GKF<45!Rdu_2-EKe>3RiN|2d&Q$mMy_#<3{(@OkMQ zHjd@_GwZ)&=4dUwdiQGX(*^OcRG{sz|9?}_X3->K&x9><#N^>m7j zV>PQQ<@%M-v%;p!6lSF!$f8@Kn*K^w<>zh?cDZQS19zHQ^Ezl_JJ z`sU`f-*qA5ym(0C_=WxEAf{$VT?}F=k4GFI2w@aDp_Kk2Qu9o^-o_mG9 z?hg;!IJVbc*>3v10A1hXIGvYm`q=Ipnd{Gmv_50wA42~uUPp8Ic}utNS}y-68^`qZ z=L*F(j^(_X^-FCW^>w|DvT@Y^9qTV(uFJ{AGdx27bJlMX`W28CUJ)B-lM#>GIQAdR z8?Orm*ZE!}_$sAt+{0YAum1kPV}d`0nZWg|;A41xcwrd+ir^pczTywV@OK42g6Dzv zhvA0*e!Hujxuh!+! ze6G;HnDFZ{l@&A%eNmV6BF zi;>&=zmAL9u?nTb%}LuQ&WgBx?@5nGf*{J-fx346V+5~ezhCez>_1O%J%1V%iQT>M z`w(zX#?^hBcHwtzE9hrXE9kdTDz?J!FIU9-(Sz!h6_rl!D)3^Q&gj;`?r^NHtKVRE zWb0P=2B2k?LWN1`$^!N6{?@1aJeemmK74Yk3@atsw zBXcTJbX&L!f98(s`u}n(hsd(6F}-ROaOwSy@}+;L9Ji4;HB@T_zVGoWhhE=t{=#mjRj`qj#sq^RK9AgVG znI<4Zf8X>n(GF5KF--i6*>JP$lR^gFK46*3|J+#+09S*$(RaFWj*;cx3rv;?qdYJJ zCHx6Jb+e?@{T75|%D?n%6-CEK`{8~==6@+LnI^`3pY#9j|6;$3KsQtV4V=GjC(Iv@ z4rTr~0>k`uIl)QSE*w~JeJwhmE~~!(2y`;V-{GO?297WLrQ_-Q{Sc_#cD)-ozMY|4 z>OR9vn8~<>rY(>W<4V mF4;0Z?)O+lDYBf~q#Wx-g@u>C2cIeaelGv-9I2+;?|%TRxNkZD diff --git a/input.o.REMOVED.git-id b/input.o.REMOVED.git-id index ce4b4dd..9dd6b32 100644 --- a/input.o.REMOVED.git-id +++ b/input.o.REMOVED.git-id @@ -1 +1 @@ -bb8d618a3de2096192e6fd03ba715f6346df1193 \ No newline at end of file +16d52890261f72e78ba71c37bea36a5c18405767 \ No newline at end of file diff --git a/list.o b/list.o index 508336c00880ba69209b9037dd686fc345742600..93dc507893cbcb8afeab2e7f05e33f3fdd03ba8e 100644 GIT binary patch delta 14888 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 delta 13851 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 diff --git a/map_conversion/41.svg.REMOVED.git-id b/map_conversion/41.svg.REMOVED.git-id new file mode 100644 index 0000000..29f48d8 --- /dev/null +++ b/map_conversion/41.svg.REMOVED.git-id @@ -0,0 +1 @@ +f94cfbe36f64a1d81f38c7a21ed5ea789092d0b2 \ No newline at end of file diff --git a/map_conversion/all.svg.REMOVED.git-id b/map_conversion/all.svg.REMOVED.git-id new file mode 100644 index 0000000..a7a0dd6 --- /dev/null +++ b/map_conversion/all.svg.REMOVED.git-id @@ -0,0 +1 @@ +15dc88c67daedfe75f3e5ac04fe1cb6b96908c09 \ No newline at end of file diff --git a/map_conversion/mapconverter.py b/map_conversion/mapconverter.py new file mode 100644 index 0000000..a310306 --- /dev/null +++ b/map_conversion/mapconverter.py @@ -0,0 +1,14 @@ +from lxml import etree as ElementTree + +parser = ElementTree.XMLParser(recover=True) +tree = ElementTree.parse('all.svg', parser) +polys = tree.xpath('//polygon') + +text_file = open("test.txt", "wt") + +for p in polys: + currentPoints = p.attrib['points'] + currentPoints = currentPoints.replace(" ", ",") + text_file.write(currentPoints + ",0,0") + +text_file.close() diff --git a/mapdata.c.REMOVED.git-id b/mapdata.c.REMOVED.git-id index 0d655a8..baee0a1 100644 --- a/mapdata.c.REMOVED.git-id +++ b/mapdata.c.REMOVED.git-id @@ -1 +1 @@ -1392d6dd9fcc07ddac1768bd620a3355a2f836eb \ No newline at end of file +1420a2ee0d38618a03222daea18788de0178f471 \ No newline at end of file diff --git a/mapdata.o b/mapdata.o new file mode 100644 index 0000000000000000000000000000000000000000..3d3304425867ad365da4907eb837c638ca6bf7b4 GIT binary patch literal 25608 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 E04T{Q%m4rY literal 0 HcmV?d00001 diff --git a/mapdata.o.REMOVED.git-id b/mapdata.o.REMOVED.git-id deleted file mode 100644 index d3d8c64..0000000 --- a/mapdata.o.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -76782b1a281904545022bc5880c90dcc50d20ec5 \ No newline at end of file diff --git a/monokai.o b/monokai.o index 03c4bd0d030293b931e0edf9d9acac10805ee7d6..5981be1df21cc977a57899488dde0b09fa36d183 100644 GIT binary patch literal 27488 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 LnR!zO+0EUVl)W?9Gh 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 diff --git a/planeObj.o b/planeObj.o index 44e6d2644d4415c37a5bb0f025618c55079d618c..07195dcad575f83c8d2f3ee8786e8fcbb24a4b31 100644 GIT binary patch literal 44040 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 literal 43040 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 jk2Wp37!bIh{oikhixb&?%yXdoU0nZ{; Date: Fri, 7 Feb 2020 23:04:52 -0800 Subject: [PATCH 57/65] added padding on quadtree culling, scale bars Former-commit-id: 17ff9f3ef5107c35bf0fc7c5c065e845fb647662 [formerly 694324d663b143ec236604d7e984d9cab00233f8] [formerly b1bbf4581a8b1e3c0c46d7337b971786d86d050a] Former-commit-id: 0cb2f95464af5e4f55078ce0478fa8a608b60e80 Former-commit-id: 319c4c3339587f803f5b4a4372eb8aa83c4a6759 --- draw.c | 148 +++++++++++++++------------------------- draw.o.REMOVED.git-id | 2 +- view1090.REMOVED.git-id | 2 +- 3 files changed, 56 insertions(+), 96 deletions(-) diff --git a/draw.c b/draw.c index 43414bc..8b2a369 100644 --- a/draw.c +++ b/draw.c @@ -356,23 +356,50 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee } } -void drawGrid() +void drawScaleBars() { - int p1km = screenDist(1.0); - int p10km = screenDist(10.0); - int p100km = screenDist(100.0); + int scalePower = 0; + int scaleBarDist = screenDist((float)pow(10,scalePower)); - circleRGBA (appData.renderer, appData.screen_width>>1, appData.screen_height * CENTEROFFSET, p1km, pink.r, pink.g, pink.b, 255); - circleRGBA (appData.renderer, appData.screen_width>>1, appData.screen_height * CENTEROFFSET, p10km, pink.r, pink.g, pink.b, 195); - circleRGBA (appData.renderer, appData.screen_width>>1, appData.screen_height * CENTEROFFSET, p100km, pink.r, pink.g, pink.b, 127); + char scaleLabel[8] = ""; + + thickLineRGBA(appData.renderer,10,10,10,10*appData.screen_uiscale,2,pink.r, pink.g, pink.b, 255); - drawString("1km", (appData.screen_width>>1) + (0.707 * p1km) + 5, (appData.screen_height * CENTEROFFSET) + (0.707 * p1km) + 5, appData.mapFont, pink); - drawString("10km", (appData.screen_width>>1) + (0.707 * p10km) + 5, (appData.screen_height * CENTEROFFSET) + (0.707 * p10km) + 5, appData.mapFont, pink); - drawString("100km", (appData.screen_width>>1) + (0.707 * p100km) + 5, (appData.screen_height * CENTEROFFSET) + (0.707 * p100km) + 5, appData.mapFont, pink); + while(scaleBarDist < appData.screen_width) { + thickLineRGBA(appData.renderer,10+scaleBarDist,10,10+scaleBarDist,10*appData.screen_uiscale,2,pink.r, pink.g, pink.b, 255); + + if (Modes.metric) { + snprintf(scaleLabel,8,"%dkm", (int)pow(10,scalePower)); + } else { + snprintf(scaleLabel,8,"%dmi", (int)pow(10,scalePower)); + } + + drawString(scaleLabel, 10+scaleBarDist, 10*appData.screen_uiscale, appData.mapFont, pink); + + scalePower++; + scaleBarDist = screenDist((float)pow(10,scalePower)); + } + + scalePower--; + scaleBarDist = screenDist((float)pow(10,scalePower)); + + thickLineRGBA(appData.renderer,10,10+5*appData.screen_uiscale,10+scaleBarDist,10+5*appData.screen_uiscale,2,pink.r, pink.g, pink.b, 255); + + + // int p1km = screenDist(1.0); + // int p10km = screenDist(10.0); + // int p100km = screenDist(100.0); + + // circleRGBA (appData.renderer, appData.screen_width>>1, appData.screen_height * CENTEROFFSET, p1km, pink.r, pink.g, pink.b, 255); + // circleRGBA (appData.renderer, appData.screen_width>>1, appData.screen_height * CENTEROFFSET, p10km, pink.r, pink.g, pink.b, 195); + // circleRGBA (appData.renderer, appData.screen_width>>1, appData.screen_height * CENTEROFFSET, p100km, pink.r, pink.g, pink.b, 127); + + // drawString("1km", (appData.screen_width>>1) + (0.707 * p1km) + 5, (appData.screen_height * CENTEROFFSET) + (0.707 * p1km) + 5, appData.mapFont, pink); + // drawString("10km", (appData.screen_width>>1) + (0.707 * p10km) + 5, (appData.screen_height * CENTEROFFSET) + (0.707 * p10km) + 5, appData.mapFont, pink); + // drawString("100km", (appData.screen_width>>1) + (0.707 * p100km) + 5, (appData.screen_height * CENTEROFFSET) + (0.707 * p100km) + 5, appData.mapFont, pink); } void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, double screen_lon_min, double screen_lon_max) { - if(tree == NULL) { return; } @@ -381,17 +408,16 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou return; } - if (tree->lon_min > screen_lon_max || screen_lon_min > tree->lon_max) + if (tree->lon_min > screen_lon_max || screen_lon_min > tree->lon_max) { return; - - double dx, dy; - int x, y; + } drawPolys(tree->nw, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); drawPolys(tree->sw, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); drawPolys(tree->ne, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); drawPolys(tree->se, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + double dx, dy; // if(!(tree->lat_min > screen_lat_min && // tree->lat_max < screen_lat_max && // tree->lon_min > screen_lon_min && @@ -401,6 +427,9 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou // } //Draw quadtree bounds + // + // int x, y; + // pxFromLonLat(&dx, &dy, tree->lon_min, tree->lat_min); // screenCoords(&x, &y, dx, dy); @@ -413,7 +442,7 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou // int bottom = y; // int right = x; -// rectangleRGBA(appData.renderer, left, top, right, bottom, red.r, red.g, red.b, 255); + // rectangleRGBA(appData.renderer, left, top, right, bottom, red.r, red.g, red.b, 255); @@ -522,83 +551,12 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou } void drawGeography() { - double screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max; - latLonFromScreenCoords(&screen_lat_min, &screen_lon_min, 0, 0); - latLonFromScreenCoords(&screen_lat_max, &screen_lon_max, appData.screen_width, appData.screen_height); - - //printf("lat_min: %f, lat_max: %f, lon_min: %f, lon_max: %f\n", screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + latLonFromScreenCoords(&screen_lat_min, &screen_lon_min, 0, appData.screen_height * -0.2); + latLonFromScreenCoords(&screen_lat_max, &screen_lon_max, appData.screen_width, appData.screen_height * 1.2); drawPolys(&root, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); - - - return; - int x1, y1, x2, y2; - - int skip = (int)(appData.maxDist / 25.0f); - if(skip < 1) { - skip = 1; - } - - for(int i=skip; ix - 5 * appData.screen_uiscale; p_right = p->x + 5 * appData.screen_uiscale; p_top = p->y - 5 * appData.screen_uiscale; @@ -820,22 +780,22 @@ void resolveLabelConflicts() { //left collision if(check_left > p_left && check_left < p_right) { - check_p->ddox -= 0.04f * (float)(check_left - p_right); + check_p->ddox -= plane_force * (float)(check_left - p_right); } //right collision if(check_right > p_left && check_right < p_right) { - check_p->ddox -= 0.04f * (float)(check_right - p_left); + check_p->ddox -= plane_force * (float)(check_right - p_left); } //top collision if(check_top > p_top && check_top < p_bottom) { - check_p->ddoy -= 0.04f * (float)(check_top - p_bottom); + check_p->ddoy -= plane_force * (float)(check_top - p_bottom); } //bottom collision if(check_bottom > p_top && check_bottom < p_bottom) { - check_p->ddoy -= 0.04f * (float)(check_bottom - p_top); + check_p->ddoy -= plane_force * (float)(check_bottom - p_top); } check_p = check_p -> next; @@ -892,7 +852,7 @@ void drawMap() { SDL_Color planeColor; drawGeography(); - drawGrid(); + drawScaleBars(); for(int i = 0; i < 4; i++) { resolveLabelConflicts(); diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index e4b7902..b9c3d03 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -876851c7cb19383223314e1599b55727c8695ce2 \ No newline at end of file +4dc33d9f8be5dcade60c5ce4a92e98d0da98849c \ No newline at end of file diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id index 93377fb..cc7ce57 100644 --- a/view1090.REMOVED.git-id +++ b/view1090.REMOVED.git-id @@ -1 +1 @@ -53b830e927a180703148d0394461fe22fe54dc54 \ No newline at end of file +f2546650b9e09d0840df7238dbb42cac66e1f5e9 \ No newline at end of file From 4933361fb4c5c9ac292ce505d0931155a19a615e Mon Sep 17 00:00:00 2001 From: nathan Date: Sun, 16 Feb 2020 21:54:46 -0800 Subject: [PATCH 58/65] started adding tap (debug only for now) Former-commit-id: 0d01589322c7d53a01d48c0892bc4005b65b8a49 [formerly 3f0f4f4235ba99d564d88f2bed86757b79b6afac] [formerly aef9365c434e1ba1d9146f7cf8c37706b80a96b2] Former-commit-id: 98f78c5ae16d9c9014f1db2ab429348cecff59b4 Former-commit-id: e348bbf60e9a76dd0ff9b522da9ff2829cd9ef2a --- draw.c | 16 ++++++++++++++++ draw.o.REMOVED.git-id | 2 +- font.o | Bin 37488 -> 37624 bytes init.o | Bin 47992 -> 48136 bytes input.c | 37 +++++++++++++++++++++++++++++++++++++ input.o.REMOVED.git-id | 2 +- list.o | Bin 47984 -> 48128 bytes monokai.o | Bin 27488 -> 27624 bytes planeObj.o | Bin 44040 -> 44176 bytes status.o.REMOVED.git-id | 2 +- structs.h | 6 ++++++ view1090.REMOVED.git-id | 2 +- view1090.o.REMOVED.git-id | 2 +- 13 files changed, 64 insertions(+), 5 deletions(-) diff --git a/draw.c b/draw.c index 8b2a369..d0cd543 100644 --- a/draw.c +++ b/draw.c @@ -881,6 +881,7 @@ void drawMap() { pxFromLonLat(&dx, &dy, p->lon, p->lat); screenCoords(&x, &y, dx, dy); + if((int)(now - p->seen) > DISPLAY_ACTIVE) { planeColor = grey; } else { @@ -945,6 +946,21 @@ void drawMap() { } p = p->next; } + + + if(appData.touchx && appData.touchy) { + + int radius = (mstime() - appData.touchDownTime); + int alpha = 255 - (int)(0.5 * (mstime() - appData.touchDownTime)); + if(alpha < 0 ) { + alpha = 0; + appData.touchx = 0; + appData.touchy = 0; + } + + circleRGBA(appData.renderer, appData.touchx, appData.touchy, radius, white.r, white.g, white.b, alpha); + + } } // diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index b9c3d03..8f54ef4 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -4dc33d9f8be5dcade60c5ce4a92e98d0da98849c \ No newline at end of file +1d914216fcda8f2b793acf12bfbfddfb24809c94 \ No newline at end of file diff --git a/font.o b/font.o index 3cc27a7d80e6be75c805c8e17ba0e80fa66a2a7f..9acfc71c0711e9547104cc59564f6831d781a1cf 100644 GIT binary patch delta 6885 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 delta 6797 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 o{)Ph{Tprb!Kb8mm67dC%;e3o`HHU+?@e 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 diff --git a/input.c b/input.c index 8dbcfb7..8ccf87a 100644 --- a/input.c +++ b/input.c @@ -1,6 +1,16 @@ #include "structs.h" #include "view1090.h" +static uint64_t mstime(void) { + struct timeval tv; + uint64_t mst; + + gettimeofday(&tv, NULL); + mst = ((uint64_t)tv.tv_sec)*1000; + mst += tv.tv_usec/1000; + return mst; +} + void getInput() { SDL_Event event; @@ -58,9 +68,36 @@ void getInput() double outLon = dx * (1.0/6371.0) * (180.0f / M_PI) / cos(((appData.centerLat)/2.0f) * M_PI / 180.0f); + //double outLon, outLat; + //latLonFromScreenCoords(&outLat, &outLon, event.tfinger.dx, event.tfinger.dy); appData.centerLon += outLon; appData.centerLat += outLat; + + break; + + + case SDL_FINGERDOWN: + appData.touchDownTime = mstime(); + break; + + case SDL_FINGERUP: + if(mstime() - appData.touchDownTime < 30) { + //latLonFromScreenCoords(&(appData.touchLat), &(appData.touchLon), event.tfinger.x, event.tfinger.y); + // double scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; + + // double dx = -1.0 * (0.75*(double)appData.screen_width / (double)appData.screen_height) * appData.screen_width * event.tfinger.x * appData.maxDist / (0.95 * scale_factor * 0.5); + // double dy = 1.0 * appData.screen_height * event.tfinger.y * appData.maxDist / (0.95 * scale_factor * 0.5); + + // appData.touchLat = dy * (1.0/6371.0) * (180.0f / M_PI); + + // appData.touchLon = dx * (1.0/6371.0) * (180.0f / M_PI) / cos(((appData.centerLat)/2.0f) * M_PI / 180.0f); + appData.touchx = appData.screen_width * event.tfinger.x; + appData.touchy = appData.screen_height * event.tfinger.y; + } else { + appData.touchx = 0; + appData.touchy = 0; + } break; } } diff --git a/input.o.REMOVED.git-id b/input.o.REMOVED.git-id index 9dd6b32..360c152 100644 --- a/input.o.REMOVED.git-id +++ b/input.o.REMOVED.git-id @@ -1 +1 @@ -16d52890261f72e78ba71c37bea36a5c18405767 \ No newline at end of file +4014ada04a2708aebb111395550edf352c684f96 \ No newline at end of file diff --git a/list.o b/list.o index 93dc507893cbcb8afeab2e7f05e33f3fdd03ba8e..dfda3c3c13dba943d63673ef1a95f209f42440ba 100644 GIT binary patch delta 8491 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 PCpSclnm>U3H+TF${;jEA diff --git a/monokai.o b/monokai.o index 5981be1df21cc977a57899488dde0b09fa36d183..f4fa05780eb7941f2500af5658025cd8080f9b07 100644 GIT binary patch delta 6304 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 delta 6026 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 diff --git a/planeObj.o b/planeObj.o index 07195dcad575f83c8d2f3ee8786e8fcbb24a4b31..55fc516147375d03774530ddab6d29817fcf4bbf 100644 GIT binary patch delta 10385 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 delta 10217 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 V Date: Mon, 17 Feb 2020 18:11:05 -0800 Subject: [PATCH 59/65] added touch to center and track planes Former-commit-id: 72763a5ba7497b5d6383df53959180dda571e94a [formerly b8d2b83f47121d34ad0c9cfbdd7c8f71bd90b679] [formerly 86d982e51aef694aa509793340d5596eeba59ef4] Former-commit-id: 61c938afcd00704d5a02d607225f2a6ee2feaa5b Former-commit-id: fb78d6786a438c2016b8b92758b61b6419f8577a --- draw.c | 70 +++++++++++++++++++++++++++++--------- draw.o.REMOVED.git-id | 2 +- font.o | Bin 37624 -> 37744 bytes init.o | Bin 48136 -> 48256 bytes input.c | 11 ++---- input.o.REMOVED.git-id | 2 +- list.o | Bin 48128 -> 48248 bytes monokai.o | Bin 27624 -> 27744 bytes planeObj.o | Bin 44176 -> 44288 bytes status.o.REMOVED.git-id | 2 +- structs.h | 3 ++ view1090.REMOVED.git-id | 2 +- view1090.o.REMOVED.git-id | 2 +- 13 files changed, 63 insertions(+), 31 deletions(-) diff --git a/draw.c b/draw.c index d0cd543..19e78dc 100644 --- a/draw.c +++ b/draw.c @@ -48,6 +48,23 @@ SDL_Color signalToColor(int signal) { return planeColor; } +SDL_Color lerpColor(SDL_Color aColor, SDL_Color bColor, float factor) { + if(factor > 1.0f) { + factor = 1.0f; + } + + if(factor < 0.0f) { + factor = 0.0f; + } + + SDL_Color out; + out.r = (1.0f - factor) * aColor.r + factor * bColor.r; + out.g = (1.0f - factor) * aColor.g + factor * bColor.g; + out.b = (1.0f - factor) * aColor.b + factor * bColor.b; + + return out; +} + SDL_Color hsv2SDLColor(double h, double s, double v) { double hh, p, q, t, ff; @@ -519,9 +536,11 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou double d2 = dx* dx + dy * dy; - double alpha = 1.0 - (d1+d2) / (3* appData.maxDist * appData.maxDist); + double factor = 1.0 - (d1+d2) / (3* appData.maxDist * appData.maxDist); - lineRGBA(appData.renderer, x1, y1, x2, y2, alpha * purple.r + (1.0-alpha) * blue.r, alpha * purple.g + (1.0-alpha) * blue.g, alpha * purple.b + (1.0-alpha) * blue.b, 255 * alpha); + SDL_Color lineColor = lerpColor(blue, purple, factor); + + lineRGBA(appData.renderer, x1, y1, x2, y2, lineColor.r, lineColor.g, lineColor.b, 255); prevPoint = currentPoint; currentPoint = currentPoint->next; @@ -881,17 +900,6 @@ void drawMap() { pxFromLonLat(&dx, &dy, p->lon, p->lat); screenCoords(&x, &y, dx, dy); - - if((int)(now - p->seen) > DISPLAY_ACTIVE) { - planeColor = grey; - } else { - planeColor = green; - //srand(p->addr); - // planeColor = hsv2SDLColor(255.0 * (double)rand()/(double)RAND_MAX, 255.0, 200.0); - //planeColor = signalToColor((int)(255.0f * (float)rand()/(float)RAND_MAX)); - //fprintf("%d %d %d\n", planeColor.r, planeColor.g, planeColor.b); - } - if(p->created == 0) { p->created = mstime(); } @@ -901,7 +909,7 @@ void drawMap() { circleRGBA(appData.renderer, x, y, 500 - age_ms, 255,255, 255, (uint8_t)(255.0 * age_ms / 500.0)); } else { if(MODES_ACFLAGS_HEADING_VALID) { - int usex = x; + int usex = x; int usey = y; if(p->seenLatLon > p->oldSeen[p->oldIdx]) { @@ -918,6 +926,34 @@ void drawMap() { usey = y + (mstime() - p->msSeenLatLon) * vely; } + if((usex - appData.touchx) * (usex - appData.touchx) + (usey - appData.touchy) * (usey - appData.touchy) < 900) { + selectedPlane = p; + } + + if(p == selectedPlane) { + appData.centerLon += 0.1 * (p->lon - appData.centerLon); + appData.centerLat += 0.1 * (p->lat - appData.centerLat); + + + thickLineRGBA(appData.renderer, x - 40, y - 40, x - 10, y - 40, 4, pink.r, pink.g, pink.b, 255); + thickLineRGBA(appData.renderer, x - 40, y - 40, x - 40, y - 10, 4, pink.r, pink.g, pink.b, 255); + + thickLineRGBA(appData.renderer, x + 40, y - 40, x + 10, y - 40, 4, pink.r, pink.g, pink.b, 255); + thickLineRGBA(appData.renderer, x + 40, y - 40, x + 40, y - 10, 4, pink.r, pink.g, pink.b, 255); + + thickLineRGBA(appData.renderer, x + 40, y + 40, x + 10, y + 40, 4, pink.r, pink.g, pink.b, 255); + thickLineRGBA(appData.renderer, x + 40, y + 40, x + 40, y + 10, 4, pink.r, pink.g, pink.b, 255); + + thickLineRGBA(appData.renderer, x - 40, y + 40, x - 10, y + 40, 4, pink.r, pink.g, pink.b, 255); + thickLineRGBA(appData.renderer, x - 40, y + 40, x - 40, y + 10, 4, pink.r, pink.g, pink.b, 255); + planeColor = lerpColor(pink, grey, (now - p->seen) / (float) DISPLAY_ACTIVE); + } else { + planeColor = lerpColor(green, grey, (now - p->seen) / (float) DISPLAY_ACTIVE); + } + + // if((int)(now - p->seen) > DISPLAY_ACTIVE) { + // planeColor = grey; + // } if(outOfBounds(x,y)) { drawPlaneOffMap(x, y, &(p->cx), &(p->cy), planeColor); @@ -950,15 +986,15 @@ void drawMap() { if(appData.touchx && appData.touchy) { - int radius = (mstime() - appData.touchDownTime); - int alpha = 255 - (int)(0.5 * (mstime() - appData.touchDownTime)); + int radius = .25 * (mstime() - appData.touchDownTime); + int alpha = 128 - (int)(0.5 * (mstime() - appData.touchDownTime)); if(alpha < 0 ) { alpha = 0; appData.touchx = 0; appData.touchy = 0; } - circleRGBA(appData.renderer, appData.touchx, appData.touchy, radius, white.r, white.g, white.b, alpha); + filledCircleRGBA(appData.renderer, appData.touchx, appData.touchy, radius, white.r, white.g, white.b, alpha); } } diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index 8f54ef4..127f6f3 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -1d914216fcda8f2b793acf12bfbfddfb24809c94 \ No newline at end of file +d08aaa37cf2b39ef11671ed4f318ae82fcf0c1dd \ No newline at end of file diff --git a/font.o b/font.o index 9acfc71c0711e9547104cc59564f6831d781a1cf..3f987831914f6996ea1c148c9ecd75d565df0fa8 100644 GIT binary patch delta 7143 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 delta 6901 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 JLwL;%{{=pH!65(u diff --git a/init.o b/init.o index 7d18cc464f0f66f11c9e9fc6bf4d566726e3184b..82dcfa3a4292a88180bfad97fd13a9c26be7557c 100644 GIT binary patch delta 7113 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 diff --git a/input.c b/input.c index 8ccf87a..4fe055d 100644 --- a/input.c +++ b/input.c @@ -83,17 +83,10 @@ void getInput() case SDL_FINGERUP: if(mstime() - appData.touchDownTime < 30) { - //latLonFromScreenCoords(&(appData.touchLat), &(appData.touchLon), event.tfinger.x, event.tfinger.y); - // double scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; - - // double dx = -1.0 * (0.75*(double)appData.screen_width / (double)appData.screen_height) * appData.screen_width * event.tfinger.x * appData.maxDist / (0.95 * scale_factor * 0.5); - // double dy = 1.0 * appData.screen_height * event.tfinger.y * appData.maxDist / (0.95 * scale_factor * 0.5); - - // appData.touchLat = dy * (1.0/6371.0) * (180.0f / M_PI); - - // appData.touchLon = dx * (1.0/6371.0) * (180.0f / M_PI) / cos(((appData.centerLat)/2.0f) * M_PI / 180.0f); appData.touchx = appData.screen_width * event.tfinger.x; appData.touchy = appData.screen_height * event.tfinger.y; + selectedPlane = NULL; + } else { appData.touchx = 0; appData.touchy = 0; diff --git a/input.o.REMOVED.git-id b/input.o.REMOVED.git-id index 360c152..896993b 100644 --- a/input.o.REMOVED.git-id +++ b/input.o.REMOVED.git-id @@ -1 +1 @@ -4014ada04a2708aebb111395550edf352c684f96 \ No newline at end of file +71b217637379d15bac063de1731f31a46620dce5 \ No newline at end of file diff --git a/list.o b/list.o index dfda3c3c13dba943d63673ef1a95f209f42440ba..bf268321b29b9c8ce9774ac5e7e7b6862397b489 100644 GIT binary patch delta 7484 zcma)>4_MSyy2s}L{-HFTw2lWw7zq?Be@-Ii?WT@*b7WmhT31t7#{sD@g+^4wR2)+i zjS#-6u(Il;B2=2gP>P!=wYS2%*J86<>~q_8YU`%%ZNts7+FSen=J!qx=RWPzd7e3( z^M2m@<<+M=?)bsp?b$KAtvM0 zuzc|r($c2Qo1A8|#aHhsH%QwiGVYC3o4GpNqWifz!m2iw-yBiC)2y1wvUOSXFe^{a zLwnjSA`f4r8FwsWO-r8|nl~cVX1lGH#kW;P3mdpFCaQT53vU`x9&3L+BXPIqpZl;m zW6ew}G2@kgZgRC*iX%(>BEGu0JWI?(uk;~e89qxNIA+|827W$>}Oo> zeOV$mZl%qZZ4Q^2Or_`WWk#xa34?~GjcKR)1`(i_Q;94wIa%8XDYz3PBGWba6X9!UK6gn15 z(TVem-NFgyLsI>9fTey;vziX?LsD!**+Yi9g{IO>anuttMI*^X8+llGgC$MUXfJd< zRh#m_Xl8M#XgF$Df4Qmy6~)@wR*5M1I`@0p8&Qj12NurHNrx5J`mHChALQnxDN z*y7?Wt!U(LBe2vE|BVjv@FAUpX3ExdEQx9EoON%iSqOPa0Gk#G_{eWOM1(db5aeKN_-Ku6iCcUE zvD_mbgLk2daSEgeFKarp5nd-nI=))x7D;fGyVaY#fC~C{kG2?razi|Wj&ezN!ufJT&0@{h zG|dO$Trb6HC6m?$9oASIQV7_Uk^v66loY==}{YbqW??N z>5E_`-83BH2O6D^aHWSXYS$AUF&F{L6CkQ2KC9|&&*q?_gK#UHL`D;ttdU%Ji7X^? zw?;DbXAqAKl7s8s?jX?x0{D=-FCM)g79{!PVwj*(KP8{ zSuIsIPu&TPy5S;vAJbPgS_ogYc}!GP8{#9hR=epo7Bx~`VZARj{d72q-oeLl9LF9V zxq0x`xW(sas&U8l9EM9Zqr@w4fKHB^tbH^=Gx!F%kV2vmhH~@1nWgFEBS;>~ndWJ9 zH^TUBkc>4B=Cpp61YgRg(QNn4nKS( zIZl#u+>4zEkmM7Rtl_rkVN8-iP5l$6b2O(Rnk1%@WE_95y$vTxR*_^Wd%gfKNg7Eq znooxBP)(9|oBEF*#VdXwkBvG0d<#Unm(22LueYRHz0O2elN>uC#%iPmBDq_$dYq%3 zZpzViVt^<@?$c5|5~F8+`Q)&Vt?(1AilOF<_H`bYIs~7VIeRpk!1X3gejlIcEt>or z_I3*PXQX;vqaW}{{T?o&?`U)gpGRT%o{{Ar$53+#OyXW#jFFr1NB7?47`fT&I&;t| zeH|k=_3L>e68Nt<2d4fVgqX;6%T>8OPds^Oaa3qAz0HF*kOFL%NF ztW@{JP_y~DyclPq`dOKiA4AQydh()MrpZV0CR-CDH@&s6H$S?lt!+O*x5IH*s>T>< zw$;c3(TrT8$29ssJcVuW6FtM!G%=ejrk|O9k08--jI9~f0{(Zc3kVban?{c?y#o6Y zsfMPSe&}D5>DQBfJ8-g7bARzf@{RSnZbp1^tz|qc}COO$4{BFKOlb_U1ZxC$^QgLNQyt3Ic9`Lh?Y=U$P*`OL!HmR zCd7FJj*Uy)QfT#V62iyEiTO~+CyE`IL;35dqkJYhk57!duLVi16U0W$X`LvZL>=W@ z(AhdMvClZmd^H>=#)-|Cb7Ep#^8yIZjW~LO{`V7|CnnMdp8Czi#8gkTCGT&>B`#cK S)#zKDYR6lw+P84Lkn#^Oo2YXD delta 7801 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 delta 5426 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 N+wHfHpkPPTzX6Q(gVg{4 delta 9054 zcmaJ{3wTt;^}n;c5+J}D%48s~g`hlhNd4-shN4lQp;R^kiP}D+r9Jp?b@BB^txLLT zdrkdQw{5Sf`U`NTt2y{BMEYTGx|66>lsthAYqn8_r|^N1hPte&CYN+KTB(LI7~U;8 zsw~zpaxMR=t2<#yx74xQ5&2rgYg^P!{qjA%+|p4sTsW5Z1D?OO*wGoX#TiQg_JO2B~;cgi{E&GbZSJ2;cXWN4~k-PkcxaR^)^dtpp5;WUX z#Mr_(!|0=dzO~4;2ptOaJ4-_S9l4@J!$=lcu41fzBL*Pc`#IiGS|xU59w6B2aljnZ zGmI2vJ#;gGF4IpeV%$lskeX<{8RkHz(VH60_4Kl^i^%SPGx}d@y?->vDUYIxWl`+^ znj~!N-qol5H5dQ%bQc)L&uLhr1g%<2_QPE78Gh#8e=(T3@A8dn{`AFG(Z{%MsFRzE-184&zw9ZRJ#@|)p&k2p~S zH+v+BOVA^!r%>QaN)e-BNz$D?nlA#!Q{p+jTJF;eL1guPE&S)C?uikFbBm_rJ>)M8 zfAzqL*7P>_@$f67(_2EDjGf`b8Mh+BhqFhuXbk=#%MQbM7N2h8n_JkYRYuWs2c%7u z;_uCi)Hdr{{=eP&0j_D1*!yrq~U^8B#^j>gY_F#~C;as*!C^ za~;Ik?NEp8;_miXS&S_Qcb-g%BTvs`tkdUGhHr=LJX1-sXD?$XK~4|16~{o$ zJSpCRhM8XV7qa1Vds{TF%2y#X-xLENnD2#>IT3Iof4Im1_bgM~gtS>wd-QXCBX z=I&`BzK4bQZCoG;a@)|CivNObHtLr#a_d{dM|HOh>jeeoWXISX~jCXwGiW$Zd| z7n(vsTA>togtH6V2(-dqB-NYBp4~v}64m6ok04Z(Bf3EY%1oi)jAJrqz_UP#-@woX zIU*k_us#CU7UZZe$cO_>{wx#}OQ;T4| zf*`W>#NNl)>rjnsJBsKi#>PV3BE7ENi@j@FTmE(qJKDBOtU~ ziXzyz+!P()^m4Cw06YOx1RygYp(GIDKEyPhhafVCka>eK$DkUS^T@o%n2S&skZKie z+)o*M0Nf?|98JS|KNOVY;E7mU;#K!kGKkgFz~am(9#Vo5H@Yuqs$!BE$Yhcr6qITc zvBMcV6>5+@Kv8~(v4fx?Xo@`Wtk@{7LG=nR-fOO{IO=Mt;PsUwMJ|X{QnUfJs#rV+ zp;cbhFVV8kh>NnHj-gLN14{OU$knEL8$Vv?GL*@bLgs2I?u3~r^Ct>Y7LzH1>eW&` zKnZsWV;_OK)zWo60j{r376s6IjXrI&*O=-Aoj|*p!ZoN`BhmCDYl_7Okg`^aC&0J1 zZ(O2fpk4jIbhbcfZFC&vZc8MtgDvSyHVSIi=7^`kv#uD=%8GSfY}c*(B#uI039qz1 z^fg5?8)~04A-6OFB1(IS3P>q6#aZx|N_B~1^LM848iY!vmJ_l9)i3SSJ>9 zz+WcSa0=Ia#$JXHvP%=~S+8g8DyS)wxcX0*dBt4tJY|YH$b3rTN|}l6mQaE9VmSU( zj(U>p>_^^pM(+t}8xsOPhW?rks4Rv%`NhxhIka%*FuWZ_YZ1ep7_YYRKx4XyriEJ0 z6soO{!G`fX!@s7b{}RK`&~p1d!}ki?k;iVs1BNk&*35^u5r*N!Z-$N(+vkYHO;eL_fA8Nl~dEdriM!8#k z&SVC1+?Up=-U#9mGhNqKPH`sX7E(*}9*~%2EDcZXj?ihNA;rCI>`k3J-$xVN| z4aZ$HjArnEw-JUhpE~-E;X^3fUT1iFN&{_ZB2Ijq*v2zFQ|mv3e|;G7Hick3!&i~( zrZap7T`!&hv03_-Gqy7=%Tk6rn|lkx6^;G^_&3YIIb!uvq;+pC#Vbtf1})he3_n4m zx1p`+IHjHzVKl>^p<8XDeTlHl!ZRvdoc(zDiI%7-deJsNpD9hw9{9C#R%!c3= zsTMKzW7?Q&pc==jVr(V(>bDF(PksK8;i(j<55WD5RHqqxhUR_=(vWRI%g^yxOe@Rr zh8qf=k%0upUeRJ$`ZIhRS#mGK_fouq46mZ3v612bCR?}LcvH^Jq5$t_3hf9#0x4Ui zdY7>~X!y^-zf}hQ&e-iO?8!7R{3E(aM9~g(T%&&w(4`y0>nY^D86H7SNw@LwjR(k1 zA|7T6$LWahGrTYD$hi#PPC08CWLC()dd9Y;I9D+I2O513!{<_Bd6nT?>H7UAhCfJn zt&KOO*jy6)k|~_0P5Uo~x7KGomKzMur$rJ;=c*HjF%)xo8-A~06j8W)-bNV4D>U%k z41Y1v8rMjJs%K?j3}d%YxF<6FP12gh@J|U}#PA~8y=xgR=zE{dHV%Wgxz$c4^9{|Y z8vNU&?UeQ$je% zaOVrsKQO#C$scF*S^n&9C(|u(YGqt7k-M(ZXY(0WFVf#_FJ-r4(`(cy>rNfLN!` zF_bxnK;{l9ereTN5JbuGO!5>-E`n-ggUv?Kc61_k6Vzcpo8kD51c<5Zq~2;Kr)~WY z$sLEZN~u0(Y&zWyzJLN`uQE2DSOcn%jidlOUI-H#4YidLzmXMH`a2q|)et6miX`uc z6lBK{s}0k{(`4a1@FTm9u^s6kt%MM=FE{I1`#P4^!C|OD_GB|w&;16C`wwWSlD>bj zp2wktF5flN(sOf4OWFX=e3y|WQIPq9R9zVRF0qLaM7CEmR_kX_r-PvyS?9y8({m@v zwLYjr_F>X>{PPa!P5}2#sq&lktml|dy7M6o*`;hDQlmoUN= zd+?Wu-B7i6aAZl2VHMnYdk5qH2dI6i_$x{_)}5dNYYC^Z?gi?lRN;ketY3o)tjEFW zmr^4a|J>HT0-pVY@#oR({i&|a*^oBA3mn?t3%@Hry+0MdyHf{JBNNBlqA}np<-S!*)+_NX)zs$sLHvj+t diff --git a/status.o.REMOVED.git-id b/status.o.REMOVED.git-id index b903e78..17750e5 100644 --- a/status.o.REMOVED.git-id +++ b/status.o.REMOVED.git-id @@ -1 +1 @@ -ec8f0fb7706c5fa30afa98ef72cf1c6277615e5c \ No newline at end of file +006a8fe10b2ac3777a05e5056d4166533ad2fae5 \ No newline at end of file diff --git a/structs.h b/structs.h index 6ae020c..45b64d7 100644 --- a/structs.h +++ b/structs.h @@ -86,6 +86,9 @@ struct planeObj { struct planeObj *planes; + +struct planeObj *selectedPlane; + struct { double msgRate; double avgSig; diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id index 267e656..6735ea2 100644 --- a/view1090.REMOVED.git-id +++ b/view1090.REMOVED.git-id @@ -1 +1 @@ -4c1cc2ef49ee01e71918440dd30dd506c50f2a13 \ No newline at end of file +607b9efc8cc81bbdd0c6f524632fc9b69ab1e244 \ No newline at end of file diff --git a/view1090.o.REMOVED.git-id b/view1090.o.REMOVED.git-id index 55d52d1..c48ad66 100644 --- a/view1090.o.REMOVED.git-id +++ b/view1090.o.REMOVED.git-id @@ -1 +1 @@ -c32a44e5918f8a87926408a39f094f258c9f76e6 \ No newline at end of file +188de208d70a8a746cda5dd29c243ac3053a9c0c \ No newline at end of file From 49c4b4e4a6c793e0d4d8092d50eff4b2cdc4a3cc Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 17 Feb 2020 22:19:45 -0800 Subject: [PATCH 60/65] geography renders to a seprate texture, only updates when moved Former-commit-id: 8f3b9d2977854a6c2f747f4e6a5b0519823d7ab7 [formerly f24714e0276678698dffbf4270fb73c16c9a872f] [formerly 8c6ec13e7e07eede486b4d804517de3212532216] Former-commit-id: 09e11860daedfa3c625b44b19c55d375319932fe Former-commit-id: 5ffce6f3e593acf6472ed5f540a871b0219d610b --- defs.h | 2 ++ draw.c | 71 ++++++++++++++++++++++++++------------ draw.o.REMOVED.git-id | 2 +- font.o | Bin 37744 -> 37800 bytes init.c | 6 ++-- init.o | Bin 48256 -> 48344 bytes input.c | 3 ++ input.o.REMOVED.git-id | 2 +- list.o | Bin 48248 -> 48296 bytes monokai.o | Bin 27744 -> 27792 bytes planeObj.o | Bin 44288 -> 44336 bytes status.o.REMOVED.git-id | 2 +- structs.h | 4 ++- view1090.REMOVED.git-id | 2 +- view1090.c | 2 +- view1090.o.REMOVED.git-id | 2 +- 16 files changed, 66 insertions(+), 32 deletions(-) diff --git a/defs.h b/defs.h index abdf5b9..f1ef68c 100644 --- a/defs.h +++ b/defs.h @@ -15,6 +15,8 @@ #define DISPLAY_ACTIVE 30 #define TRAIL_TTL_STEP 2 +#define MIN_MAP_FEATURE 2 + #define FRAMETIME 33 #define PAD 5 diff --git a/draw.c b/draw.c index 19e78dc..c04bd1d 100644 --- a/draw.c +++ b/draw.c @@ -529,7 +529,7 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou } - if((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1) < 100){ + if((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1) < MIN_MAP_FEATURE){ currentPoint = currentPoint->next; continue; } @@ -538,7 +538,7 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou double factor = 1.0 - (d1+d2) / (3* appData.maxDist * appData.maxDist); - SDL_Color lineColor = lerpColor(blue, purple, factor); + SDL_Color lineColor = lerpColor(purple, blue, factor); lineRGBA(appData.renderer, x1, y1, x2, y2, lineColor.r, lineColor.g, lineColor.b, 255); @@ -865,17 +865,10 @@ void resolveLabelConflicts() { } -void drawMap() { +void drawPlanes() { struct planeObj *p = planes; time_t now = time(NULL); SDL_Color planeColor; - drawGeography(); - - drawScaleBars(); - - for(int i = 0; i < 4; i++) { - resolveLabelConflicts(); - } //draw all trails first so they don't cover up planes and text @@ -931,10 +924,14 @@ void drawMap() { } if(p == selectedPlane) { - appData.centerLon += 0.1 * (p->lon - appData.centerLon); - appData.centerLat += 0.1 * (p->lat - appData.centerLat); - + if(fabs(p->lon - appData.centerLon) > 0.0001 || fabs(p->lat - appData.centerLat) > .0001) { + appData.centerLon += 0.1 * (p->lon - appData.centerLon); + appData.centerLat += 0.1 * (p->lat - appData.centerLat); + + appData.mapMoved = 1; + } + thickLineRGBA(appData.renderer, x - 40, y - 40, x - 10, y - 40, 4, pink.r, pink.g, pink.b, 255); thickLineRGBA(appData.renderer, x - 40, y - 40, x - 40, y - 10, 4, pink.r, pink.g, pink.b, 255); @@ -1004,26 +1001,54 @@ void drawMap() { // void draw() { - - if ((mstime() - appData.lastFrameTime) < FRAMETIME) { - return; - } - - appData.lastFrameTime = mstime(); - + uint64_t drawStartTime = mstime(); + updatePlanes(); updateStatus(); - SDL_SetRenderDrawColor( appData.renderer, 0, 15, 30, 0); + if(appData.mapMoved) { + SDL_SetRenderTarget(appData.renderer, appData.mapTexture); + SDL_SetRenderDrawColor(appData.renderer, 0, 0, 0, 0); + SDL_RenderClear(appData.renderer); + + drawGeography(); + drawScaleBars(); + + SDL_SetRenderTarget(appData.renderer, NULL ); + + appData.mapMoved = 0; + } + + for(int i = 0; i < 4; i++) { + resolveLabelConflicts(); + } + + //SDL_SetRenderDrawColor( appData.renderer, 0, 15, 30, 0); + SDL_SetRenderDrawColor(appData.renderer, 0, 0, 0, 0); SDL_RenderClear(appData.renderer); - drawMap(); + SDL_RenderCopy(appData.renderer, appData.mapTexture, NULL, NULL); + + drawPlanes(); drawStatus(); + if(appData.showList) { drawList(0); } - SDL_RenderPresent(appData.renderer); + char fps[10] = " "; + snprintf(fps,10," %ffps", 1000.0 / (mstime() - appData.lastFrameTime)); + drawStringBG(fps, 0,0, appData.mapFont, grey, black); + + + SDL_RenderPresent(appData.renderer); + + + appData.lastFrameTime = mstime(); + + if ((mstime() - drawStartTime) < FRAMETIME) { + usleep(1000 * (FRAMETIME - (mstime() - drawStartTime))); + } } \ No newline at end of file diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index 127f6f3..38449cd 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -d08aaa37cf2b39ef11671ed4f318ae82fcf0c1dd \ No newline at end of file +e35f478e482bb67eed7951d8c622b7fc5ad06aa7 \ No newline at end of file diff --git a/font.o b/font.o index 3f987831914f6996ea1c148c9ecd75d565df0fa8..85b9bb72588953b123507690b920fa7da94c9384 100644 GIT binary patch delta 5615 zcmaKw4Rln+6@cH}B#;fEYZ8*l3oIleNR+aydLWpR7(|vuP!^IvM6y{S7=H4z1hNSP zmX$vvNU~gQiv=Z$5InUeU5f**(sjhrF#)=I@;6&xAkt-d)0WsRhRnoZdX{@;nx-XNH7X)y4#}4p za_W4NvkiH;lyeRF2U4D3$d^fZvLUC<$J6QmPOBw92Mx{SLkXJJg{L$0pz}4Grsc%P zxVD`7Scw>AqZRHm)&d+A2^y-4WHOJ- zKeySJUjW^*VUlAUL)`56;KoUAluKvN*|gNBDKwd*;RPg6yO;s{Em_5cMO~P4Hy4eaiO-e^of^lEEjvME<++dOar|`^#kc|6>0P{kjo*f{+&f8~aGse^2bM z>ULK%ndQp4L54hoWVy@p(@3@oWJLw`d(fFPVT#EvN||oh zXfP~|++8ANNgoiKj8Es}jFanoA)lX8gCYPYokh}*Wrf^!33ZWkIWOj>)cP7qtDD!Y zUt5g>H;stAQMe3}NjI;)sd{S zf_D8R?O0h}G9FqAJyYqg6T=G~umYnC1r+1E3j^>zdP-eTj{8a-a3l7TydBfZg#K0h zMAEd!z;I!DIE^J`0#0E?nV0&WD0Ao^(S&44w-`^;vLB&bz**GGkHB1vmOJ1R93ahy zXkFxh^Ehph%QAd4-nD2FEX5vDy@Y*>T;Ra`#V)X;f3X9e$4-(DV*g@CPL!wg2l*yb zF^5Ud!D}j>rFjoj1mF=|dD|)d7)P`-@nX~6Sh7Uuuh0uD3o3LH`j-gUi)~9B`V_li zb3(EC7Gq@N!Tu!y7>B;wUHX~$B}EBLGJ2R{9mVMF0k{vREp_O<@$*8{wkkIBFtpS` zHa$yEK^gihy>I|yl@4$rcpY#nI=$_Xg;B52vvLjZb~;dGF-JLr16~0|Xsv38_i$g8 z3;uJ?1Wb-lar$-f=vj{Z;dQq?O zQr%MHwIu2IUQH9sM9)g0m(#l}OOl*16?5V>7$UlXX_`WJV-L{>nc5ZFjeSI)XPU3j zw=iv$fNL;+l>^pe#VW5}$J47&EQ1(Z<R0GFbgmY93LSQ`Y*Of4^buXkv`wLP z7$zEIdcQ(DFuK|S_u{~67d(a2);RQMIAgz2EUPfIMrOEgjSFtT{91>8IbSz0%!o^N zkOxB%`fG)L8`I$mZNko42OP#2**woS;}o0I2z3I!LA~xDa0IROE?PrRy#s!ap?U!u zabJDFk}?9*8!G9X@iz#IB@^#ym;|fwM1#wcJQ6MbS?(`6DgRNN59K#HLB>kO3|nWt zRncFKVZYF)GtE@!tr#VGCGW^Qg`UR&zZWvmv(^g{>{;v5Lww+`R4lVFtx-S}^Bd*i zRnh3sKV-{$70bie*(mgnI8FN$`a_J7hYt|ey#sUb-F2tP+rITKSb}})1t6YVAAnux zZ*tLTdZNhzk77T`Gtn6k^b)%RE~kY(A02-2`sDMW*{$dcF-m=3$9Dq`=tOI?!;&cQ z`sPV63RgBCfksSg5pWacx457R{VnaV6=6dFa~gvJvz z=X;QQ4O8^R{Ou*sd6&?06*|CK8;?Gs(-nG@$8uqqXz3s-uj*a#S!tRNqeNE>qO#ip zrVThibiG1H@&y*eysbjtrqEryXZE0nC@M6QzdH|Li0H!#E#$sE*hBPJgQ$%8m%JLk z#y+BdQs}2lKgP6eBIz4RvFF|l=P*7c%(=raaUIbsLz#hcMXbcI4+WV#wd zJ48}QQkfh2D(@ld9=0|!^cTXi^kUx*;r?8qiJXZ<{-!W{rLumMqPMd?A4_%$eJWEk zH|sbz)6u_EKq>m}7Ep!qoUHD`*v-dXBS1?TU6Q%Dtrk`PyDDbzCoFp%DJkE3+AnF`M z^z|a^qv)sl@pydM`^lzebmw^i9mVv+*iCf> zwsjO+ChW%Fb`;UdSi{BiE8iV1woc~%^z6lOcq;ug?hO}P{yrPS?kvpRJApn8-Fu6n a0o$nV#$Kuqq7{p+ukSX-dmBA_#{3s7|5w@o delta 5663 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 diff --git a/init.c b/init.c index 720cd3a..d740e1d 100644 --- a/init.c +++ b/init.c @@ -37,11 +37,13 @@ void init(char *title) { appData.window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, appData.screen_width, appData.screen_height, flags); appData.renderer = SDL_CreateRenderer(appData.window, -1, 0); - appData.texture = SDL_CreateTexture(appData.renderer, + appData.mapTexture = SDL_CreateTexture(appData.renderer, SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_STREAMING, + SDL_TEXTUREACCESS_TARGET, appData.screen_width, appData.screen_height); + appData.mapMoved = 1; + if(appData.fullscreen) { //\SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); // make the scaled rendering look smoother. SDL_RenderSetLogicalSize(appData.renderer, appData.screen_width, appData.screen_height); diff --git a/init.o b/init.o index 82dcfa3a4292a88180bfad97fd13a9c26be7557c..f25681451b739f5af961c6b38463e5a7110db08c 100644 GIT binary patch delta 14873 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 XuW*L03t_#UpKQEl7xicO_qYBJjw~&R delta 14510 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 Di+we< diff --git a/input.c b/input.c index 4fe055d..9480445 100644 --- a/input.c +++ b/input.c @@ -47,10 +47,12 @@ void getInput() case SDL_MOUSEWHEEL: appData.maxDist *= 1.0 + event.wheel.y / 10.0; + appData.mapMoved = 1; break; case SDL_MULTIGESTURE: appData.maxDist /=1.0 + 4.0*event.mgesture.dDist; + appData.mapMoved = 1; break; case SDL_FINGERMOTION:; @@ -74,6 +76,7 @@ void getInput() appData.centerLon += outLon; appData.centerLat += outLat; + appData.mapMoved = 1; break; diff --git a/input.o.REMOVED.git-id b/input.o.REMOVED.git-id index 896993b..82d3329 100644 --- a/input.o.REMOVED.git-id +++ b/input.o.REMOVED.git-id @@ -1 +1 @@ -71b217637379d15bac063de1731f31a46620dce5 \ No newline at end of file +d4947b5d39abcf0073465f4b5683173294132874 \ No newline at end of file diff --git a/list.o b/list.o index bf268321b29b9c8ce9774ac5e7e7b6862397b489..ed2a71d5e6b81655b042285ff3977292f5fe6f57 100644 GIT binary patch delta 13418 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 od!Pfpq#HRt(ZtuG8 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 I^I*#V1I_aeCjbBd diff --git a/monokai.o b/monokai.o index a21da71099a2ea71c1883f3f92cbe694f51039b1..f3c046fa29f82566bcd3bfe93a0d161adac0fe6e 100644 GIT binary patch delta 7510 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 Sx4by>y~TFO9gte``~L$;6;Pi5 diff --git a/planeObj.o b/planeObj.o index 1be9b9e8cbf2bb4497ce4996c2727202e54ede03..22a767499553fc706d26c1f7ade3f7552164b4ec 100644 GIT binary patch delta 14364 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 P-Jv_}jGt5B<+%R?b5Ori delta 14460 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 Date: Mon, 17 Feb 2020 22:47:42 -0800 Subject: [PATCH 61/65] fixed issues with selected plane label, can now select off screen plane Former-commit-id: 00f02a8125fb1a500cc2c87c9becb92144fd0848 [formerly ab5ab5d0d3fb7f0bdb12ff5a21a6d0e249ceab6f] [formerly 969a11c7c843c43ec231673c9d15ed227414fc68] Former-commit-id: bb74b98444dc3f22d156d9b518156a74b79457a2 Former-commit-id: 4d08d9777512eea19eec90e49019c0840a20a620 --- .gitignore | 2 +- draw.c | 114 ++++++++++++++++++++++++++++++---------- draw.o.REMOVED.git-id | 2 +- view1090.REMOVED.git-id | 2 +- 4 files changed, 88 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 70ec37b..94e612e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -.o +*.o view1090 *.swp diff --git a/draw.c b/draw.c index c04bd1d..341d95f 100644 --- a/draw.c +++ b/draw.c @@ -17,6 +17,10 @@ static uint64_t mstime(void) { return mst; } +float sign(float x) { + return (x > 0) - (x < 0); +} + void CROSSVP(double *v, double *u, double *w) { v[0] = u[1]*w[2] - u[2]*(w)[1]; @@ -380,10 +384,12 @@ void drawScaleBars() char scaleLabel[8] = ""; - thickLineRGBA(appData.renderer,10,10,10,10*appData.screen_uiscale,2,pink.r, pink.g, pink.b, 255); + // thickLineRGBA(appData.renderer,10,10,10,10*appData.screen_uiscale,2,pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer,10,10,10,10*appData.screen_uiscale,pink.r, pink.g, pink.b, 255); while(scaleBarDist < appData.screen_width) { - thickLineRGBA(appData.renderer,10+scaleBarDist,10,10+scaleBarDist,10*appData.screen_uiscale,2,pink.r, pink.g, pink.b, 255); + // thickLineRGBA(appData.renderer,10+scaleBarDist,10,10+scaleBarDist,10*appData.screen_uiscale,2,pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer,10+scaleBarDist,8,10+scaleBarDist,16*appData.screen_uiscale,pink.r, pink.g, pink.b, 255); if (Modes.metric) { snprintf(scaleLabel,8,"%dkm", (int)pow(10,scalePower)); @@ -391,7 +397,7 @@ void drawScaleBars() snprintf(scaleLabel,8,"%dmi", (int)pow(10,scalePower)); } - drawString(scaleLabel, 10+scaleBarDist, 10*appData.screen_uiscale, appData.mapFont, pink); + drawString(scaleLabel, 10+scaleBarDist, 15*appData.screen_uiscale, appData.mapFont, pink); scalePower++; scaleBarDist = screenDist((float)pow(10,scalePower)); @@ -400,8 +406,8 @@ void drawScaleBars() scalePower--; scaleBarDist = screenDist((float)pow(10,scalePower)); - thickLineRGBA(appData.renderer,10,10+5*appData.screen_uiscale,10+scaleBarDist,10+5*appData.screen_uiscale,2,pink.r, pink.g, pink.b, 255); - + // thickLineRGBA(appData.renderer,10,10+5*appData.screen_uiscale,10+scaleBarDist,10+5*appData.screen_uiscale,2,pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer,10,10+5*appData.screen_uiscale,10+scaleBarDist,10+5*appData.screen_uiscale,pink.r, pink.g, pink.b, 255); // int p1km = screenDist(1.0); // int p10km = screenDist(10.0); @@ -608,7 +614,7 @@ void drawPlaneText(struct planeObj *p) { char flight[10] = " "; maxCharCount = snprintf(flight,10," %s", p->flight); - if(maxCharCount > 0) { + if(maxCharCount > 1) { drawStringBG(flight, p->x, p->y, appData.mapBoldFont, white, black); //roundedRectangleRGBA(appData.renderer, p->x, p->y, p->x + maxCharCount * appData.mapFontWidth, p->y + appData.mapFontHeight, ROUND_RADIUS, white.r, white.g, white.b, SDL_ALPHA_OPAQUE); //drawString(flight, p->x, p->y, appData.mapBoldFont, white); @@ -624,7 +630,7 @@ void drawPlaneText(struct planeObj *p) { currentCharCount = snprintf(alt,10," %d'", p->altitude); } - if(currentCharCount > 0) { + if(currentCharCount > 1) { drawStringBG(alt, p->x, p->y + currentLine * appData.mapFontHeight, appData.mapFont, grey, black); currentLine++; } @@ -640,7 +646,7 @@ void drawPlaneText(struct planeObj *p) { currentCharCount = snprintf(speed,10," %dmph", p->speed); } - if(currentCharCount > 0) { + if(currentCharCount > 1) { drawStringBG(speed, p->x, p->y + currentLine * appData.mapFontHeight, appData.mapFont, grey, black); currentLine++; } @@ -650,7 +656,7 @@ void drawPlaneText(struct planeObj *p) { } } - if(maxCharCount > 0) { + if(maxCharCount > 1) { Sint16 vx[4] = {p->cx, p->cx + (p->x - p->cx) / 2, p->x, p->x}; Sint16 vy[4] = {p->cy, p->cy + (p->y - p->cy) / 2, p->y - appData.mapFontHeight, p->y}; @@ -670,10 +676,59 @@ void drawPlaneText(struct planeObj *p) { p->h = currentLine * appData.mapFontHeight; } -float sign(float x) { - return (x > 0) - (x < 0); -} +void drawSelectedPlaneText(struct planeObj *p) { + if(p == NULL) { + return; + } + int x = p->cx - 20; + int y = p->cy + 22; + + int maxCharCount = 0; + int currentCharCount; + + int currentLine = 0; + + drawSignalMarks(p, x, y); + + char flight[10] = " "; + maxCharCount = snprintf(flight,10," %s", p->flight); + + if(maxCharCount > 1) { + drawStringBG(flight, x, y, appData.mapBoldFont, white, black); + //roundedRectangleRGBA(appData.renderer, p->x, p->y, p->x + maxCharCount * appData.mapFontWidth, p->y + appData.mapFontHeight, ROUND_RADIUS, white.r, white.g, white.b, SDL_ALPHA_OPAQUE); + //drawString(flight, p->x, p->y, appData.mapBoldFont, white); + currentLine++; + } + + char alt[10] = " "; + if (Modes.metric) { + currentCharCount = snprintf(alt,10," %dm", (int) (p->altitude / 3.2828)); + } else { + currentCharCount = snprintf(alt,10," %d'", p->altitude); + } + + if(currentCharCount > 1) { + drawStringBG(alt, x, y + currentLine * appData.mapFontHeight, appData.mapFont, grey, black); + currentLine++; + } + + if(currentCharCount > maxCharCount) { + maxCharCount = currentCharCount; + } + + char speed[10] = " "; + if (Modes.metric) { + currentCharCount = snprintf(speed,10," %dkm/h", (int) (p->speed * 1.852)); + } else { + currentCharCount = snprintf(speed,10," %dmph", p->speed); + } + + if(currentCharCount > 1) { + drawStringBG(speed, x, y + currentLine * appData.mapFontHeight, appData.mapFont, grey, black); + currentLine++; + } +} void resolveLabelConflicts() { struct planeObj *p = planes; @@ -828,7 +883,7 @@ void resolveLabelConflicts() { p = planes; while(p) { - //incorporate accelerate from label conflict resolution + //incorporate acceleration from label conflict resolution p->dox += p->ddox; p->doy += p->ddoy; @@ -919,30 +974,26 @@ void drawPlanes() { usey = y + (mstime() - p->msSeenLatLon) * vely; } - if((usex - appData.touchx) * (usex - appData.touchx) + (usey - appData.touchy) * (usey - appData.touchy) < 900) { - selectedPlane = p; - } - if(p == selectedPlane) { - if(fabs(p->lon - appData.centerLon) > 0.0001 || fabs(p->lat - appData.centerLat) > .0001) { + if(fabs(p->lon - appData.centerLon) > 0.0001 || fabs(p->lat - appData.centerLat) > 0.0001) { appData.centerLon += 0.1 * (p->lon - appData.centerLon); appData.centerLat += 0.1 * (p->lat - appData.centerLat); appData.mapMoved = 1; } - thickLineRGBA(appData.renderer, x - 40, y - 40, x - 10, y - 40, 4, pink.r, pink.g, pink.b, 255); - thickLineRGBA(appData.renderer, x - 40, y - 40, x - 40, y - 10, 4, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex - 20, usey - 20, usex - 5, usey - 20, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex - 20, usey - 20, usex - 20, usey - 5, pink.r, pink.g, pink.b, 255); - thickLineRGBA(appData.renderer, x + 40, y - 40, x + 10, y - 40, 4, pink.r, pink.g, pink.b, 255); - thickLineRGBA(appData.renderer, x + 40, y - 40, x + 40, y - 10, 4, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex + 20, usey - 20, usex + 5, usey - 20, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex + 20, usey - 20, usex + 20, usey - 5, pink.r, pink.g, pink.b, 255); - thickLineRGBA(appData.renderer, x + 40, y + 40, x + 10, y + 40, 4, pink.r, pink.g, pink.b, 255); - thickLineRGBA(appData.renderer, x + 40, y + 40, x + 40, y + 10, 4, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex + 20, usey + 20, usex + 5, usey + 20, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex + 20, usey + 20, usex + 20, usey + 5, pink.r, pink.g, pink.b, 255); - thickLineRGBA(appData.renderer, x - 40, y + 40, x - 10, y + 40, 4, pink.r, pink.g, pink.b, 255); - thickLineRGBA(appData.renderer, x - 40, y + 40, x - 40, y + 10, 4, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex - 20, usey + 20, usex - 5, usey + 20, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex - 20, usey + 20, usex - 20, usey + 5, pink.r, pink.g, pink.b, 255); planeColor = lerpColor(pink, grey, (now - p->seen) / (float) DISPLAY_ACTIVE); } else { planeColor = lerpColor(green, grey, (now - p->seen) / (float) DISPLAY_ACTIVE); @@ -966,11 +1017,15 @@ void drawPlanes() { //lineRGBA(appData.renderer, usex, usey, p->x+(p->w/2), p->y, 200,200,200, SDL_ALPHA_OPAQUE); } + + if((p->cx - appData.touchx) * (p->cx - appData.touchx) + (p->cy - appData.touchy) * (p->cy - appData.touchy) < 900) { + selectedPlane = p; + } + if(p != selectedPlane) { + drawPlaneText(p); + } - drawPlaneText(p); - - } else { //drawPlane(x, y, planeColor); } @@ -980,6 +1035,7 @@ void drawPlanes() { p = p->next; } + drawSelectedPlaneText(selectedPlane); if(appData.touchx && appData.touchy) { diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index 38449cd..42f6cec 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -e35f478e482bb67eed7951d8c622b7fc5ad06aa7 \ No newline at end of file +4ae8e7876cd2e093957fa204a0d05b37b84446e9 \ No newline at end of file diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id index 54b83a0..720033d 100644 --- a/view1090.REMOVED.git-id +++ b/view1090.REMOVED.git-id @@ -1 +1 @@ -8796641d884a28c9d0b97396f099bd3333607849 \ No newline at end of file +edf88a35375fe1494f482826638f6a8879c9f1cb \ No newline at end of file From 78ca658fa1dafced243aa4acba3c47b7fa02133d Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 17 Feb 2020 23:17:19 -0800 Subject: [PATCH 62/65] fixed plane selection when over multiple within cutoff Former-commit-id: ed853a31458b7d59acef057524e57359754aa5fd [formerly 73ab51fc18ef6bde1ea8f93e6433af61cb41229c] [formerly 3427181832689a8a05aadd31046e7d4ebea050e5] Former-commit-id: f8a4bd5efa51e94ff8366c6660aea76a5fa6ecd5 Former-commit-id: cb7dff754c6a523b957f1386af544075d6001590 --- draw.c | 54 ++++++++++++++++++++++++++++++----------- draw.o.REMOVED.git-id | 2 +- view1090.REMOVED.git-id | 2 +- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/draw.c b/draw.c index 341d95f..c7e6803 100644 --- a/draw.c +++ b/draw.c @@ -925,16 +925,37 @@ void drawPlanes() { time_t now = time(NULL); SDL_Color planeColor; - //draw all trails first so they don't cover up planes and text + // draw all trails first so they don't cover up planes and text + // also find closest plane to selection point + + struct planeObj *selection = NULL; while(p) { if ((now - p->seen) < Modes.interactive_display_ttl) { drawTrail(p->oldLon, p->oldLat, p->oldHeading, p->oldSeen, p->oldIdx); } + if(selectedPlane == NULL) { + if((p->cx - appData.touchx) * (p->cx - appData.touchx) + (p->cy - appData.touchy) * (p->cy - appData.touchy) < 900) { + if(selection) { + if((p->cx - appData.touchx) * (p->cx - appData.touchx) + (p->cy - appData.touchy) * (p->cy - appData.touchy) < + (selection->cx - appData.touchx) * (selection->cx - appData.touchx) + (selection->cy - appData.touchy) * (selection->cy - appData.touchy)) { + selection = p; + } + } else { + selection = p; + } + } + } + p = p->next; } + if(selectedPlane == NULL) { + selectedPlane = selection; + } + + p = planes; while(p) { @@ -982,18 +1003,27 @@ void drawPlanes() { appData.mapMoved = 1; } - - lineRGBA(appData.renderer, usex - 20, usey - 20, usex - 5, usey - 20, pink.r, pink.g, pink.b, 255); - lineRGBA(appData.renderer, usex - 20, usey - 20, usex - 20, usey - 5, pink.r, pink.g, pink.b, 255); - lineRGBA(appData.renderer, usex + 20, usey - 20, usex + 5, usey - 20, pink.r, pink.g, pink.b, 255); - lineRGBA(appData.renderer, usex + 20, usey - 20, usex + 20, usey - 5, pink.r, pink.g, pink.b, 255); + float elapsed = mstime() - appData.touchDownTime; - lineRGBA(appData.renderer, usex + 20, usey + 20, usex + 5, usey + 20, pink.r, pink.g, pink.b, 255); - lineRGBA(appData.renderer, usex + 20, usey + 20, usex + 20, usey + 5, pink.r, pink.g, pink.b, 255); + int boxSize; + if(elapsed < 300) { + boxSize = (int)(20.0 * (1.0 - (1.0 - elapsed / 300.0) * cos(sqrt(elapsed)))); + } else { + boxSize = 20; + } + //rectangleRGBA(appData.renderer, usex - boxSize, usey - boxSize, usex + boxSize, usey + boxSize, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex - boxSize, usey - boxSize, usex - boxSize/2, usey - boxSize, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex - boxSize, usey - boxSize, usex - boxSize, usey - boxSize/2, pink.r, pink.g, pink.b, 255); - lineRGBA(appData.renderer, usex - 20, usey + 20, usex - 5, usey + 20, pink.r, pink.g, pink.b, 255); - lineRGBA(appData.renderer, usex - 20, usey + 20, usex - 20, usey + 5, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex + boxSize, usey - boxSize, usex + boxSize/2, usey - boxSize, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex + boxSize, usey - boxSize, usex + boxSize, usey - boxSize/2, pink.r, pink.g, pink.b, 255); + + lineRGBA(appData.renderer, usex + boxSize, usey + boxSize, usex + boxSize/2, usey + boxSize, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex + boxSize, usey + boxSize, usex + boxSize, usey + boxSize/2, pink.r, pink.g, pink.b, 255); + + lineRGBA(appData.renderer, usex - boxSize, usey + boxSize, usex - boxSize/2, usey + boxSize, pink.r, pink.g, pink.b, 255); + lineRGBA(appData.renderer, usex - boxSize, usey + boxSize, usex - boxSize, usey + boxSize/2, pink.r, pink.g, pink.b, 255); planeColor = lerpColor(pink, grey, (now - p->seen) / (float) DISPLAY_ACTIVE); } else { planeColor = lerpColor(green, grey, (now - p->seen) / (float) DISPLAY_ACTIVE); @@ -1017,10 +1047,6 @@ void drawPlanes() { //lineRGBA(appData.renderer, usex, usey, p->x+(p->w/2), p->y, 200,200,200, SDL_ALPHA_OPAQUE); } - - if((p->cx - appData.touchx) * (p->cx - appData.touchx) + (p->cy - appData.touchy) * (p->cy - appData.touchy) < 900) { - selectedPlane = p; - } if(p != selectedPlane) { drawPlaneText(p); diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index 42f6cec..fd64bce 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -4ae8e7876cd2e093957fa204a0d05b37b84446e9 \ No newline at end of file +f1227086156bca68b563a45527bb1442279dc1f5 \ No newline at end of file diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id index 720033d..710990e 100644 --- a/view1090.REMOVED.git-id +++ b/view1090.REMOVED.git-id @@ -1 +1 @@ -edf88a35375fe1494f482826638f6a8879c9f1cb \ No newline at end of file +cbbacac08ce30232fcad4a508249c7e61768effa \ No newline at end of file From 2e68afd84ce1a282b5c14247e1fed3902f2a93b4 Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 18 Feb 2020 15:37:41 -0800 Subject: [PATCH 63/65] removed threading holdovers from dump1090. started working on android build (not working yet). map drawing now resumes next frame if frame times out Former-commit-id: 8c281d95e55d2b260a70c9a9232d68ae5917d96b [formerly 9c5d89f2af4f235ccb5cd7b983443d63907ba6ad] [formerly 4271671e19b70a7333649bb93bff920d1fa1acd0] Former-commit-id: 77f53ebfdb727dd7cbc2550443e08504e4aa624b Former-commit-id: a2daaa44daa2d42eb36f4e93f92e2f4db4000bbf --- Android.mk | 39 ++ Application.mk | 3 + Makefile | 6 +- draw.c | 42 +- draw.o.REMOVED.git-id | 2 +- dump1090.c | 904 ------------------------ font.o | Bin 37800 -> 37856 bytes init.c | 2 + init.o | Bin 48344 -> 48464 bytes input.o.REMOVED.git-id | 2 +- interactive.c | 103 ++- interactive.o | Bin 46136 -> 44376 bytes list.o | Bin 48296 -> 48344 bytes monokai.o | Bin 27792 -> 27848 bytes planeObj.o | Bin 44336 -> 44392 bytes pthreads/pthread.h | 1368 ------------------------------------- pthreads/sched.h | 183 ----- pthreads/semaphore.h | 169 ----- status.o.REMOVED.git-id | 2 +- structs.h | 1 + view1090.REMOVED.git-id | 2 +- view1090.c | 6 +- view1090.o.REMOVED.git-id | 2 +- 23 files changed, 161 insertions(+), 2675 deletions(-) create mode 100644 Android.mk create mode 100644 Application.mk delete mode 100644 dump1090.c delete mode 100644 pthreads/pthread.h delete mode 100644 pthreads/sched.h delete mode 100644 pthreads/semaphore.h diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..3987d7c --- /dev/null +++ b/Android.mk @@ -0,0 +1,39 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := main.out + +SDL_PATH := ~/Downloads/SDL + +LOCAL_C_INCLUDES := \ + $(LOCAL_PATH)/$(SDL_PATH)/include \ + $(LOCAL_PATH)/$(SDL_PATH) + +#LOCALCFLAGS= + +LOCAL_SRC_FILES := \ + $(SDL_PATH)/src/main/android/SDL_android_main.cpp \ + allstates.c \ + input.c \ + mapdata.c \ + monokai.c \ + planeObj.c \ + anet.c \ + font.c \ + interactive.c \ + mode_ac.c \ + net_io.c \ + status.c \ + draw.c \ + init.c \ + list.c \ + mode_s.c \ + parula.c \ + view1090.c + +LOCAL_SHARED_LIBRARIES := SDL2 SDL2_gfx SDL2_ttf + +LOCAL_LDLIBS := -lGLESv1_CM #-lstdc++ + +include $(BUILD_EXECUTABLE) \ No newline at end of file diff --git a/Application.mk b/Application.mk new file mode 100644 index 0000000..0f73767 --- /dev/null +++ b/Application.mk @@ -0,0 +1,3 @@ +APP_ABI := arm64-v8a +APP_PLATFORM := android-29 +APP_BUILD_SCRIPT := Android.mk \ No newline at end of file diff --git a/Makefile b/Makefile index 21e5a7e..cb47954 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # When building a package or installing otherwise in the system, make # sure that the variable PREFIX is defined, e.g. make PREFIX=/usr/local # -PROGNAME=dump1090 +PROGNAME=view1090 ifdef PREFIX BINDIR=$(PREFIX)/bin @@ -10,8 +10,8 @@ SHAREDIR=$(PREFIX)/share/$(PROGNAME) EXTRACFLAGS=-DHTMLPATH=\"$(SHAREDIR)\" endif -CFLAGS=-O2 -g -Wall -W `pkg-config --cflags librtlsdr` -LIBS=`pkg-config --libs librtlsdr` -lpthread -lm -lSDL2 -lSDL2_ttf -lSDL2_gfx +CFLAGS=-O2 -g -Wall -W +LIBS=-lm -lSDL2 -lSDL2_ttf -lSDL2_gfx CC=gcc all: view1090 diff --git a/draw.c b/draw.c index c7e6803..5c4f38f 100644 --- a/draw.c +++ b/draw.c @@ -343,6 +343,9 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee //tick marks + age = 1.0 - (double) 4.0 * (now - oldSeen[currentIdx]) / TRAIL_TTL; + colorVal = (uint8_t)floor(255.0 * age); + double vec[3]; vec[0] = sin(oldHeading[currentIdx] * M_PI / 180); vec[1] = -cos(oldHeading[currentIdx] * M_PI / 180); @@ -427,6 +430,19 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou return; } + if(appData.mapContinue && appData.mapContinue != tree) { + return; + } + + if(appData.mapContinue && appData.mapContinue == tree) { + appData.mapContinue = NULL; + } + + if(mstime() - appData.lastFrameTime > FRAMETIME) { + appData.mapContinue = tree; + return; + } + if (tree->lat_min > screen_lat_max || screen_lat_min > tree->lat_max) { return; } @@ -438,8 +454,14 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou drawPolys(tree->nw, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); drawPolys(tree->sw, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); drawPolys(tree->ne, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + + //if we didn't make it to the last child then need to set mapContinue to this node to make sure all children get drawn next time + if(appData.mapContinue) { + appData.mapContinue = tree; + } + drawPolys(tree->se, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); - + double dx, dy; // if(!(tree->lat_min > screen_lat_min && // tree->lat_max < screen_lat_max && @@ -581,7 +603,11 @@ void drawGeography() { latLonFromScreenCoords(&screen_lat_min, &screen_lon_min, 0, appData.screen_height * -0.2); latLonFromScreenCoords(&screen_lat_max, &screen_lon_max, appData.screen_width, appData.screen_height * 1.2); - drawPolys(&root, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + if(appData.mapContinue) { + drawPolys(appData.mapContinue, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + } else { + drawPolys(&root, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); + } } void drawSignalMarks(struct planeObj *p, int x, int y) { @@ -935,7 +961,7 @@ void drawPlanes() { drawTrail(p->oldLon, p->oldLat, p->oldHeading, p->oldSeen, p->oldIdx); } - if(selectedPlane == NULL) { + if(selectedPlane == NULL && appData.touchx && appData.touchy) { if((p->cx - appData.touchx) * (p->cx - appData.touchx) + (p->cy - appData.touchy) * (p->cy - appData.touchy) < 900) { if(selection) { if((p->cx - appData.touchx) * (p->cx - appData.touchx) + (p->cy - appData.touchy) * (p->cy - appData.touchy) < @@ -1089,12 +1115,16 @@ void draw() { updateStatus(); - if(appData.mapMoved) { + if(appData.mapMoved || appData.mapContinue) { SDL_SetRenderTarget(appData.renderer, appData.mapTexture); - SDL_SetRenderDrawColor(appData.renderer, 0, 0, 0, 0); - SDL_RenderClear(appData.renderer); + + if(appData.mapContinue == NULL) { + SDL_SetRenderDrawColor(appData.renderer, 0, 0, 0, 0); + SDL_RenderClear(appData.renderer); + } drawGeography(); + drawScaleBars(); SDL_SetRenderTarget(appData.renderer, NULL ); diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index fd64bce..d5e9144 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -f1227086156bca68b563a45527bb1442279dc1f5 \ No newline at end of file +4019e6c1da59af5e54909b8625f116916ed7b2de \ No newline at end of file diff --git a/dump1090.c b/dump1090.c deleted file mode 100644 index 60882fc..0000000 --- a/dump1090.c +++ /dev/null @@ -1,904 +0,0 @@ -// dump1090, a Mode S messages decoder for RTLSDR devices. -// -// Copyright (C) 2012 by Salvatore Sanfilippo -// -// 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 "dump1090.h" -// -// ============================= Utility functions ========================== -// -void sigintHandler(int dummy) { - MODES_NOTUSED(dummy); - signal(SIGINT, SIG_DFL); // reset signal handler - bit extra safety - Modes.exit = 1; // Signal to threads that we are done -} -// -// =============================== Terminal handling ======================== -// -#ifndef _WIN32 -// Get the number of rows after the terminal changes size. -int getTermRows() { - struct winsize w; - ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); - return (w.ws_row); -} - -// Handle resizing terminal -void sigWinchCallback() { - signal(SIGWINCH, SIG_IGN); - Modes.interactive_rows = getTermRows(); - interactiveShowData(); - signal(SIGWINCH, sigWinchCallback); -} -#else -int getTermRows() { return MODES_INTERACTIVE_ROWS;} -#endif -// -// =============================== Initialization =========================== -// -void modesInitConfig(void) { - // Default everything to zero/NULL - memset(&Modes, 0, sizeof(Modes)); - - // Now initialise things that should not be 0/NULL to their defaults - Modes.gain = MODES_MAX_GAIN; - Modes.freq = MODES_DEFAULT_FREQ; - Modes.ppm_error = MODES_DEFAULT_PPM; - Modes.check_crc = 1; - Modes.net_heartbeat_rate = MODES_NET_HEARTBEAT_RATE; - Modes.net_output_sbs_port = MODES_NET_OUTPUT_SBS_PORT; - Modes.net_output_raw_port = MODES_NET_OUTPUT_RAW_PORT; - Modes.net_input_raw_port = MODES_NET_INPUT_RAW_PORT; - Modes.net_output_beast_port = MODES_NET_OUTPUT_BEAST_PORT; - Modes.net_input_beast_port = MODES_NET_INPUT_BEAST_PORT; - Modes.net_http_port = MODES_NET_HTTP_PORT; - Modes.interactive_rows = getTermRows(); - 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; -} -// -//========================================================================= -// -void modesInit(void) { - int i, q; - - pthread_mutex_init(&Modes.pDF_mutex,NULL); - pthread_mutex_init(&Modes.data_mutex,NULL); - pthread_cond_init(&Modes.data_cond,NULL); - - // Allocate the various buffers used by Modes - if ( ((Modes.icao_cache = (uint32_t *) malloc(sizeof(uint32_t) * MODES_ICAO_CACHE_LEN * 2) ) == NULL) || - ((Modes.pFileData = (uint16_t *) malloc(MODES_ASYNC_BUF_SIZE) ) == NULL) || - ((Modes.magnitude = (uint16_t *) malloc(MODES_ASYNC_BUF_SIZE+MODES_PREAMBLE_SIZE+MODES_LONG_MSG_SIZE) ) == NULL) || - ((Modes.maglut = (uint16_t *) malloc(sizeof(uint16_t) * 256 * 256) ) == NULL) || - ((Modes.beastOut = (char *) malloc(MODES_RAWOUT_BUF_SIZE) ) == NULL) || - ((Modes.rawOut = (char *) malloc(MODES_RAWOUT_BUF_SIZE) ) == NULL) ) - { - 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); - memset(Modes.pFileData,127, MODES_ASYNC_BUF_SIZE); - memset(Modes.magnitude, 0, MODES_ASYNC_BUF_SIZE+MODES_PREAMBLE_SIZE+MODES_LONG_MSG_SIZE); - - // 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; - } - - // Limit the maximum requested raw output size to less than one Ethernet Block - if (Modes.net_output_raw_size > (MODES_RAWOUT_BUF_FLUSH)) - {Modes.net_output_raw_size = MODES_RAWOUT_BUF_FLUSH;} - if (Modes.net_output_raw_rate > (MODES_RAWOUT_BUF_RATE)) - {Modes.net_output_raw_rate = MODES_RAWOUT_BUF_RATE;} - if (Modes.net_sndbuf_size > (MODES_NET_SNDBUF_MAX)) - {Modes.net_sndbuf_size = MODES_NET_SNDBUF_MAX;} - - // Initialise the Block Timers to something half sensible - ftime(&Modes.stSystemTimeBlk); - for (i = 0; i < MODES_ASYNC_BUF_NUMBER; i++) - {Modes.stSystemTimeRTL[i] = Modes.stSystemTimeBlk;} - - // Each I and Q value varies from 0 to 255, which represents a range from -1 to +1. To get from the - // unsigned (0-255) range you therefore subtract 127 (or 128 or 127.5) from each I and Q, giving you - // a range from -127 to +128 (or -128 to +127, or -127.5 to +127.5).. - // - // To decode the AM signal, you need the magnitude of the waveform, which is given by sqrt((I^2)+(Q^2)) - // The most this could be is if I&Q are both 128 (or 127 or 127.5), so you could end up with a magnitude - // of 181.019 (or 179.605, or 180.312) - // - // However, in reality the magnitude of the signal should never exceed the range -1 to +1, because the - // values are I = rCos(w) and Q = rSin(w). Therefore the integer computed magnitude should (can?) never - // exceed 128 (or 127, or 127.5 or whatever) - // - // If we scale up the results so that they range from 0 to 65535 (16 bits) then we need to multiply - // by 511.99, (or 516.02 or 514). antirez's original code multiplies by 360, presumably because he's - // assuming the maximim calculated amplitude is 181.019, and (181.019 * 360) = 65166. - // - // So lets see if we can improve things by subtracting 127.5, Well in integer arithmatic we can't - // subtract half, so, we'll double everything up and subtract one, and then compensate for the doubling - // in the multiplier at the end. - // - // If we do this we can never have I or Q equal to 0 - they can only be as small as +/- 1. - // This gives us a minimum magnitude of root 2 (0.707), so the dynamic range becomes (1.414-255). This - // also affects our scaling value, which is now 65535/(255 - 1.414), or 258.433254 - // - // The sums then become mag = 258.433254 * (sqrt((I*2-255)^2 + (Q*2-255)^2) - 1.414) - // or mag = (258.433254 * sqrt((I*2-255)^2 + (Q*2-255)^2)) - 365.4798 - // - // We also need to clip mag just incaes any rogue I/Q values somehow do have a magnitude greater than 255. - // - - for (i = 0; i <= 255; i++) { - for (q = 0; q <= 255; q++) { - int mag, mag_i, mag_q; - - mag_i = (i * 2) - 255; - mag_q = (q * 2) - 255; - - mag = (int) round((sqrt((mag_i*mag_i)+(mag_q*mag_q)) * 258.433254) - 365.4798); - - Modes.maglut[(i*256)+q] = (uint16_t) ((mag < 65535) ? mag : 65535); - } - } - - // Prepare error correction tables - modesInitErrorInfo(); -} -// -// =============================== RTLSDR handling ========================== -// -void modesInitRTLSDR(void) { - int j; - int device_count; - char vendor[256], product[256], serial[256]; - - device_count = rtlsdr_get_device_count(); - if (!device_count) { - fprintf(stderr, "No supported RTLSDR devices found.\n"); - exit(1); - } - - fprintf(stderr, "Found %d device(s):\n", device_count); - for (j = 0; j < device_count; j++) { - rtlsdr_get_device_usb_strings(j, vendor, product, serial); - fprintf(stderr, "%d: %s, %s, SN: %s %s\n", j, vendor, product, serial, - (j == Modes.dev_index) ? "(currently selected)" : ""); - } - - if (rtlsdr_open(&Modes.dev, Modes.dev_index) < 0) { - fprintf(stderr, "Error opening the RTLSDR device: %s\n", - strerror(errno)); - exit(1); - } - - // Set gain, frequency, sample rate, and reset the device - rtlsdr_set_tuner_gain_mode(Modes.dev, - (Modes.gain == MODES_AUTO_GAIN) ? 0 : 1); - if (Modes.gain != MODES_AUTO_GAIN) { - if (Modes.gain == MODES_MAX_GAIN) { - // Find the maximum gain available - int numgains; - int gains[100]; - - numgains = rtlsdr_get_tuner_gains(Modes.dev, gains); - Modes.gain = gains[numgains-1]; - fprintf(stderr, "Max available gain is: %.2f\n", Modes.gain/10.0); - } - rtlsdr_set_tuner_gain(Modes.dev, Modes.gain); - fprintf(stderr, "Setting gain to: %.2f\n", Modes.gain/10.0); - } else { - fprintf(stderr, "Using automatic gain control.\n"); - } - rtlsdr_set_freq_correction(Modes.dev, Modes.ppm_error); - if (Modes.enable_agc) rtlsdr_set_agc_mode(Modes.dev, 1); - rtlsdr_set_center_freq(Modes.dev, Modes.freq); - rtlsdr_set_sample_rate(Modes.dev, MODES_DEFAULT_RATE); - rtlsdr_reset_buffer(Modes.dev); - fprintf(stderr, "Gain reported by device: %.2f\n", - rtlsdr_get_tuner_gain(Modes.dev)/10.0); -} -// -//========================================================================= -// -// We use a thread reading data in background, while the main thread -// handles decoding and visualization of data to the user. -// -// The reading thread calls the RTLSDR API to read data asynchronously, and -// uses a callback to populate the data buffer. -// -// A Mutex is used to avoid races with the decoding thread. -// -void rtlsdrCallback(unsigned char *buf, uint32_t len, void *ctx) { - - MODES_NOTUSED(ctx); - - // Lock the data buffer variables before accessing them - pthread_mutex_lock(&Modes.data_mutex); - - Modes.iDataIn &= (MODES_ASYNC_BUF_NUMBER-1); // Just incase!!! - - // Get the system time for this block - ftime(&Modes.stSystemTimeRTL[Modes.iDataIn]); - - if (len > MODES_ASYNC_BUF_SIZE) {len = MODES_ASYNC_BUF_SIZE;} - - // Queue the new data - Modes.pData[Modes.iDataIn] = (uint16_t *) buf; - Modes.iDataIn = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataIn + 1); - Modes.iDataReady = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataIn - Modes.iDataOut); - - if (Modes.iDataReady == 0) { - // Ooooops. We've just received the MODES_ASYNC_BUF_NUMBER'th outstanding buffer - // This means that RTLSDR is currently overwriting the MODES_ASYNC_BUF_NUMBER+1 - // buffer, but we havent yet processed it, so we're going to lose it. There - // isn't much we can do to recover the lost data, but we can correct things to - // avoid any additional problems. - Modes.iDataOut = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataOut+1); - Modes.iDataReady = (MODES_ASYNC_BUF_NUMBER-1); - Modes.iDataLost++; - } - - // Signal to the other thread that new data is ready, and unlock - pthread_cond_signal(&Modes.data_cond); - pthread_mutex_unlock(&Modes.data_mutex); -} -// -//========================================================================= -// -// This is used when --ifile is specified in order to read data from file -// instead of using an RTLSDR device -// -void readDataFromFile(void) { - pthread_mutex_lock(&Modes.data_mutex); - while(Modes.exit == 0) { - ssize_t nread, toread; - unsigned char *p; - - if (Modes.iDataReady) { - pthread_cond_wait(&Modes.data_cond, &Modes.data_mutex); - continue; - } - - if (Modes.interactive) { - // When --ifile and --interactive are used together, slow down - // playing at the natural rate of the RTLSDR received. - pthread_mutex_unlock(&Modes.data_mutex); - usleep(64000); - pthread_mutex_lock(&Modes.data_mutex); - } - - toread = MODES_ASYNC_BUF_SIZE; - p = (unsigned char *) Modes.pFileData; - while(toread) { - nread = read(Modes.fd, p, toread); - if (nread <= 0) { - Modes.exit = 1; // Signal the other threads to exit. - break; - } - p += nread; - toread -= nread; - } - if (toread) { - // Not enough data on file to fill the buffer? Pad with no signal. - memset(p,127,toread); - } - - Modes.iDataIn &= (MODES_ASYNC_BUF_NUMBER-1); // Just incase!!! - - // Get the system time for this block - ftime(&Modes.stSystemTimeRTL[Modes.iDataIn]); - - // Queue the new data - Modes.pData[Modes.iDataIn] = Modes.pFileData; - Modes.iDataIn = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataIn + 1); - Modes.iDataReady = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataIn - Modes.iDataOut); - - // Signal to the other thread that new data is ready - pthread_cond_signal(&Modes.data_cond); - } -} -// -//========================================================================= -// -// We read data using a thread, so the main thread only handles decoding -// without caring about data acquisition -// -void *readerThreadEntryPoint(void *arg) { - MODES_NOTUSED(arg); - - if (Modes.filename == NULL) { - rtlsdr_read_async(Modes.dev, rtlsdrCallback, NULL, - MODES_ASYNC_BUF_NUMBER, - MODES_ASYNC_BUF_SIZE); - } else { - readDataFromFile(); - } - // Signal to the other thread that new data is ready - dummy really so threads don't mutually lock - pthread_cond_signal(&Modes.data_cond); - pthread_mutex_unlock(&Modes.data_mutex); -#ifndef _WIN32 - pthread_exit(NULL); -#else - return NULL; -#endif -} -// -// ============================== Snip mode ================================= -// -// Get raw IQ samples and filter everything is < than the specified level -// for more than 256 samples in order to reduce example file size -// -void snipMode(int level) { - int i, q; - uint64_t c = 0; - - while ((i = getchar()) != EOF && (q = getchar()) != EOF) { - if (abs(i-127) < level && abs(q-127) < level) { - c++; - if (c > MODES_PREAMBLE_SIZE) continue; - } else { - c = 0; - } - putchar(i); - putchar(q); - } -} -// -// ================================ Main ==================================== -// -void showHelp(void) { - printf( -"-----------------------------------------------------------------------------\n" -"| dump1090 ModeS Receiver Ver : " MODES_DUMP1090_VERSION " |\n" -"-----------------------------------------------------------------------------\n" -"--device-index Select RTL device (default: 0)\n" -"--gain Set gain (default: max gain. Use -10 for auto-gain)\n" -"--enable-agc Enable the Automatic Gain Control (default: off)\n" -"--freq Set frequency (default: 1090 Mhz)\n" -"--ifile Read data from file (use '-' for stdin)\n" -"--interactive Interactive mode refreshing data on screen\n" -"--interactive-rows Max number of rows in interactive mode (default: 15)\n" -"--interactive-ttl Remove from list if idle for (default: 60)\n" -"--interactive-rtl1090 Display flight table in RTL1090 format\n" -"--raw Show only messages hex values\n" -"--net Enable networking\n" -"--modeac Enable decoding of SSR Modes 3/A & 3/C\n" -"--net-beast TCP raw output in Beast binary format\n" -"--net-only Enable just networking, no RTL device or file used\n" -"--net-bind-address IP address to bind to (default: Any; Use 127.0.0.1 for private)\n" -"--net-http-port HTTP server port (default: 8080)\n" -"--net-ri-port TCP raw input listen port (default: 30001)\n" -"--net-ro-port TCP raw output listen port (default: 30002)\n" -"--net-sbs-port TCP BaseStation output listen port (default: 30003)\n" -"--net-bi-port TCP Beast input listen port (default: 30004)\n" -"--net-bo-port TCP Beast output listen port (default: 30005)\n" -"--net-ro-size TCP raw output minimum size (default: 0)\n" -"--net-ro-rate TCP raw output memory flush rate (default: 0)\n" -"--net-heartbeat TCP heartbeat rate in seconds (default: 60 sec; 0 to disable)\n" -"--net-buffer TCP buffer size 64Kb * (2^n) (default: n=0, 64Kb)\n" -"--lat Reference/receiver latitude for surface posn (opt)\n" -"--lon Reference/receiver longitude for surface posn (opt)\n" -"--fix Enable single-bits error correction using CRC\n" -"--no-fix Disable single-bits error correction using CRC\n" -"--no-crc-check Disable messages with broken CRC (discouraged)\n" -"--phase-enhance Enable phase enhancement\n" -"--aggressive More CPU for more messages (two bits fixes, ...)\n" -"--mlat display raw messages in Beast ascii mode\n" -"--stats With --ifile print stats at exit. No other output\n" -"--stats-every Show and reset stats every seconds\n" -"--onlyaddr Show only ICAO addresses (testing purposes)\n" -"--metric Use metric units (meters, km/h, ...)\n" -"--snip Strip IQ file removing samples < level\n" -"--debug Debug mode (verbose), see README for details\n" -"--quiet Disable output to stdout. Use for daemon applications\n" -"--ppm Set receiver error in parts per million (default 0)\n" -"--help Show this help\n" -"\n" -"Debug mode flags: d = Log frames decoded with errors\n" -" D = Log frames decoded with zero errors\n" -" c = Log frames with bad CRC\n" -" C = Log frames with good CRC\n" -" p = Log frames with bad preamble\n" -" n = Log network debugging info\n" -" j = Log frames to frames.js, loadable by debug.html\n" - ); -} - -#ifdef _WIN32 -void showCopyright(void) { - uint64_t llTime = time(NULL) + 1; - - printf( -"-----------------------------------------------------------------------------\n" -"| dump1090 ModeS Receiver Ver : " MODES_DUMP1090_VERSION " |\n" -"-----------------------------------------------------------------------------\n" -"\n" -" Copyright (C) 2012 by Salvatore Sanfilippo \n" -" Copyright (C) 2014 by Malcolm Robb \n" -"\n" -" All rights reserved.\n" -"\n" -" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n" -" ""AS IS"" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n" -" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n" -" A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n" -" HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n" -" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n" -" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n" -" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n" -" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n" -" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n" -" OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n" -"\n" -" For further details refer to \n" -"\n" - ); - - // delay for 1 second to give the user a chance to read the copyright - while (llTime >= time(NULL)) {} -} -#endif - - -static void display_stats(void) { - int j; - time_t now = time(NULL); - - printf("\n\n"); - if (Modes.interactive) - interactiveShowData(); - - printf("Statistics as at %s", ctime(&now)); - - printf("%d sample blocks processed\n", Modes.stat_blocks_processed); - printf("%d sample blocks dropped\n", Modes.stat_blocks_dropped); - - printf("%d ModeA/C detected\n", Modes.stat_ModeAC); - printf("%d valid Mode-S preambles\n", Modes.stat_valid_preamble); - printf("%d DF-?? fields corrected for length\n", Modes.stat_DF_Len_Corrected); - printf("%d DF-?? fields corrected for type\n", Modes.stat_DF_Type_Corrected); - printf("%d demodulated with 0 errors\n", Modes.stat_demodulated0); - printf("%d demodulated with 1 error\n", Modes.stat_demodulated1); - printf("%d demodulated with 2 errors\n", Modes.stat_demodulated2); - printf("%d demodulated with > 2 errors\n", Modes.stat_demodulated3); - printf("%d with good crc\n", Modes.stat_goodcrc); - printf("%d with bad crc\n", Modes.stat_badcrc); - printf("%d errors corrected\n", Modes.stat_fixed); - - for (j = 0; j < MODES_MAX_BITERRORS; j++) { - printf(" %d with %d bit %s\n", Modes.stat_bit_fix[j], j+1, (j==0)?"error":"errors"); - } - - if (Modes.phase_enhance) { - printf("%d phase enhancement attempts\n", Modes.stat_out_of_phase); - printf("%d phase enhanced demodulated with 0 errors\n", Modes.stat_ph_demodulated0); - printf("%d phase enhanced demodulated with 1 error\n", Modes.stat_ph_demodulated1); - printf("%d phase enhanced demodulated with 2 errors\n", Modes.stat_ph_demodulated2); - printf("%d phase enhanced demodulated with > 2 errors\n", Modes.stat_ph_demodulated3); - printf("%d phase enhanced with good crc\n", Modes.stat_ph_goodcrc); - printf("%d phase enhanced with bad crc\n", Modes.stat_ph_badcrc); - printf("%d phase enhanced errors corrected\n", Modes.stat_ph_fixed); - - for (j = 0; j < MODES_MAX_BITERRORS; j++) { - printf(" %d with %d bit %s\n", Modes.stat_ph_bit_fix[j], j+1, (j==0)?"error":"errors"); - } - } - - printf("%d total usable messages\n", Modes.stat_goodcrc + Modes.stat_ph_goodcrc + Modes.stat_fixed + Modes.stat_ph_fixed); - fflush(stdout); - - Modes.stat_blocks_processed = - Modes.stat_blocks_dropped = 0; - - Modes.stat_ModeAC = - Modes.stat_valid_preamble = - Modes.stat_DF_Len_Corrected = - Modes.stat_DF_Type_Corrected = - Modes.stat_demodulated0 = - Modes.stat_demodulated1 = - Modes.stat_demodulated2 = - Modes.stat_demodulated3 = - Modes.stat_goodcrc = - Modes.stat_badcrc = - Modes.stat_fixed = 0; - - Modes.stat_out_of_phase = - Modes.stat_ph_demodulated0 = - Modes.stat_ph_demodulated1 = - Modes.stat_ph_demodulated2 = - Modes.stat_ph_demodulated3 = - Modes.stat_ph_goodcrc = - Modes.stat_ph_badcrc = - Modes.stat_ph_fixed = 0; - - for (j = 0; j < MODES_MAX_BITERRORS; j++) { - Modes.stat_ph_bit_fix[j] = 0; - Modes.stat_bit_fix[j] = 0; - } -} - - -// -//========================================================================= -// -// This function is called a few times every second by main in order to -// perform tasks we need to do continuously, like accepting new clients -// from the net, refreshing the screen in interactive mode, and so forth -// -void backgroundTasks(void) { - static time_t next_stats; - - if (Modes.net) { - modesReadFromClients(); - } - - // If Modes.aircrafts is not NULL, remove any stale aircraft - if (Modes.aircrafts) { - interactiveRemoveStaleAircrafts(); - } - - // Refresh screen when in interactive mode - if (Modes.interactive) { - interactiveShowData(); - } - - if (Modes.stats > 0) { - time_t now = time(NULL); - if (now > next_stats) { - if (next_stats != 0) - display_stats(); - next_stats = now + Modes.stats; - } - } -} -// -//========================================================================= -// -int verbose_device_search(char *s) -{ - int i, device_count, device, offset; - char *s2; - char vendor[256], product[256], serial[256]; - device_count = rtlsdr_get_device_count(); - if (!device_count) { - fprintf(stderr, "No supported devices found.\n"); - return -1; - } - fprintf(stderr, "Found %d device(s):\n", device_count); - for (i = 0; i < device_count; i++) { - rtlsdr_get_device_usb_strings(i, vendor, product, serial); - fprintf(stderr, " %d: %s, %s, SN: %s\n", i, vendor, product, serial); - } - fprintf(stderr, "\n"); - /* does string look like raw id number */ - device = (int)strtol(s, &s2, 0); - if (s2[0] == '\0' && device >= 0 && device < device_count) { - fprintf(stderr, "Using device %d: %s\n", - device, rtlsdr_get_device_name((uint32_t)device)); - return device; - } - /* does string exact match a serial */ - for (i = 0; i < device_count; i++) { - rtlsdr_get_device_usb_strings(i, vendor, product, serial); - if (strcmp(s, serial) != 0) { - continue;} - device = i; - fprintf(stderr, "Using device %d: %s\n", - device, rtlsdr_get_device_name((uint32_t)device)); - return device; - } - /* does string prefix match a serial */ - for (i = 0; i < device_count; i++) { - rtlsdr_get_device_usb_strings(i, vendor, product, serial); - if (strncmp(s, serial, strlen(s)) != 0) { - continue;} - device = i; - fprintf(stderr, "Using device %d: %s\n", - device, rtlsdr_get_device_name((uint32_t)device)); - return device; - } - /* does string suffix match a serial */ - for (i = 0; i < device_count; i++) { - rtlsdr_get_device_usb_strings(i, vendor, product, serial); - offset = strlen(serial) - strlen(s); - if (offset < 0) { - continue;} - if (strncmp(s, serial+offset, strlen(s)) != 0) { - continue;} - device = i; - fprintf(stderr, "Using device %d: %s\n", - device, rtlsdr_get_device_name((uint32_t)device)); - return device; - } - fprintf(stderr, "No matching devices found.\n"); - return -1; -} -// -//========================================================================= -// -int main(int argc, char **argv) { - int j; - - // Set sane defaults - modesInitConfig(); - 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],"--device-index") && more) { - Modes.dev_index = verbose_device_search(argv[++j]); - } else if (!strcmp(argv[j],"--gain") && more) { - Modes.gain = (int) (atof(argv[++j])*10); // Gain is in tens of DBs - } else if (!strcmp(argv[j],"--enable-agc")) { - Modes.enable_agc++; - } else if (!strcmp(argv[j],"--freq") && more) { - Modes.freq = (int) strtoll(argv[++j],NULL,10); - } else if (!strcmp(argv[j],"--ifile") && more) { - Modes.filename = strdup(argv[++j]); - } else if (!strcmp(argv[j],"--fix")) { - Modes.nfix_crc = 1; - } else if (!strcmp(argv[j],"--no-fix")) { - Modes.nfix_crc = 0; - } else if (!strcmp(argv[j],"--no-crc-check")) { - Modes.check_crc = 0; - } else if (!strcmp(argv[j],"--phase-enhance")) { - Modes.phase_enhance = 1; - } else if (!strcmp(argv[j],"--raw")) { - Modes.raw = 1; - } else if (!strcmp(argv[j],"--net")) { - Modes.net = 1; - } else if (!strcmp(argv[j],"--modeac")) { - Modes.mode_ac = 1; - } else if (!strcmp(argv[j],"--net-beast")) { - Modes.beast = 1; - } else if (!strcmp(argv[j],"--net-only")) { - Modes.net = 1; - Modes.net_only = 1; - } else if (!strcmp(argv[j],"--net-heartbeat") && more) { - Modes.net_heartbeat_rate = atoi(argv[++j]) * 15; - } else if (!strcmp(argv[j],"--net-ro-size") && more) { - Modes.net_output_raw_size = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--net-ro-rate") && more) { - Modes.net_output_raw_rate = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--net-ro-port") && more) { - if (Modes.beast) // Required for legacy backward compatibility - {Modes.net_output_beast_port = atoi(argv[++j]);;} - else - {Modes.net_output_raw_port = atoi(argv[++j]);} - } else if (!strcmp(argv[j],"--net-ri-port") && more) { - Modes.net_input_raw_port = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--net-bo-port") && more) { - Modes.net_output_beast_port = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--net-bi-port") && more) { - Modes.net_input_beast_port = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--net-bind-address") && more) { - Modes.net_bind_address = strdup(argv[++j]); - } else if (!strcmp(argv[j],"--net-http-port") && more) { - Modes.net_http_port = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--net-sbs-port") && more) { - Modes.net_output_sbs_port = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--net-buffer") && more) { - Modes.net_sndbuf_size = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--onlyaddr")) { - Modes.onlyaddr = 1; - } else if (!strcmp(argv[j],"--metric")) { - Modes.metric = 1; - } else if (!strcmp(argv[j],"--aggressive")) { - Modes.nfix_crc = MODES_MAX_BITERRORS; - } else if (!strcmp(argv[j],"--interactive")) { - Modes.interactive = 1; - } else if (!strcmp(argv[j],"--interactive-rows") && more) { - Modes.interactive_rows = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--interactive-ttl") && more) { - Modes.interactive_display_ttl = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--lat") && more) { - Modes.fUserLat = atof(argv[++j]); - } else if (!strcmp(argv[j],"--lon") && more) { - Modes.fUserLon = atof(argv[++j]); - } else if (!strcmp(argv[j],"--debug") && more) { - char *f = argv[++j]; - while(*f) { - switch(*f) { - case 'D': Modes.debug |= MODES_DEBUG_DEMOD; break; - case 'd': Modes.debug |= MODES_DEBUG_DEMODERR; break; - case 'C': Modes.debug |= MODES_DEBUG_GOODCRC; break; - case 'c': Modes.debug |= MODES_DEBUG_BADCRC; break; - case 'p': Modes.debug |= MODES_DEBUG_NOPREAMBLE; break; - case 'n': Modes.debug |= MODES_DEBUG_NET; break; - case 'j': Modes.debug |= MODES_DEBUG_JS; break; - default: - fprintf(stderr, "Unknown debugging flag: %c\n", *f); - exit(1); - break; - } - f++; - } - } else if (!strcmp(argv[j],"--stats")) { - Modes.stats = -1; - } else if (!strcmp(argv[j],"--stats-every") && more) { - Modes.stats = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--snip") && more) { - snipMode(atoi(argv[++j])); - exit(0); - } else if (!strcmp(argv[j],"--help")) { - showHelp(); - exit(0); - } else if (!strcmp(argv[j],"--ppm") && more) { - Modes.ppm_error = atoi(argv[++j]); - } else if (!strcmp(argv[j],"--quiet")) { - Modes.quiet = 1; - } else if (!strcmp(argv[j],"--mlat")) { - Modes.mlat = 1; - } else if (!strcmp(argv[j],"--interactive-rtl1090")) { - Modes.interactive = 1; - Modes.interactive_rtl1090 = 1; - } else { - fprintf(stderr, - "Unknown or not enough arguments for option '%s'.\n\n", - argv[j]); - showHelp(); - exit(1); - } - } - -#ifdef _WIN32 - // Try to comply with the Copyright license conditions for binary distribution - if (!Modes.quiet) {showCopyright();} -#endif - -#ifndef _WIN32 - // Setup for SIGWINCH for handling lines - if (Modes.interactive) {signal(SIGWINCH, sigWinchCallback);} -#endif - - // Initialization - modesInit(); - - if (Modes.net_only) { - fprintf(stderr,"Net-only mode, no RTL device or file open.\n"); - } else if (Modes.filename == NULL) { - modesInitRTLSDR(); - } else { - if (Modes.filename[0] == '-' && Modes.filename[1] == '\0') { - Modes.fd = STDIN_FILENO; - } else if ((Modes.fd = open(Modes.filename, -#ifdef _WIN32 - (O_RDONLY | O_BINARY) -#else - (O_RDONLY) -#endif - )) == -1) { - perror("Opening data file"); - exit(1); - } - } - if (Modes.net) modesInitNet(); - - // If the user specifies --net-only, just run in order to serve network - // clients without reading data from the RTL device - while (Modes.net_only) { - if (Modes.exit) exit(0); // If we exit net_only nothing further in main() - backgroundTasks(); - usleep(100000); - } - - // Create the thread that will read the data from the device. - pthread_create(&Modes.reader_thread, NULL, readerThreadEntryPoint, NULL); - pthread_mutex_lock(&Modes.data_mutex); - - while (Modes.exit == 0) { - - if (Modes.iDataReady == 0) { - pthread_cond_wait(&Modes.data_cond,&Modes.data_mutex); // This unlocks Modes.data_mutex, and waits for Modes.data_cond - continue; // Once (Modes.data_cond) occurs, it locks Modes.data_mutex - } - - // Modes.data_mutex is Locked, and (Modes.iDataReady != 0) - if (Modes.iDataReady) { // Check we have new data, just in case!! - - Modes.iDataOut &= (MODES_ASYNC_BUF_NUMBER-1); // Just incase - - // Translate the next lot of I/Q samples into Modes.magnitude - computeMagnitudeVector(Modes.pData[Modes.iDataOut]); - - Modes.stSystemTimeBlk = Modes.stSystemTimeRTL[Modes.iDataOut]; - - // Update the input buffer pointer queue - Modes.iDataOut = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataOut + 1); - Modes.iDataReady = (MODES_ASYNC_BUF_NUMBER-1) & (Modes.iDataIn - Modes.iDataOut); - - // If we lost some blocks, correct the timestamp - if (Modes.iDataLost) { - Modes.timestampBlk += (MODES_ASYNC_BUF_SAMPLES * 6 * Modes.iDataLost); - Modes.stat_blocks_dropped += Modes.iDataLost; - Modes.iDataLost = 0; - } - - // It's safe to release the lock now - pthread_cond_signal (&Modes.data_cond); - pthread_mutex_unlock(&Modes.data_mutex); - - // Process data after releasing the lock, so that the capturing - // thread can read data while we perform computationally expensive - // stuff at the same time. - detectModeS(Modes.magnitude, MODES_ASYNC_BUF_SAMPLES); - - // Update the timestamp ready for the next block - Modes.timestampBlk += (MODES_ASYNC_BUF_SAMPLES*6); - Modes.stat_blocks_processed++; - } else { - pthread_cond_signal (&Modes.data_cond); - pthread_mutex_unlock(&Modes.data_mutex); - } - - backgroundTasks(); - pthread_mutex_lock(&Modes.data_mutex); - } - - // If --stats were given, print statistics - if (Modes.stats) { - display_stats(); - } - - if (Modes.filename == NULL) { - rtlsdr_cancel_async(Modes.dev); // Cancel rtlsdr_read_async will cause data input thread to terminate cleanly - rtlsdr_close(Modes.dev); - } - pthread_cond_destroy(&Modes.data_cond); // Thread cleanup - pthread_mutex_destroy(&Modes.data_mutex); - pthread_join(Modes.reader_thread,NULL); // Wait on reader thread exit -#ifndef _WIN32 - pthread_exit(0); -#else - return (0); -#endif -} -// -//========================================================================= -// diff --git a/font.o b/font.o index 85b9bb72588953b123507690b920fa7da94c9384..801bef849bc4d5a670a3606163e7b25a806805dc 100644 GIT binary patch delta 4860 zcmZ`+4Nz3q6@F(yWEDXWxID}v7=Iu!Zq_)8nt*7g>l#x*0U?Sk{!mOo{*;A`@@I_V zAFQVpnc7664U$@suC;1910*%0?W7G!jia_1m`U4-Z8fxsQ(I$u?!NQvdK>QyXV3Y* zbI(2Z-1F{xoanL)by?byVW>By-eL*TechIiB7)C}kW6fdigjg1YFemOqanuRl0M$h z!`6@kJCtohfA5@ zmpu`hX7MjN>$jxF`_=Sw))z!$hlk2dsY&yo*k_gopd zb9QM`pJDikKlF|Ajw6F`5nmnU%sicsdPCv3LetWbQ zCQB*{La5qUXp~B9E@Rr1rLJ>$)Yea+H4iK49{&-Bz11^ zb+TgI;OnK%Ewn-UaIvfy$6sZUNE;*L!0GA7dzlDyt3E>w>OEG7Dh%4eAhb34OC)0g9&PM58inIA2a_KW= zJ>HIs5yxU5nO?{>iuZ0T_6yx6^Se&2-<03ixLr?3lj+3>>GA*RJ;gZf>_L7?ve$H* za}T*C%G_XryjtXV!uZj&&nP^F4*Cb=Xxft!g<#W3TB%adfFtYix%lKUCP&*WkB%QtV?w0Y}BU)w@= zsPER2svtP$D_Z6Zfm-Zd;e?$yvO>Uqw644gRX9v?9iGp&!*cvQ+X-HDId8tqD=b*cSjo@a`!&tQ14)f8wTEOer zz1r?r#EG6)JdN8;)A|&=0Ih5K^g9!cxIv>Hj{h?pUgLqIm|tMmulS!aP1~XPHn+fK^)#_hZ`7K?1Ufs@{4-_zCde9D_p^jl0t~| z-7RSVX!6y)+z!xzk)}9jZ}{Y$o1XbLONOr{M{kXjn)zCd9eUB~ zaY80$c?2EUCep*Pm*ns9uE!2P!IauUNXC}hE@(hUoq#NK)j6RQy>+e7ib=0{UJ-axzFwB-6miXc5k!mzvOmxD?X=jWSg*rCg7OuHBgUD+l4+M z(FoJ8xIT%!+glw$T&ZZj%FM+o7*AAi4_4OOtwsDaK9Amdp>I-rUXC(W+=2tdHZm*k z4L(6X-GU?a!gWZQJBd%=O$Fc0Q%@;)0bfTKFsnf{ysxnJoXJNDzKfsaPZd0vUZir| zRPc3N?mG(ZqL;oL7Gs?!9`xjk94MRA=hm=_7a;P5TCDZ|J-66Cbn8- zd2TI6?htyj!fs`D7iR1bF0aDgWcE-1E;rfEJ##bwmzgB;yZJ}hNzr-~Hka8m0l19j z6Wk<<+M$@;s9QUwk zr*K*68&nRHoz9;e;Q_d;=L)|UebooxGTIULx8X3YHC!mnC$u6d6v#tdRJ6*iUUZoo=nw=iqod;Q$uP1xBY=&PTkW1r%)jbC+bkHFgz z_6Ycal#XMHkDcdsJp%8+BAV;-%XiRAdY@muj{~Gr#Yhg~2+1o_I<6~mrkbzqN8t2q z?iKL4Uw(m2q<`s`|HfX@|0AVuXs_D>$-ayOPOyyDaZl?U>!mECYMFSsbuOGjXiJB0 zVMbfJC2k)!x23^%aeyEv-8a7lsfHrdz^XI4~s^^A09k j#=EfjU>cmjfrIJrAp)jDKW1RMHFUqR;3wE}VA6j94hY#L delta 4737 zcmaKv3s98T6@dSd&5F@P6z~;!_+X^UOB7gNi1@5l zSdOVRqf<$2gic%7u4C1jBBpI*($+RS(!~M@W z-?`_Wd++)GyWBiuYd>RaNr84>>Q0+&FwWm$dp|O`ON7qFhN#$_xpqwp3)iTLk@HC& zW6Gl!ksN2r5mHVv<#}-%OEzm_j+|go+{VfZmY116 zFBDP|#p5WLCfrg^3MPf-7xSccbA*XsdS<>8PYA z`JFUXJIUm2$Ulp8tQ`hjQnAQc&cSdyAE;bnrJys2)_*xt8-0;-lZO}2S~f5koxi*T}-meLs` zoiuHN>|nNigr)^~yBeM})I9kv$u=<;K_448ZzOq7Dv2|Vlg$Th0#4T_hj_@GihUwJ zaSut^BpcQ=-=P=%UIl#y^MtEZ%o9y%NP`obUQy@R+OIR#34NOC>;HrWDcLjH` zSx+<;5G0HMkBpQHNMQT_S-@T0;jSmQB$+Qn%WsfuQ_Y8_y-#7x-10T;Tha=_mXp-d zWk(H8m~)!`39%Vwc*>ksP8*Q-aC7BO51;I3tqHME;TH*q zC;2;P6@~f7!h5!kcT39E3B`gbsSnH!u~wyYaYVd`=>MER?irvbcy9V@!^vmA7Puo>J6dKep5 zI^o;sTPdIwdsjML&pJ$x3yS9hPH)d1+GFBHgLo7nE&|{O#=ni^CWwTas2VKPi zGBKyP89u`6#YJ$(pHb2u1SM!+*RTJWmlR`s@gEM`hfwN-Yv?LVOQ2v1eluOvB`IH_XDaa;N@eqUiyn z%%_!WCi=>SzJh6lLThoL+zD@@y+Y_$*k_XBa|5$0gzcL|Tv71_oWYz*H#~*jN+ccR*x<7sjS75R%J8D)!_jP<~Qz68lcT*Agad4AcZ`4hf zGQ~9(b87_jU|EeUxZ~8{#NHYzS>Bc7ivM)Kee(!_`F?#1Jyv3JtpLP~+B!IdzFIdG z^H8l5euAlWZkUVJb%GA;AjvlDqy9bA>z&YsIrT*_4m;}4Kn>=41bi3EJZ>mPpQjm` zFnenqB;kdvZfNquwqu~j^0v(wV=ls4XEpk^3y8+v?N0qXmus=&a~kbCgzdfqr|zhQ zP1v?W=p&NMFqakA@z}Sc+4VKQS7Z6>Wlgr0cQ8q@Z$R%(XZUWqj$~Vk13QJjTJgyX zHE9Lf8-!k`&>wQ`@4;-MEehSvhkOF7iMA{B7~P4ooy9hymle8=-_Ji_AJIQ6w1Btl z7Q!yka8IENIr4qQevWH5DaxGL+Mj-Tvs0U<*w1k#WhnLu{LOg5v`-zb-X>n~5@o;} zoDjX3yM$h@(7%p1r{9W$ME5Hc_^6L!a-+}%AC{Fm2i7KHZllO?DOCPil5MYIzs;NL zWxKovhVK}XUqc_w^=1H_B*Sp~6%No`Z!0kqWJ=VoDfYLx_&!$bU-7E{f!Vu7&X)?E z!!NJK3$)gIibsu7>{)z232fUf^dyB2@_|jpKB6-f+QDC`*Og<6~qtHj*Q|Z^9Y;t<(_(#rTHVzP7r_j%t z?m+uqp}(ro5T5CE%qDt{sdbhQ_|tL;tBHP~Q0r7a!M433=S~1MR>-gH*NS}#{~)*@ zU=KW}P=tL#AI0ZlWn!IE47!NME7UrPiC983RiV~Nq@$PU>;NkBY~jj#5qpT1D)jeE zH{jqt5z;8BaT2YVykF=(_O?#qZ-iy*#ayDFD>Rr-A{ZNqj-%hQvRPvtOjFTEG>xgX z{>^+6GjU+QfIRFwAfOQK2ZX*xi8J2}t9dZ{fCy=l6x&*(;Wex#@6!QsIVhXkBA`fki7`EA*|t}1bK>-v0*{R3>HvHeDW1N%t+)aY*`92W3TKOC;J zL73lj#0?Su<`~A7Vq0@G-fWHwZ_hP!EghjH4NhQ2OBOtXo|Y`z%|m#xB@>q85Sdai z!<$8$;GupQUhrmx&*1+*TM=5*;0k86X4$@&hkZG**wUI}yEhLnwq`;V4z*@M7iM4< U{R`p2tnl{^n-hMBJx9j>7a397ZU6uP diff --git a/init.c b/init.c index d740e1d..bb78170 100644 --- a/init.c +++ b/init.c @@ -43,6 +43,8 @@ void init(char *title) { appData.screen_width, appData.screen_height); appData.mapMoved = 1; + selectedPlane = NULL; + appData.mapContinue = NULL; if(appData.fullscreen) { //\SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); // make the scaled rendering look smoother. diff --git a/init.o b/init.o index f25681451b739f5af961c6b38463e5a7110db08c..332a5abe4e4e2c6e00638e81706d797d2c0c2683 100644 GIT binary patch delta 6532 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 F{|6c%pD+Lb diff --git a/input.o.REMOVED.git-id b/input.o.REMOVED.git-id index 82d3329..0b023a1 100644 --- a/input.o.REMOVED.git-id +++ b/input.o.REMOVED.git-id @@ -1 +1 @@ -d4947b5d39abcf0073465f4b5683173294132874 \ No newline at end of file +e65446c295519dac23cf6b702c274d4cfb873e7f \ No newline at end of file diff --git a/interactive.c b/interactive.c index 4f7e029..ae89d8b 100644 --- a/interactive.c +++ b/interactive.c @@ -60,15 +60,20 @@ void interactiveCreateDF(struct aircraft *a, struct modesMessage *mm) { pDF->pAircraft = a; memcpy(pDF->msg, mm->msg, MODES_LONG_MSG_BYTES); - if (!pthread_mutex_lock(&Modes.pDF_mutex)) { - if ((pDF->pNext = Modes.pDF)) { - Modes.pDF->pPrev = pDF; - } - Modes.pDF = pDF; - pthread_mutex_unlock(&Modes.pDF_mutex); - } else { - free(pDF); + // if (!pthread_mutex_lock(&Modes.pDF_mutex)) { + // if ((pDF->pNext = Modes.pDF)) { + // Modes.pDF->pPrev = pDF; + // } + // Modes.pDF = pDF; + // pthread_mutex_unlock(&Modes.pDF_mutex); + // } else { + // free(pDF); + // } + if ((pDF->pNext = Modes.pDF)) { + Modes.pDF->pPrev = pDF; } + Modes.pDF = pDF; + } } // @@ -81,45 +86,75 @@ void interactiveRemoveStaleDF(time_t now) { // Only fiddle with the DF list if we gain possession of the mutex // If we fail to get the mutex we'll get another chance to tidy the // DF list in a second or so. - if (!pthread_mutex_trylock(&Modes.pDF_mutex)) { - pDF = Modes.pDF; - while(pDF) { - if ((now - pDF->seen) > Modes.interactive_delete_ttl) { - if (Modes.pDF == pDF) { - Modes.pDF = NULL; - } else { - prev->pNext = NULL; - } + // if (!pthread_mutex_trylock(&Modes.pDF_mutex)) { + // pDF = Modes.pDF; + // while(pDF) { + // if ((now - pDF->seen) > Modes.interactive_delete_ttl) { + // if (Modes.pDF == pDF) { + // Modes.pDF = NULL; + // } else { + // prev->pNext = NULL; + // } - // All DF's in the list from here onwards will be time - // expired, so delete them all - while (pDF) { - prev = pDF; pDF = pDF->pNext; - free(prev); - } + // // All DF's in the list from here onwards will be time + // // expired, so delete them all + // while (pDF) { + // prev = pDF; pDF = pDF->pNext; + // free(prev); + // } + // } else { + // prev = pDF; pDF = pDF->pNext; + // } + // } + // pthread_mutex_unlock (&Modes.pDF_mutex); + // } + pDF = Modes.pDF; + while(pDF) { + if ((now - pDF->seen) > Modes.interactive_delete_ttl) { + if (Modes.pDF == pDF) { + Modes.pDF = NULL; } else { - prev = pDF; pDF = pDF->pNext; + prev->pNext = NULL; } + + // All DF's in the list from here onwards will be time + // expired, so delete them all + while (pDF) { + prev = pDF; pDF = pDF->pNext; + free(prev); + } + + } else { + prev = pDF; pDF = pDF->pNext; } - pthread_mutex_unlock (&Modes.pDF_mutex); } } struct stDF *interactiveFindDF(uint32_t addr) { struct stDF *pDF = NULL; - if (!pthread_mutex_lock(&Modes.pDF_mutex)) { - pDF = Modes.pDF; - while(pDF) { - if (pDF->addr == addr) { - pthread_mutex_unlock (&Modes.pDF_mutex); - return (pDF); - } - pDF = pDF->pNext; + // if (!pthread_mutex_lock(&Modes.pDF_mutex)) { + // pDF = Modes.pDF; + // while(pDF) { + // if (pDF->addr == addr) { + // pthread_mutex_unlock (&Modes.pDF_mutex); + // return (pDF); + // } + // pDF = pDF->pNext; + // } + // pthread_mutex_unlock (&Modes.pDF_mutex); + // } + + pDF = Modes.pDF; + while(pDF) { + if (pDF->addr == addr) { + return (pDF); } - pthread_mutex_unlock (&Modes.pDF_mutex); + pDF = pDF->pNext; } + + return (NULL); } // diff --git a/interactive.o b/interactive.o index 77997b23096b9626b7aaba8b7657aa551c5de545..b2a72dbf2f3c662398d9f99bb7ea3c176794293f 100644 GIT binary patch literal 44376 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 G{{H}F4C#pg literal 46136 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 diff --git a/list.o b/list.o index ed2a71d5e6b81655b042285ff3977292f5fe6f57..43b9463726a7cc20354876e40d21ea896c140d33 100644 GIT binary patch delta 6181 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�iD3*<3o{G}2JvF=B->y!w(=?J z1orVI!5cW*my-Sg>0GuQOo9PFn@Vv9x~PC|@kJ61$7)~y5nmEzv~QqknpBk!SghiU z9KMy}WzqQz+co#tEiop7-qe7YJIqP8-RSFNVo@}hdbMwK@x(=KW$QJJ=%>?4V&HJJ za7IOIcpaN(7r?8SKPLof*f1v-CZqYV1&1*3@Oj9><-+F}oF~ko zGGQ9^pzgALCeT%b)$;^w!@79|(1>P{WqwAFo*Zc&b$2ws!NMZpxtxegi}uh%kv#tt zlwsq13+kiZ1-}D0i-kb}6R;#`!64ilw9E~3GUS+QzjaizkTEAZ=zzh;1iXSzJyrv2(Z9@s`>=3X8N7r| z%PjLpuI$+MEsd*j@bVC}#>nzqxE-5m9*a3)Vb0|G#dK(?@5f-c1|CK8am)M@`+Pyu z8H$CEpQ7l=rDgCXMoNWgBq=Y;I=1w712z)chtWz6ZHL|!0(N5BiZbYobt^3Dy`Qfr zfI-o~6PZAbrS!>D@C4?p6i|oxD=l-%t;+qxPA$V^WA#d5#&P|oYv^;>KjyVWxEf|UZwYe}oTC(;W?V+goJl(os@>T)+aPZa;%)!XkTzC$fw_4Px z(q71gp%{EYzmBZQYSs2+N;0rvn!!k>`8Woz(BJ}PQupHBNhUiJJ z-YLuv?XMiexT0x(jtx5tJePapz+L_6*c9#(<|;1S{q(`)4!jP_cUkeb*PH@931aN%x7*dt7zh92&wwA0bQM}+U!(1o!IovF$D@P;kWq!ukG=gyEL7@@^(hBiSqx8hOXoe@g^qM2y+~LamwKwAZCpzm{%jh4{7L* z8t%7?(# znTxPj1d3g#{q4>6r7U-{>cFP!T>3s&tj$=sSC~6oC@zXMWkGFMj|z<0nl&ou99Eyq_}LevUHTyDB-Z z-scS@xperEwl&jO?o@AMl5%jnOW*$Cqr}F&*tk!a6Ev$WoLN44_X~5W3vI`C^0pdt z2;Hoq^uyC0&tq`E2<+C-*BRaClFRSGPRzfg$;b0s=QK7@tT$aKf9%-)-bXkf!XLR% zndes=>)$T9jFrmA=aNe<^@qrU)A-IMmr;gGA&o08x%A`oSWp{)6$iX#9B+nGf2ZGe z!ukWkyg@_zCfkmUp4fCi1kyFs!~JW7ChyB1P892Dj{4Q$sEpU^)r zDtA`KYG$8*#6m(BXttBsb1{|^x>~ax8A}dmY`}U#E0b)-eiKR0$mlj~BJ@>8WioMe zag#RQ$K=Bz@C~C*R{vt#tD3wczipj2yrVym<#AYgSeUo*d30j&HX3(ggwVSfm9}y( zF485(1Z*U9stc8?ILMx7p*JGTIWEt3X}Egjm_ullhIV4~1O^HHo920pECY?Vu{t6G zf7fgWv2C+U&IYzsY!CZp0NrFJS-evN5RM3QtcEUSZwt{+XoZFzWAr2z9ua|y8tS|o zu4wWsm4MMPrDY~lS)PLR6e~wV8#z`On+V;_sN4(Li$*ef1e2q}d|5*q_*9&fD7=ZK zG@rHSa~L7|Lwjz-Mxy^C=bOILJp9DF`E3ezJ~|9eNAr#rczV#o<4h4aFEdnT>~!w}ETe{PL~; E19l*aO#lD@ diff --git a/monokai.o b/monokai.o index f3c046fa29f82566bcd3bfe93a0d161adac0fe6e..6f670082aa843be3934aac4417aacb39a254467f 100644 GIT binary patch delta 8600 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 delta 8308 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 delta 7902 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 ybSjM4(= 199309 -#undef PTW32_LEVEL -#define PTW32_LEVEL 1 -/* Include 1b, 1c and 1d */ -#endif - -#if defined(INCLUDE_NP) -#undef PTW32_LEVEL -#define PTW32_LEVEL 2 -/* Include Non-Portable extensions */ -#endif - -#define PTW32_LEVEL_MAX 3 - -#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_LEVEL) -#define PTW32_LEVEL PTW32_LEVEL_MAX -/* Include everything */ -#endif - -#if defined(_UWIN) -# define HAVE_STRUCT_TIMESPEC 1 -# define HAVE_SIGNAL_H 1 -# undef HAVE_PTW32_CONFIG_H -# pragma comment(lib, "pthread") -#endif - -/* - * ------------------------------------------------------------- - * - * - * Module: pthread.h - * - * Purpose: - * Provides an implementation of PThreads based upon the - * standard: - * - * POSIX 1003.1-2001 - * and - * The Single Unix Specification version 3 - * - * (these two are equivalent) - * - * in order to enhance code portability between Windows, - * various commercial Unix implementations, and Linux. - * - * See the ANNOUNCE file for a full list of conforming - * routines and defined constants, and a list of missing - * routines and constants not defined in this implementation. - * - * Authors: - * There have been many contributors to this library. - * The initial implementation was contributed by - * John Bossom, and several others have provided major - * sections or revisions of parts of the implementation. - * Often significant effort has been contributed to - * find and fix important bugs and other problems to - * improve the reliability of the library, which sometimes - * is not reflected in the amount of code which changed as - * result. - * As much as possible, the contributors are acknowledged - * in the ChangeLog file in the source code distribution - * where their changes are noted in detail. - * - * Contributors are listed in the CONTRIBUTORS file. - * - * As usual, all bouquets go to the contributors, and all - * brickbats go to the project maintainer. - * - * Maintainer: - * The code base for this project is coordinated and - * eventually pre-tested, packaged, and made available by - * - * Ross Johnson - * - * QA Testers: - * Ultimately, the library is tested in the real world by - * a host of competent and demanding scientists and - * engineers who report bugs and/or provide solutions - * which are then fixed or incorporated into subsequent - * versions of the library. Each time a bug is fixed, a - * test case is written to prove the fix and ensure - * that later changes to the code don't reintroduce the - * same error. The number of test cases is slowly growing - * and therefore so is the code reliability. - * - * Compliance: - * See the file ANNOUNCE for the list of implemented - * and not-implemented routines and defined options. - * Of course, these are all defined is this file as well. - * - * Web site: - * The source code and other information about this library - * are available from - * - * http://sources.redhat.com/pthreads-win32/ - * - * ------------------------------------------------------------- - */ - -/* Try to avoid including windows.h */ -#if (defined(__MINGW64__) || defined(__MINGW32__)) && defined(__cplusplus) -#define PTW32_INCLUDE_WINDOWS_H -#endif - -#if defined(PTW32_INCLUDE_WINDOWS_H) -#include -#endif - -#if defined(_MSC_VER) && _MSC_VER < 1300 || defined(__DMC__) -/* - * VC++6.0 or early compiler's header has no DWORD_PTR type. - */ -typedef unsigned long DWORD_PTR; -typedef unsigned long ULONG_PTR; -#endif -/* - * ----------------- - * autoconf switches - * ----------------- - */ - -#if defined(HAVE_PTW32_CONFIG_H) -#include "config.h" -#endif /* HAVE_PTW32_CONFIG_H */ - -#if !defined(NEED_FTIME) -#include -#else /* NEED_FTIME */ -/* use native WIN32 time API */ -#endif /* NEED_FTIME */ - -#if defined(HAVE_SIGNAL_H) -#include -#endif /* HAVE_SIGNAL_H */ - -#include - -/* - * Boolean values to make us independent of system includes. - */ -enum { - PTW32_FALSE = 0, - PTW32_TRUE = (! PTW32_FALSE) -}; - -/* - * This is a duplicate of what is in the autoconf config.h, - * which is only used when building the pthread-win32 libraries. - */ - -#if !defined(PTW32_CONFIG_H) -# if defined(WINCE) -# define NEED_ERRNO -# define NEED_SEM -# endif -# if defined(__MINGW64__) -# define HAVE_STRUCT_TIMESPEC -# define HAVE_MODE_T -# elif defined(_UWIN) || defined(__MINGW32__) -# define HAVE_MODE_T -# endif -#endif - -/* - * - */ - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX -#if defined(NEED_ERRNO) -#include "need_errno.h" -#else -#include -#endif -#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ - -/* - * Several systems don't define some error numbers. - */ -#if !defined(ENOTSUP) -# define ENOTSUP 48 /* This is the value in Solaris. */ -#endif - -#if !defined(ETIMEDOUT) -# define ETIMEDOUT 10060 /* Same as WSAETIMEDOUT */ -#endif - -#if !defined(ENOSYS) -# define ENOSYS 140 /* Semi-arbitrary value */ -#endif - -#if !defined(EDEADLK) -# if defined(EDEADLOCK) -# define EDEADLK EDEADLOCK -# else -# define EDEADLK 36 /* This is the value in MSVC. */ -# endif -#endif - -/* POSIX 2008 - related to robust mutexes */ -#if !defined(EOWNERDEAD) -# define EOWNERDEAD 43 -#endif -#if !defined(ENOTRECOVERABLE) -# define ENOTRECOVERABLE 44 -#endif - -#include - -/* - * To avoid including windows.h we define only those things that we - * actually need from it. - */ -#if !defined(PTW32_INCLUDE_WINDOWS_H) -#if !defined(HANDLE) -# define PTW32__HANDLE_DEF -# define HANDLE void * -#endif -#if !defined(DWORD) -# define PTW32__DWORD_DEF -# define DWORD unsigned long -#endif -#endif - -#if !defined(HAVE_STRUCT_TIMESPEC) -#define HAVE_STRUCT_TIMESPEC -#if !defined(_TIMESPEC_DEFINED) -#define _TIMESPEC_DEFINED -struct timespec { - time_t tv_sec; - long tv_nsec; -}; -#endif /* _TIMESPEC_DEFINED */ -#endif /* HAVE_STRUCT_TIMESPEC */ - -#if !defined(SIG_BLOCK) -#define SIG_BLOCK 0 -#endif /* SIG_BLOCK */ - -#if !defined(SIG_UNBLOCK) -#define SIG_UNBLOCK 1 -#endif /* SIG_UNBLOCK */ - -#if !defined(SIG_SETMASK) -#define SIG_SETMASK 2 -#endif /* SIG_SETMASK */ - -#if defined(__cplusplus) -extern "C" -{ -#endif /* __cplusplus */ - -/* - * ------------------------------------------------------------- - * - * POSIX 1003.1-2001 Options - * ========================= - * - * Options are normally set in , which is not provided - * with pthreads-win32. - * - * For conformance with the Single Unix Specification (version 3), all of the - * options below are defined, and have a value of either -1 (not supported) - * or 200112L (supported). - * - * These options can neither be left undefined nor have a value of 0, because - * either indicates that sysconf(), which is not implemented, may be used at - * runtime to check the status of the option. - * - * _POSIX_THREADS (== 200112L) - * If == 200112L, you can use threads - * - * _POSIX_THREAD_ATTR_STACKSIZE (== 200112L) - * If == 200112L, you can control the size of a thread's - * stack - * pthread_attr_getstacksize - * pthread_attr_setstacksize - * - * _POSIX_THREAD_ATTR_STACKADDR (== -1) - * If == 200112L, you can allocate and control a thread's - * stack. If not supported, the following functions - * will return ENOSYS, indicating they are not - * supported: - * pthread_attr_getstackaddr - * pthread_attr_setstackaddr - * - * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1) - * If == 200112L, you can use realtime scheduling. - * This option indicates that the behaviour of some - * implemented functions conforms to the additional TPS - * requirements in the standard. E.g. rwlocks favour - * writers over readers when threads have equal priority. - * - * _POSIX_THREAD_PRIO_INHERIT (== -1) - * If == 200112L, you can create priority inheritance - * mutexes. - * pthread_mutexattr_getprotocol + - * pthread_mutexattr_setprotocol + - * - * _POSIX_THREAD_PRIO_PROTECT (== -1) - * If == 200112L, you can create priority ceiling mutexes - * Indicates the availability of: - * pthread_mutex_getprioceiling - * pthread_mutex_setprioceiling - * pthread_mutexattr_getprioceiling - * pthread_mutexattr_getprotocol + - * pthread_mutexattr_setprioceiling - * pthread_mutexattr_setprotocol + - * - * _POSIX_THREAD_PROCESS_SHARED (== -1) - * If set, you can create mutexes and condition - * variables that can be shared with another - * process.If set, indicates the availability - * of: - * pthread_mutexattr_getpshared - * pthread_mutexattr_setpshared - * pthread_condattr_getpshared - * pthread_condattr_setpshared - * - * _POSIX_THREAD_SAFE_FUNCTIONS (== 200112L) - * If == 200112L you can use the special *_r library - * functions that provide thread-safe behaviour - * - * _POSIX_READER_WRITER_LOCKS (== 200112L) - * If == 200112L, you can use read/write locks - * - * _POSIX_SPIN_LOCKS (== 200112L) - * If == 200112L, you can use spin locks - * - * _POSIX_BARRIERS (== 200112L) - * If == 200112L, you can use barriers - * - * + These functions provide both 'inherit' and/or - * 'protect' protocol, based upon these macro - * settings. - * - * ------------------------------------------------------------- - */ - -/* - * POSIX Options - */ -#undef _POSIX_THREADS -#define _POSIX_THREADS 200809L - -#undef _POSIX_READER_WRITER_LOCKS -#define _POSIX_READER_WRITER_LOCKS 200809L - -#undef _POSIX_SPIN_LOCKS -#define _POSIX_SPIN_LOCKS 200809L - -#undef _POSIX_BARRIERS -#define _POSIX_BARRIERS 200809L - -#undef _POSIX_THREAD_SAFE_FUNCTIONS -#define _POSIX_THREAD_SAFE_FUNCTIONS 200809L - -#undef _POSIX_THREAD_ATTR_STACKSIZE -#define _POSIX_THREAD_ATTR_STACKSIZE 200809L - -/* - * The following options are not supported - */ -#undef _POSIX_THREAD_ATTR_STACKADDR -#define _POSIX_THREAD_ATTR_STACKADDR -1 - -#undef _POSIX_THREAD_PRIO_INHERIT -#define _POSIX_THREAD_PRIO_INHERIT -1 - -#undef _POSIX_THREAD_PRIO_PROTECT -#define _POSIX_THREAD_PRIO_PROTECT -1 - -/* TPS is not fully supported. */ -#undef _POSIX_THREAD_PRIORITY_SCHEDULING -#define _POSIX_THREAD_PRIORITY_SCHEDULING -1 - -#undef _POSIX_THREAD_PROCESS_SHARED -#define _POSIX_THREAD_PROCESS_SHARED -1 - - -/* - * POSIX 1003.1-2001 Limits - * =========================== - * - * These limits are normally set in , which is not provided with - * pthreads-win32. - * - * PTHREAD_DESTRUCTOR_ITERATIONS - * Maximum number of attempts to destroy - * a thread's thread-specific data on - * termination (must be at least 4) - * - * PTHREAD_KEYS_MAX - * Maximum number of thread-specific data keys - * available per process (must be at least 128) - * - * PTHREAD_STACK_MIN - * Minimum supported stack size for a thread - * - * PTHREAD_THREADS_MAX - * Maximum number of threads supported per - * process (must be at least 64). - * - * SEM_NSEMS_MAX - * The maximum number of semaphores a process can have. - * (must be at least 256) - * - * SEM_VALUE_MAX - * The maximum value a semaphore can have. - * (must be at least 32767) - * - */ -#undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS -#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4 - -#undef PTHREAD_DESTRUCTOR_ITERATIONS -#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS - -#undef _POSIX_THREAD_KEYS_MAX -#define _POSIX_THREAD_KEYS_MAX 128 - -#undef PTHREAD_KEYS_MAX -#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX - -#undef PTHREAD_STACK_MIN -#define PTHREAD_STACK_MIN 0 - -#undef _POSIX_THREAD_THREADS_MAX -#define _POSIX_THREAD_THREADS_MAX 64 - - /* Arbitrary value */ -#undef PTHREAD_THREADS_MAX -#define PTHREAD_THREADS_MAX 2019 - -#undef _POSIX_SEM_NSEMS_MAX -#define _POSIX_SEM_NSEMS_MAX 256 - - /* Arbitrary value */ -#undef SEM_NSEMS_MAX -#define SEM_NSEMS_MAX 1024 - -#undef _POSIX_SEM_VALUE_MAX -#define _POSIX_SEM_VALUE_MAX 32767 - -#undef SEM_VALUE_MAX -#define SEM_VALUE_MAX INT_MAX - - -#if defined(__GNUC__) && !defined(__declspec) -# error Please upgrade your GNU compiler to one that supports __declspec. -#endif - -/* - * When building the library, you should define PTW32_BUILD so that - * the variables/functions are exported correctly. When using the library, - * do NOT define PTW32_BUILD, and then the variables/functions will - * be imported correctly. - */ -#if !defined(PTW32_STATIC_LIB) -# if defined(PTW32_BUILD) -# define PTW32_DLLPORT __declspec (dllexport) -# else -# define PTW32_DLLPORT __declspec (dllimport) -# endif -#else -# define PTW32_DLLPORT -#endif - -/* - * The Open Watcom C/C++ compiler uses a non-standard calling convention - * that passes function args in registers unless __cdecl is explicitly specified - * in exposed function prototypes. - * - * We force all calls to cdecl even though this could slow Watcom code down - * slightly. If you know that the Watcom compiler will be used to build both - * the DLL and application, then you can probably define this as a null string. - * Remember that pthread.h (this file) is used for both the DLL and application builds. - */ -#define PTW32_CDECL __cdecl - -#if defined(_UWIN) && PTW32_LEVEL >= PTW32_LEVEL_MAX -# include -#else -/* - * Generic handle type - intended to extend uniqueness beyond - * that available with a simple pointer. It should scale for either - * IA-32 or IA-64. - */ -typedef struct { - void * p; /* Pointer to actual object */ - unsigned int x; /* Extra information - reuse count etc */ -} ptw32_handle_t; - -typedef ptw32_handle_t pthread_t; -typedef struct pthread_attr_t_ * pthread_attr_t; -typedef struct pthread_once_t_ pthread_once_t; -typedef struct pthread_key_t_ * pthread_key_t; -typedef struct pthread_mutex_t_ * pthread_mutex_t; -typedef struct pthread_mutexattr_t_ * pthread_mutexattr_t; -typedef struct pthread_cond_t_ * pthread_cond_t; -typedef struct pthread_condattr_t_ * pthread_condattr_t; -#endif -typedef struct pthread_rwlock_t_ * pthread_rwlock_t; -typedef struct pthread_rwlockattr_t_ * pthread_rwlockattr_t; -typedef struct pthread_spinlock_t_ * pthread_spinlock_t; -typedef struct pthread_barrier_t_ * pthread_barrier_t; -typedef struct pthread_barrierattr_t_ * pthread_barrierattr_t; - -/* - * ==================== - * ==================== - * POSIX Threads - * ==================== - * ==================== - */ - -enum { -/* - * pthread_attr_{get,set}detachstate - */ - PTHREAD_CREATE_JOINABLE = 0, /* Default */ - PTHREAD_CREATE_DETACHED = 1, - -/* - * pthread_attr_{get,set}inheritsched - */ - PTHREAD_INHERIT_SCHED = 0, - PTHREAD_EXPLICIT_SCHED = 1, /* Default */ - -/* - * pthread_{get,set}scope - */ - PTHREAD_SCOPE_PROCESS = 0, - PTHREAD_SCOPE_SYSTEM = 1, /* Default */ - -/* - * pthread_setcancelstate paramters - */ - PTHREAD_CANCEL_ENABLE = 0, /* Default */ - PTHREAD_CANCEL_DISABLE = 1, - -/* - * pthread_setcanceltype parameters - */ - PTHREAD_CANCEL_ASYNCHRONOUS = 0, - PTHREAD_CANCEL_DEFERRED = 1, /* Default */ - -/* - * pthread_mutexattr_{get,set}pshared - * pthread_condattr_{get,set}pshared - */ - PTHREAD_PROCESS_PRIVATE = 0, - PTHREAD_PROCESS_SHARED = 1, - -/* - * pthread_mutexattr_{get,set}robust - */ - PTHREAD_MUTEX_STALLED = 0, /* Default */ - PTHREAD_MUTEX_ROBUST = 1, - -/* - * pthread_barrier_wait - */ - PTHREAD_BARRIER_SERIAL_THREAD = -1 -}; - -/* - * ==================== - * ==================== - * Cancelation - * ==================== - * ==================== - */ -#define PTHREAD_CANCELED ((void *)(size_t) -1) - - -/* - * ==================== - * ==================== - * Once Key - * ==================== - * ==================== - */ -#define PTHREAD_ONCE_INIT { PTW32_FALSE, 0, 0, 0} - -struct pthread_once_t_ -{ - int done; /* indicates if user function has been executed */ - void * lock; - int reserved1; - int reserved2; -}; - - -/* - * ==================== - * ==================== - * Object initialisers - * ==================== - * ==================== - */ -#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -1) -#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -2) -#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t)(size_t) -3) - -/* - * Compatibility with LinuxThreads - */ -#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER -#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER - -#define PTHREAD_COND_INITIALIZER ((pthread_cond_t)(size_t) -1) - -#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t)(size_t) -1) - -#define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t)(size_t) -1) - - -/* - * Mutex types. - */ -enum -{ - /* Compatibility with LinuxThreads */ - PTHREAD_MUTEX_FAST_NP, - PTHREAD_MUTEX_RECURSIVE_NP, - PTHREAD_MUTEX_ERRORCHECK_NP, - PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP, - PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP, - /* For compatibility with POSIX */ - PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP, - PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, - PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, - PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL -}; - - -typedef struct ptw32_cleanup_t ptw32_cleanup_t; - -#if defined(_MSC_VER) -/* Disable MSVC 'anachronism used' warning */ -#pragma warning( disable : 4229 ) -#endif - -typedef void (* PTW32_CDECL ptw32_cleanup_callback_t)(void *); - -#if defined(_MSC_VER) -#pragma warning( default : 4229 ) -#endif - -struct ptw32_cleanup_t -{ - ptw32_cleanup_callback_t routine; - void *arg; - struct ptw32_cleanup_t *prev; -}; - -#if defined(__CLEANUP_SEH) - /* - * WIN32 SEH version of cancel cleanup. - */ - -#define pthread_cleanup_push( _rout, _arg ) \ - { \ - ptw32_cleanup_t _cleanup; \ - \ - _cleanup.routine = (ptw32_cleanup_callback_t)(_rout); \ - _cleanup.arg = (_arg); \ - __try \ - { \ - -#define pthread_cleanup_pop( _execute ) \ - } \ - __finally \ - { \ - if( _execute || AbnormalTermination()) \ - { \ - (*(_cleanup.routine))( _cleanup.arg ); \ - } \ - } \ - } - -#else /* __CLEANUP_SEH */ - -#if defined(__CLEANUP_C) - - /* - * C implementation of PThreads cancel cleanup - */ - -#define pthread_cleanup_push( _rout, _arg ) \ - { \ - ptw32_cleanup_t _cleanup; \ - \ - ptw32_push_cleanup( &_cleanup, (ptw32_cleanup_callback_t) (_rout), (_arg) ); \ - -#define pthread_cleanup_pop( _execute ) \ - (void) ptw32_pop_cleanup( _execute ); \ - } - -#else /* __CLEANUP_C */ - -#if defined(__CLEANUP_CXX) - - /* - * C++ version of cancel cleanup. - * - John E. Bossom. - */ - - class PThreadCleanup { - /* - * PThreadCleanup - * - * Purpose - * This class is a C++ helper class that is - * used to implement pthread_cleanup_push/ - * pthread_cleanup_pop. - * The destructor of this class automatically - * pops the pushed cleanup routine regardless - * of how the code exits the scope - * (i.e. such as by an exception) - */ - ptw32_cleanup_callback_t cleanUpRout; - void * obj; - int executeIt; - - public: - PThreadCleanup() : - cleanUpRout( 0 ), - obj( 0 ), - executeIt( 0 ) - /* - * No cleanup performed - */ - { - } - - PThreadCleanup( - ptw32_cleanup_callback_t routine, - void * arg ) : - cleanUpRout( routine ), - obj( arg ), - executeIt( 1 ) - /* - * Registers a cleanup routine for 'arg' - */ - { - } - - ~PThreadCleanup() - { - if ( executeIt && ((void *) cleanUpRout != (void *) 0) ) - { - (void) (*cleanUpRout)( obj ); - } - } - - void execute( int exec ) - { - executeIt = exec; - } - }; - - /* - * C++ implementation of PThreads cancel cleanup; - * This implementation takes advantage of a helper - * class who's destructor automatically calls the - * cleanup routine if we exit our scope weirdly - */ -#define pthread_cleanup_push( _rout, _arg ) \ - { \ - PThreadCleanup cleanup((ptw32_cleanup_callback_t)(_rout), \ - (void *) (_arg) ); - -#define pthread_cleanup_pop( _execute ) \ - cleanup.execute( _execute ); \ - } - -#else - -#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined. - -#endif /* __CLEANUP_CXX */ - -#endif /* __CLEANUP_C */ - -#endif /* __CLEANUP_SEH */ - -/* - * =============== - * =============== - * Methods - * =============== - * =============== - */ - -/* - * PThread Attribute Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getdetachstate (const pthread_attr_t * attr, - int *detachstate); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstackaddr (const pthread_attr_t * attr, - void **stackaddr); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstacksize (const pthread_attr_t * attr, - size_t * stacksize); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setdetachstate (pthread_attr_t * attr, - int detachstate); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstackaddr (pthread_attr_t * attr, - void *stackaddr); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstacksize (pthread_attr_t * attr, - size_t stacksize); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedparam (const pthread_attr_t *attr, - struct sched_param *param); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedparam (pthread_attr_t *attr, - const struct sched_param *param); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedpolicy (pthread_attr_t *, - int); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedpolicy (const pthread_attr_t *, - int *); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setinheritsched(pthread_attr_t * attr, - int inheritsched); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getinheritsched(const pthread_attr_t * attr, - int * inheritsched); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_setscope (pthread_attr_t *, - int); - -PTW32_DLLPORT int PTW32_CDECL pthread_attr_getscope (const pthread_attr_t *, - int *); - -/* - * PThread Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid, - const pthread_attr_t * attr, - void *(PTW32_CDECL *start) (void *), - void *arg); - -PTW32_DLLPORT int PTW32_CDECL pthread_detach (pthread_t tid); - -PTW32_DLLPORT int PTW32_CDECL pthread_equal (pthread_t t1, - pthread_t t2); - -PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr); - -PTW32_DLLPORT int PTW32_CDECL pthread_join (pthread_t thread, - void **value_ptr); - -PTW32_DLLPORT pthread_t PTW32_CDECL pthread_self (void); - -PTW32_DLLPORT int PTW32_CDECL pthread_cancel (pthread_t thread); - -PTW32_DLLPORT int PTW32_CDECL pthread_setcancelstate (int state, - int *oldstate); - -PTW32_DLLPORT int PTW32_CDECL pthread_setcanceltype (int type, - int *oldtype); - -PTW32_DLLPORT void PTW32_CDECL pthread_testcancel (void); - -PTW32_DLLPORT int PTW32_CDECL pthread_once (pthread_once_t * once_control, - void (PTW32_CDECL *init_routine) (void)); - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX -PTW32_DLLPORT ptw32_cleanup_t * PTW32_CDECL ptw32_pop_cleanup (int execute); - -PTW32_DLLPORT void PTW32_CDECL ptw32_push_cleanup (ptw32_cleanup_t * cleanup, - ptw32_cleanup_callback_t routine, - void *arg); -#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ - -/* - * Thread Specific Data Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_key_create (pthread_key_t * key, - void (PTW32_CDECL *destructor) (void *)); - -PTW32_DLLPORT int PTW32_CDECL pthread_key_delete (pthread_key_t key); - -PTW32_DLLPORT int PTW32_CDECL pthread_setspecific (pthread_key_t key, - const void *value); - -PTW32_DLLPORT void * PTW32_CDECL pthread_getspecific (pthread_key_t key); - - -/* - * Mutex Attribute Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_init (pthread_mutexattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_destroy (pthread_mutexattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getpshared (const pthread_mutexattr_t - * attr, - int *pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setpshared (pthread_mutexattr_t * attr, - int pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind); -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_gettype (const pthread_mutexattr_t * attr, int *kind); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setrobust( - pthread_mutexattr_t *attr, - int robust); -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getrobust( - const pthread_mutexattr_t * attr, - int * robust); - -/* - * Barrier Attribute Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_init (pthread_barrierattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_destroy (pthread_barrierattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_getpshared (const pthread_barrierattr_t - * attr, - int *pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_setpshared (pthread_barrierattr_t * attr, - int pshared); - -/* - * Mutex Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex, - const pthread_mutexattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_timedlock(pthread_mutex_t * mutex, - const struct timespec *abstime); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_mutex_consistent (pthread_mutex_t * mutex); - -/* - * Spinlock Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_spin_init (pthread_spinlock_t * lock, int pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_spin_destroy (pthread_spinlock_t * lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_spin_lock (pthread_spinlock_t * lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_spin_trylock (pthread_spinlock_t * lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_spin_unlock (pthread_spinlock_t * lock); - -/* - * Barrier Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_barrier_init (pthread_barrier_t * barrier, - const pthread_barrierattr_t * attr, - unsigned int count); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrier_destroy (pthread_barrier_t * barrier); - -PTW32_DLLPORT int PTW32_CDECL pthread_barrier_wait (pthread_barrier_t * barrier); - -/* - * Condition Variable Attribute Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_condattr_init (pthread_condattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_condattr_destroy (pthread_condattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_condattr_getpshared (const pthread_condattr_t * attr, - int *pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_condattr_setpshared (pthread_condattr_t * attr, - int pshared); - -/* - * Condition Variable Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_cond_init (pthread_cond_t * cond, - const pthread_condattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_destroy (pthread_cond_t * cond); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_wait (pthread_cond_t * cond, - pthread_mutex_t * mutex); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_timedwait (pthread_cond_t * cond, - pthread_mutex_t * mutex, - const struct timespec *abstime); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_signal (pthread_cond_t * cond); - -PTW32_DLLPORT int PTW32_CDECL pthread_cond_broadcast (pthread_cond_t * cond); - -/* - * Scheduling - */ -PTW32_DLLPORT int PTW32_CDECL pthread_setschedparam (pthread_t thread, - int policy, - const struct sched_param *param); - -PTW32_DLLPORT int PTW32_CDECL pthread_getschedparam (pthread_t thread, - int *policy, - struct sched_param *param); - -PTW32_DLLPORT int PTW32_CDECL pthread_setconcurrency (int); - -PTW32_DLLPORT int PTW32_CDECL pthread_getconcurrency (void); - -/* - * Read-Write Lock Functions - */ -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_init(pthread_rwlock_t *lock, - const pthread_rwlockattr_t *attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_destroy(pthread_rwlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_tryrdlock(pthread_rwlock_t *); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_trywrlock(pthread_rwlock_t *); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_rdlock(pthread_rwlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedrdlock(pthread_rwlock_t *lock, - const struct timespec *abstime); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_wrlock(pthread_rwlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedwrlock(pthread_rwlock_t *lock, - const struct timespec *abstime); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_unlock(pthread_rwlock_t *lock); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_init (pthread_rwlockattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr, - int *pshared); - -PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr, - int pshared); - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 - -/* - * Signal Functions. Should be defined in but MSVC and MinGW32 - * already have signal.h that don't define these. - */ -PTW32_DLLPORT int PTW32_CDECL pthread_kill(pthread_t thread, int sig); - -/* - * Non-portable functions - */ - -/* - * Compatibility with Linux. - */ -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr, - int kind); -PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr, - int *kind); - -/* - * Possibly supported by other POSIX threads implementations - */ -PTW32_DLLPORT int PTW32_CDECL pthread_delay_np (struct timespec * interval); -PTW32_DLLPORT int PTW32_CDECL pthread_num_processors_np(void); -PTW32_DLLPORT unsigned __int64 PTW32_CDECL pthread_getunique_np(pthread_t thread); - -/* - * Useful if an application wants to statically link - * the lib rather than load the DLL at run-time. - */ -PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_attach_np(void); -PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_detach_np(void); -PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_attach_np(void); -PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_detach_np(void); - -/* - * Features that are auto-detected at load/run time. - */ -PTW32_DLLPORT int PTW32_CDECL pthread_win32_test_features_np(int); -enum ptw32_features { - PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE = 0x0001, /* System provides it. */ - PTW32_ALERTABLE_ASYNC_CANCEL = 0x0002 /* Can cancel blocked threads. */ -}; - -/* - * Register a system time change with the library. - * Causes the library to perform various functions - * in response to the change. Should be called whenever - * the application's top level window receives a - * WM_TIMECHANGE message. It can be passed directly to - * pthread_create() as a new thread if desired. - */ -PTW32_DLLPORT void * PTW32_CDECL pthread_timechange_handler_np(void *); - -#endif /*PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 */ - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX - -/* - * Returns the Win32 HANDLE for the POSIX thread. - */ -PTW32_DLLPORT HANDLE PTW32_CDECL pthread_getw32threadhandle_np(pthread_t thread); -/* - * Returns the win32 thread ID for POSIX thread. - */ -PTW32_DLLPORT DWORD PTW32_CDECL pthread_getw32threadid_np (pthread_t thread); - - -/* - * Protected Methods - * - * This function blocks until the given WIN32 handle - * is signaled or pthread_cancel had been called. - * This function allows the caller to hook into the - * PThreads cancel mechanism. It is implemented using - * - * WaitForMultipleObjects - * - * on 'waitHandle' and a manually reset WIN32 Event - * used to implement pthread_cancel. The 'timeout' - * argument to TimedWait is simply passed to - * WaitForMultipleObjects. - */ -PTW32_DLLPORT int PTW32_CDECL pthreadCancelableWait (HANDLE waitHandle); -PTW32_DLLPORT int PTW32_CDECL pthreadCancelableTimedWait (HANDLE waitHandle, - DWORD timeout); - -#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ - -/* - * Thread-Safe C Runtime Library Mappings. - */ -#if !defined(_UWIN) -# if defined(NEED_ERRNO) - PTW32_DLLPORT int * PTW32_CDECL _errno( void ); -# else -# if !defined(errno) -# if (defined(_MT) || defined(_DLL)) - __declspec(dllimport) extern int * __cdecl _errno(void); -# define errno (*_errno()) -# endif -# endif -# endif -#endif - -/* - * Some compiler environments don't define some things. - */ -#if defined(__BORLANDC__) -# define _ftime ftime -# define _timeb timeb -#endif - -#if defined(__cplusplus) - -/* - * Internal exceptions - */ -class ptw32_exception {}; -class ptw32_exception_cancel : public ptw32_exception {}; -class ptw32_exception_exit : public ptw32_exception {}; - -#endif - -#if PTW32_LEVEL >= PTW32_LEVEL_MAX - -/* FIXME: This is only required if the library was built using SEH */ -/* - * Get internal SEH tag - */ -PTW32_DLLPORT DWORD PTW32_CDECL ptw32_get_exception_services_code(void); - -#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */ - -#if !defined(PTW32_BUILD) - -#if defined(__CLEANUP_SEH) - -/* - * Redefine the SEH __except keyword to ensure that applications - * propagate our internal exceptions up to the library's internal handlers. - */ -#define __except( E ) \ - __except( ( GetExceptionCode() == ptw32_get_exception_services_code() ) \ - ? EXCEPTION_CONTINUE_SEARCH : ( E ) ) - -#endif /* __CLEANUP_SEH */ - -#if defined(__CLEANUP_CXX) - -/* - * Redefine the C++ catch keyword to ensure that applications - * propagate our internal exceptions up to the library's internal handlers. - */ -#if defined(_MSC_VER) - /* - * WARNING: Replace any 'catch( ... )' with 'PtW32CatchAll' - * if you want Pthread-Win32 cancelation and pthread_exit to work. - */ - -#if !defined(PtW32NoCatchWarn) - -#pragma message("Specify \"/DPtW32NoCatchWarn\" compiler flag to skip this message.") -#pragma message("------------------------------------------------------------------") -#pragma message("When compiling applications with MSVC++ and C++ exception handling:") -#pragma message(" Replace any 'catch( ... )' in routines called from POSIX threads") -#pragma message(" with 'PtW32CatchAll' or 'CATCHALL' if you want POSIX thread") -#pragma message(" cancelation and pthread_exit to work. For example:") -#pragma message("") -#pragma message(" #if defined(PtW32CatchAll)") -#pragma message(" PtW32CatchAll") -#pragma message(" #else") -#pragma message(" catch(...)") -#pragma message(" #endif") -#pragma message(" {") -#pragma message(" /* Catchall block processing */") -#pragma message(" }") -#pragma message("------------------------------------------------------------------") - -#endif - -#define PtW32CatchAll \ - catch( ptw32_exception & ) { throw; } \ - catch( ... ) - -#else /* _MSC_VER */ - -#define catch( E ) \ - catch( ptw32_exception & ) { throw; } \ - catch( E ) - -#endif /* _MSC_VER */ - -#endif /* __CLEANUP_CXX */ - -#endif /* ! PTW32_BUILD */ - -#if defined(__cplusplus) -} /* End of extern "C" */ -#endif /* __cplusplus */ - -#if defined(PTW32__HANDLE_DEF) -# undef HANDLE -#endif -#if defined(PTW32__DWORD_DEF) -# undef DWORD -#endif - -#undef PTW32_LEVEL -#undef PTW32_LEVEL_MAX - -#endif /* ! RC_INVOKED */ - -#endif /* PTHREAD_H */ diff --git a/pthreads/sched.h b/pthreads/sched.h deleted file mode 100644 index f36a97a..0000000 --- a/pthreads/sched.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Module: sched.h - * - * Purpose: - * Provides an implementation of POSIX realtime extensions - * as defined in - * - * POSIX 1003.1b-1993 (POSIX.1b) - * - * -------------------------------------------------------------------------- - * - * Pthreads-win32 - POSIX Threads Library for Win32 - * Copyright(C) 1998 John E. Bossom - * Copyright(C) 1999,2005 Pthreads-win32 contributors - * - * Contact Email: rpj@callisto.canberra.edu.au - * - * The current list of contributors is contained - * in the file CONTRIBUTORS included with the source - * code distribution. The list can also be seen at the - * following World Wide Web location: - * http://sources.redhat.com/pthreads-win32/contributors.html - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library in the file COPYING.LIB; - * if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ -#if !defined(_SCHED_H) -#define _SCHED_H - -#undef PTW32_SCHED_LEVEL - -#if defined(_POSIX_SOURCE) -#define PTW32_SCHED_LEVEL 0 -/* Early POSIX */ -#endif - -#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 -#undef PTW32_SCHED_LEVEL -#define PTW32_SCHED_LEVEL 1 -/* Include 1b, 1c and 1d */ -#endif - -#if defined(INCLUDE_NP) -#undef PTW32_SCHED_LEVEL -#define PTW32_SCHED_LEVEL 2 -/* Include Non-Portable extensions */ -#endif - -#define PTW32_SCHED_LEVEL_MAX 3 - -#if ( defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112 ) || !defined(PTW32_SCHED_LEVEL) -#define PTW32_SCHED_LEVEL PTW32_SCHED_LEVEL_MAX -/* Include everything */ -#endif - - -#if defined(__GNUC__) && !defined(__declspec) -# error Please upgrade your GNU compiler to one that supports __declspec. -#endif - -/* - * When building the library, you should define PTW32_BUILD so that - * the variables/functions are exported correctly. When using the library, - * do NOT define PTW32_BUILD, and then the variables/functions will - * be imported correctly. - */ -#if !defined(PTW32_STATIC_LIB) -# if defined(PTW32_BUILD) -# define PTW32_DLLPORT __declspec (dllexport) -# else -# define PTW32_DLLPORT __declspec (dllimport) -# endif -#else -# define PTW32_DLLPORT -#endif - -/* - * This is a duplicate of what is in the autoconf config.h, - * which is only used when building the pthread-win32 libraries. - */ - -#if !defined(PTW32_CONFIG_H) -# if defined(WINCE) -# define NEED_ERRNO -# define NEED_SEM -# endif -# if defined(__MINGW64__) -# define HAVE_STRUCT_TIMESPEC -# define HAVE_MODE_T -# elif defined(_UWIN) || defined(__MINGW32__) -# define HAVE_MODE_T -# endif -#endif - -/* - * - */ - -#if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX -#if defined(NEED_ERRNO) -#include "need_errno.h" -#else -#include -#endif -#endif /* PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX */ - -#if (defined(__MINGW64__) || defined(__MINGW32__)) || defined(_UWIN) -# if PTW32_SCHED_LEVEL >= PTW32_SCHED_LEVEL_MAX -/* For pid_t */ -# include -/* Required by Unix 98 */ -# include -# else - typedef int pid_t; -# endif -#else - typedef int pid_t; -#endif - -/* Thread scheduling policies */ - -enum { - SCHED_OTHER = 0, - SCHED_FIFO, - SCHED_RR, - SCHED_MIN = SCHED_OTHER, - SCHED_MAX = SCHED_RR -}; - -struct sched_param { - int sched_priority; -}; - -#if defined(__cplusplus) -extern "C" -{ -#endif /* __cplusplus */ - -PTW32_DLLPORT int __cdecl sched_yield (void); - -PTW32_DLLPORT int __cdecl sched_get_priority_min (int policy); - -PTW32_DLLPORT int __cdecl sched_get_priority_max (int policy); - -PTW32_DLLPORT int __cdecl sched_setscheduler (pid_t pid, int policy); - -PTW32_DLLPORT int __cdecl sched_getscheduler (pid_t pid); - -/* - * Note that this macro returns ENOTSUP rather than - * ENOSYS as might be expected. However, returning ENOSYS - * should mean that sched_get_priority_{min,max} are - * not implemented as well as sched_rr_get_interval. - * This is not the case, since we just don't support - * round-robin scheduling. Therefore I have chosen to - * return the same value as sched_setscheduler when - * SCHED_RR is passed to it. - */ -#define sched_rr_get_interval(_pid, _interval) \ - ( errno = ENOTSUP, (int) -1 ) - - -#if defined(__cplusplus) -} /* End of extern "C" */ -#endif /* __cplusplus */ - -#undef PTW32_SCHED_LEVEL -#undef PTW32_SCHED_LEVEL_MAX - -#endif /* !_SCHED_H */ - diff --git a/pthreads/semaphore.h b/pthreads/semaphore.h deleted file mode 100644 index c6e9407..0000000 --- a/pthreads/semaphore.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Module: semaphore.h - * - * Purpose: - * Semaphores aren't actually part of the PThreads standard. - * They are defined by the POSIX Standard: - * - * POSIX 1003.1b-1993 (POSIX.1b) - * - * -------------------------------------------------------------------------- - * - * Pthreads-win32 - POSIX Threads Library for Win32 - * Copyright(C) 1998 John E. Bossom - * Copyright(C) 1999,2005 Pthreads-win32 contributors - * - * Contact Email: rpj@callisto.canberra.edu.au - * - * The current list of contributors is contained - * in the file CONTRIBUTORS included with the source - * code distribution. The list can also be seen at the - * following World Wide Web location: - * http://sources.redhat.com/pthreads-win32/contributors.html - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library in the file COPYING.LIB; - * if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ -#if !defined( SEMAPHORE_H ) -#define SEMAPHORE_H - -#undef PTW32_SEMAPHORE_LEVEL - -#if defined(_POSIX_SOURCE) -#define PTW32_SEMAPHORE_LEVEL 0 -/* Early POSIX */ -#endif - -#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309 -#undef PTW32_SEMAPHORE_LEVEL -#define PTW32_SEMAPHORE_LEVEL 1 -/* Include 1b, 1c and 1d */ -#endif - -#if defined(INCLUDE_NP) -#undef PTW32_SEMAPHORE_LEVEL -#define PTW32_SEMAPHORE_LEVEL 2 -/* Include Non-Portable extensions */ -#endif - -#define PTW32_SEMAPHORE_LEVEL_MAX 3 - -#if !defined(PTW32_SEMAPHORE_LEVEL) -#define PTW32_SEMAPHORE_LEVEL PTW32_SEMAPHORE_LEVEL_MAX -/* Include everything */ -#endif - -#if defined(__GNUC__) && ! defined (__declspec) -# error Please upgrade your GNU compiler to one that supports __declspec. -#endif - -/* - * When building the library, you should define PTW32_BUILD so that - * the variables/functions are exported correctly. When using the library, - * do NOT define PTW32_BUILD, and then the variables/functions will - * be imported correctly. - */ -#if !defined(PTW32_STATIC_LIB) -# if defined(PTW32_BUILD) -# define PTW32_DLLPORT __declspec (dllexport) -# else -# define PTW32_DLLPORT __declspec (dllimport) -# endif -#else -# define PTW32_DLLPORT -#endif - -/* - * This is a duplicate of what is in the autoconf config.h, - * which is only used when building the pthread-win32 libraries. - */ - -#if !defined(PTW32_CONFIG_H) -# if defined(WINCE) -# define NEED_ERRNO -# define NEED_SEM -# endif -# if defined(__MINGW64__) -# define HAVE_STRUCT_TIMESPEC -# define HAVE_MODE_T -# elif defined(_UWIN) || defined(__MINGW32__) -# define HAVE_MODE_T -# endif -#endif - -/* - * - */ - -#if PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX -#if defined(NEED_ERRNO) -#include "need_errno.h" -#else -#include -#endif -#endif /* PTW32_SEMAPHORE_LEVEL >= PTW32_SEMAPHORE_LEVEL_MAX */ - -#define _POSIX_SEMAPHORES - -#if defined(__cplusplus) -extern "C" -{ -#endif /* __cplusplus */ - -#if !defined(HAVE_MODE_T) -typedef unsigned int mode_t; -#endif - - -typedef struct sem_t_ * sem_t; - -PTW32_DLLPORT int __cdecl sem_init (sem_t * sem, - int pshared, - unsigned int value); - -PTW32_DLLPORT int __cdecl sem_destroy (sem_t * sem); - -PTW32_DLLPORT int __cdecl sem_trywait (sem_t * sem); - -PTW32_DLLPORT int __cdecl sem_wait (sem_t * sem); - -PTW32_DLLPORT int __cdecl sem_timedwait (sem_t * sem, - const struct timespec * abstime); - -PTW32_DLLPORT int __cdecl sem_post (sem_t * sem); - -PTW32_DLLPORT int __cdecl sem_post_multiple (sem_t * sem, - int count); - -PTW32_DLLPORT int __cdecl sem_open (const char * name, - int oflag, - mode_t mode, - unsigned int value); - -PTW32_DLLPORT int __cdecl sem_close (sem_t * sem); - -PTW32_DLLPORT int __cdecl sem_unlink (const char * name); - -PTW32_DLLPORT int __cdecl sem_getvalue (sem_t * sem, - int * sval); - -#if defined(__cplusplus) -} /* End of extern "C" */ -#endif /* __cplusplus */ - -#undef PTW32_SEMAPHORE_LEVEL -#undef PTW32_SEMAPHORE_LEVEL_MAX - -#endif /* !SEMAPHORE_H */ diff --git a/status.o.REMOVED.git-id b/status.o.REMOVED.git-id index 6ca3b1e..09792e2 100644 --- a/status.o.REMOVED.git-id +++ b/status.o.REMOVED.git-id @@ -1 +1 @@ -9aa844df5159c2a246895c0eb2a306f53d0a36fd \ No newline at end of file +00319fecb996b4196487ff551c1c4fcd04063dcc \ No newline at end of file diff --git a/structs.h b/structs.h index 3fac6c5..674d430 100644 --- a/structs.h +++ b/structs.h @@ -44,6 +44,7 @@ typedef struct AppData int touchy; int mapMoved; + QuadTree *mapContinue; uint64_t lastFrameTime; } AppData; diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id index 710990e..b424937 100644 --- a/view1090.REMOVED.git-id +++ b/view1090.REMOVED.git-id @@ -1 +1 @@ -cbbacac08ce30232fcad4a508249c7e61768effa \ No newline at end of file +c71ae5a169099a989da238f49c409fb014f13fd2 \ No newline at end of file diff --git a/view1090.c b/view1090.c index b3e8210..d2a32cb 100644 --- a/view1090.c +++ b/view1090.c @@ -89,9 +89,9 @@ void view1090InitConfig(void) { // void view1090Init(void) { - pthread_mutex_init(&Modes.pDF_mutex,NULL); - pthread_mutex_init(&Modes.data_mutex,NULL); - pthread_cond_init(&Modes.data_cond,NULL); + // pthread_mutex_init(&Modes.pDF_mutex,NULL); + // pthread_mutex_init(&Modes.data_mutex,NULL); + // pthread_cond_init(&Modes.data_cond,NULL); #ifdef _WIN32 if ( (!Modes.wsaData.wVersion) diff --git a/view1090.o.REMOVED.git-id b/view1090.o.REMOVED.git-id index 56946c2..2e96c58 100644 --- a/view1090.o.REMOVED.git-id +++ b/view1090.o.REMOVED.git-id @@ -1 +1 @@ -790297577270307a97648484360f0eeb3de83233 \ No newline at end of file +71f6442ad1518278cce9fee8235924b9bbe56cc6 \ No newline at end of file From 954f70dd0428cae2da07b02b988573b84e1f6e62 Mon Sep 17 00:00:00 2001 From: nathan Date: Wed, 26 Feb 2020 22:44:30 -0800 Subject: [PATCH 64/65] changed doubles to float. wrote out mapdata.bin and read in, this is still hacky, but compiles faster now Former-commit-id: 414d8aed6506b08512972bf6221f8f04c8906b5b [formerly 8894cdb766d205bf630d4de44701894a53b95b12] [formerly 59f44288ca1838e89e1f8c7463e88e91d5252c4b] Former-commit-id: 197667cbaa98c5fd5d4b1ef504d579d5ff6f8100 Former-commit-id: a0e785034d5709b7f7fdfa9eb4fd1c8e0332f507 --- Makefile | 6 +- README.md | 4 + TODO.md | 37 ++++ allstates.c.REMOVED.git-id | 1 - allstates.o.REMOVED.git-id | 1 - android_notes | 21 ++ draw.c | 84 ++++---- draw.o.REMOVED.git-id | 2 +- font.o | Bin 37856 -> 37912 bytes init.o | Bin 48464 -> 48520 bytes input.o.REMOVED.git-id | 2 +- list.o | Bin 48344 -> 48400 bytes map_conversion/README.md | 21 ++ map_conversion/a.out.REMOVED.git-id | 1 + map_conversion/allstates.c.REMOVED.git-id | 1 + map_conversion/data.REMOVED.git-id | 1 + map_conversion/write2bin.c | 12 ++ mapconversion.xlsx.REMOVED.git-id | 1 - mapdata.bin.REMOVED.git-id | 1 + mapdata.c | 237 ++++++++++++++++++++++ mapdata.c.REMOVED.git-id | 1 - mapdata.h | 26 +-- mapdata.o | Bin 25608 -> 26408 bytes monokai.o | Bin 27848 -> 27904 bytes planeObj.o | Bin 44392 -> 44504 bytes status.o.REMOVED.git-id | 2 +- structs.h | 12 +- view1090.REMOVED.git-id | 2 +- view1090.o.REMOVED.git-id | 2 +- 29 files changed, 406 insertions(+), 72 deletions(-) create mode 100644 TODO.md delete mode 100644 allstates.c.REMOVED.git-id delete mode 100644 allstates.o.REMOVED.git-id create mode 100644 android_notes create mode 100644 map_conversion/README.md create mode 100644 map_conversion/a.out.REMOVED.git-id create mode 100644 map_conversion/allstates.c.REMOVED.git-id create mode 100644 map_conversion/data.REMOVED.git-id create mode 100644 map_conversion/write2bin.c delete mode 100644 mapconversion.xlsx.REMOVED.git-id create mode 100644 mapdata.bin.REMOVED.git-id create mode 100644 mapdata.c delete mode 100644 mapdata.c.REMOVED.git-id diff --git a/Makefile b/Makefile index cb47954..41e0aea 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ EXTRACFLAGS=-DHTMLPATH=\"$(SHAREDIR)\" endif CFLAGS=-O2 -g -Wall -W -LIBS=-lm -lSDL2 -lSDL2_ttf -lSDL2_gfx +LIBS=-lm -lSDL2 -lSDL2_ttf -lSDL2_gfx CC=gcc all: view1090 @@ -19,8 +19,8 @@ all: view1090 %.o: %.c $(CC) $(CFLAGS) $(EXTRACFLAGS) -c $< -view1090: view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o allstates.o - $(CC) -g -o view1090 view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o allstates.o $(LIBS) $(LDFLAGS) +view1090: view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o + $(CC) -g -o view1090 view1090.o anet.o interactive.o mode_ac.o mode_s.o net_io.o planeObj.o input.o draw.o font.o init.o mapdata.o status.o list.o parula.o monokai.o $(LIBS) $(LDFLAGS) clean: rm -f *.o view1090 diff --git a/README.md b/README.md index a1eacc5..a36c562 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,10 @@ cd spidr ###HARDWARE +Right now, Pixel 2 is $109 on Amazon (https://www.amazon.com/Google-Pixel-64-Black-Refurbished/dp/B0787V183F). +This significantly outperforms a rpi4. + + best option seems to be pi4 + pijuice zero (w/ rewired i2c) + hyperpixel 4. RTLSDR (stratux) sticks down or needs u shaped adapter. For future tuner, need to test audio phat w/ little speaker, i2c knob, etc. diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..77c2b56 --- /dev/null +++ b/TODO.md @@ -0,0 +1,37 @@ +todo + + + + +UI stuff + +tap on plane sets plane to active + +animated recenter to active + +toggle follow and orient (and other popup info?) +double tap to zoom +animated label show and hide + +draw map to texture and only redraw on move +color themes (requires settings load) +settings (button popups or panes, sliders, etc) +battery level (need separate linux/win/android) + + +Utility stuff +zipped map load (and write from python) --> start by reducing lat/lon precision to 4 or 5 decimal places and change storage to float instead of double +libconfig load settings + +Platforms +migrate Android project into main repo +SDL_AndroidGetJNIEnv() to access parameters, system info, etc +windows + + + + + + + +naming + +viz1090 +map1090 +sdl1090 \ No newline at end of file diff --git a/allstates.c.REMOVED.git-id b/allstates.c.REMOVED.git-id deleted file mode 100644 index 9bbece1..0000000 --- a/allstates.c.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -e1983f2439326aba30a2576504aac03b2f3cd2fc \ No newline at end of file diff --git a/allstates.o.REMOVED.git-id b/allstates.o.REMOVED.git-id deleted file mode 100644 index 76f110e..0000000 --- a/allstates.o.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -9bee8f55a87c0c25e624b913e8e728619074d9ee \ No newline at end of file diff --git a/android_notes b/android_notes new file mode 100644 index 0000000..6778a50 --- /dev/null +++ b/android_notes @@ -0,0 +1,21 @@ +Android build notes + +This example works: +https://github.com/pvallet/hello-sdl2-android + +the only JDK that seems to work is oracle-java8-installer, discontinued but available as of 2/18/2020 from +sudo add-apt-repository ppa:ts.sch.gr/ppa +sudo apt-get update +sudo apt-get install oracle-java8-installer +per https://askubuntu.com/questions/1139387/update-to-latest-version-of-java-after-ppa-is-discontinued + +SDL2, SDL2_gfx, SDL2_ttf official need to go in external + +SDL2_gfx official doesn't have Android.mk, but this one does: + +https://github.com/keera-studios/SDL2_gfx + + +App parameters are in android/app/src/main/java/[pvallet/com/github/hellosdl2/helloSDL2Activity.java] (network access, fullscreen immersive mode" +Resources (fonts etc) need to go in android/app/src/main/res +build settings (arch, android version) are in android/AndroidManifest.xml AND android/SDL2/src/main/AndroidManifest.xml (not sure if the second one needs to be changed) \ No newline at end of file diff --git a/draw.c b/draw.c index 5c4f38f..e5a9da0 100644 --- a/draw.c +++ b/draw.c @@ -21,7 +21,7 @@ float sign(float x) { return (x > 0) - (x < 0); } -void CROSSVP(double *v, double *u, double *w) +void CROSSVP(float *v, float *u, float *w) { v[0] = u[1]*w[2] - u[2]*(w)[1]; v[1] = u[2]*w[0] - u[0]*(w)[2]; @@ -69,9 +69,9 @@ SDL_Color lerpColor(SDL_Color aColor, SDL_Color bColor, float factor) { return out; } -SDL_Color hsv2SDLColor(double h, double s, double v) +SDL_Color hsv2SDLColor(float h, float s, float v) { - double hh, p, q, t, ff; + float hh, p, q, t, ff; long i; SDL_Color out; @@ -127,9 +127,9 @@ SDL_Color hsv2SDLColor(double h, double s, double v) return out; } -int screenDist(double d) { +int screenDist(float d) { - double scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; + float scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; if(appData.mapLogDist) { return round(0.95 * scale_factor * 0.5 * log(1.0+fabs(d)) / log(1.0+appData.maxDist)); @@ -138,7 +138,7 @@ int screenDist(double d) { } } -void pxFromLonLat(double *dx, double *dy, double lon, double lat) { +void pxFromLonLat(float *dx, float *dy, float lon, float lat) { if(!lon || !lat) { *dx = 0; *dy = 0; @@ -149,18 +149,18 @@ void pxFromLonLat(double *dx, double *dy, double lon, double lat) { *dy = 6371.0 * (lat - appData.centerLat) * M_PI / 180.0f; } -void latLonFromScreenCoords(double *lat, double *lon, int x, int y) { - double scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; +void latLonFromScreenCoords(float *lat, float *lon, int x, int y) { + float scale_factor = (appData.screen_width > appData.screen_height) ? appData.screen_width : appData.screen_height; - double dx = appData.maxDist * (x - (appData.screen_width>>1)) / (0.95 * scale_factor * 0.5 ); - double dy = appData.maxDist * (y - (appData.screen_height * CENTEROFFSET)) / (0.95 * scale_factor * 0.5 ); + float dx = appData.maxDist * (x - (appData.screen_width>>1)) / (0.95 * scale_factor * 0.5 ); + float dy = appData.maxDist * (y - (appData.screen_height * CENTEROFFSET)) / (0.95 * scale_factor * 0.5 ); *lat = 180.0f * dy / (6371.0 * M_PI) + appData.centerLat; *lon = 180.0 * dx / (cos(((*lat + appData.centerLat)/2.0f) * M_PI / 180.0f) * 6371.0 * M_PI) + appData.centerLon; } -void screenCoords(int *outX, int *outY, double dx, double dy) { +void screenCoords(int *outX, int *outY, float dx, float dy) { *outX = (appData.screen_width>>1) + ((dx>0) ? 1 : -1) * screenDist(dx); *outY = (appData.screen_height * CENTEROFFSET) + ((dy>0) ? -1 : 1) * screenDist(dy); } @@ -175,7 +175,7 @@ int outOfBounds(int x, int y) { void drawPlaneOffMap(int x, int y, int *returnx, int *returny, SDL_Color planeColor) { - double arrowWidth = 6.0 * appData.screen_uiscale; + float arrowWidth = 6.0 * appData.screen_uiscale; float inx = x - (appData.screen_width>>1); float iny = y - appData.screen_height * CENTEROFFSET; @@ -195,15 +195,15 @@ void drawPlaneOffMap(int x, int y, int *returnx, int *returny, SDL_Color planeCo // circleRGBA (appData.renderer,(appData.screen_width>>1) + outx, appData.screen_height * CENTEROFFSET + outy,50,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); // thickLineRGBA(appData.renderer,appData.screen_width>>1,appData.screen_height * CENTEROFFSET, (appData.screen_width>>1) + outx, appData.screen_height * CENTEROFFSET + outy,arrowWidth,planeColor.r,planeColor.g,planeColor.b,SDL_ALPHA_OPAQUE); - double inmag = sqrt(inx *inx + iny*iny); - double vec[3]; + float inmag = sqrt(inx *inx + iny*iny); + float vec[3]; vec[0] = inx / inmag; vec[1] = iny /inmag; vec[2] = 0; - double up[] = {0,0,1}; + float up[] = {0,0,1}; - double out[3]; + float out[3]; CROSSVP(out,vec,up); @@ -231,21 +231,21 @@ void drawPlaneOffMap(int x, int y, int *returnx, int *returny, SDL_Color planeCo *returny = y3; } -void drawPlaneHeading(int x, int y, double heading, SDL_Color planeColor) +void drawPlaneHeading(int x, int y, float heading, SDL_Color planeColor) { - double body = 8.0 * appData.screen_uiscale; - double wing = 6.0 * appData.screen_uiscale; - double tail = 3.0 * appData.screen_uiscale; - double bodyWidth = 2.0 * appData.screen_uiscale; + float body = 8.0 * appData.screen_uiscale; + float wing = 6.0 * appData.screen_uiscale; + float tail = 3.0 * appData.screen_uiscale; + float bodyWidth = 2.0 * appData.screen_uiscale; - double vec[3]; + float vec[3]; vec[0] = sin(heading * M_PI / 180); vec[1] = -cos(heading * M_PI / 180); vec[2] = 0; - double up[] = {0,0,1}; + float up[] = {0,0,1}; - double out[3]; + float out[3]; CROSSVP(out,vec,up); @@ -291,7 +291,7 @@ void drawPlane(int x, int y, SDL_Color planeColor) } -void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSeen, int idx) { +void drawTrail(float *oldDx, float *oldDy, float *oldHeading, time_t * oldSeen, int idx) { int currentIdx, prevIdx; @@ -313,7 +313,7 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee continue; } - double dx, dy; + float dx, dy; pxFromLonLat(&dx, &dy, oldDx[currentIdx], oldDy[currentIdx]); @@ -331,7 +331,7 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee continue; } - double age = pow(1.0 - (double)(now - oldSeen[currentIdx]) / TRAIL_TTL, 2.2); + float age = pow(1.0 - (float)(now - oldSeen[currentIdx]) / TRAIL_TTL, 2.2); if(age < 0) { age = 0; @@ -343,17 +343,17 @@ void drawTrail(double *oldDx, double *oldDy, double *oldHeading, time_t * oldSee //tick marks - age = 1.0 - (double) 4.0 * (now - oldSeen[currentIdx]) / TRAIL_TTL; + age = 1.0 - (float) 4.0 * (now - oldSeen[currentIdx]) / TRAIL_TTL; colorVal = (uint8_t)floor(255.0 * age); - double vec[3]; + float vec[3]; vec[0] = sin(oldHeading[currentIdx] * M_PI / 180); vec[1] = -cos(oldHeading[currentIdx] * M_PI / 180); vec[2] = 0; - double up[] = {0,0,1}; + float up[] = {0,0,1}; - double out[3]; + float out[3]; CROSSVP(out,vec,up); @@ -425,7 +425,7 @@ void drawScaleBars() // drawString("100km", (appData.screen_width>>1) + (0.707 * p100km) + 5, (appData.screen_height * CENTEROFFSET) + (0.707 * p100km) + 5, appData.mapFont, pink); } -void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, double screen_lon_min, double screen_lon_max) { +void drawPolys(QuadTree *tree, float screen_lat_min, float screen_lat_max, float screen_lon_min, float screen_lon_max) { if(tree == NULL) { return; } @@ -462,7 +462,7 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou drawPolys(tree->se, screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max); - double dx, dy; + float dx, dy; // if(!(tree->lat_min > screen_lat_min && // tree->lat_max < screen_lat_max && // tree->lon_min > screen_lon_min && @@ -519,7 +519,7 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou // } // } - // double alpha = 1.0; + // float alpha = 1.0; // //filledPolygonRGBA (appData.renderer, px, py, i, 0, 0, 0, 255); // polygonRGBA (appData.renderer, px, py, i, alpha * purple.r + (1.0-alpha) * blue.r, alpha * purple.g + (1.0-alpha) * blue.g, alpha * purple.b + (1.0-alpha) * blue.b, 255 * alpha); @@ -545,7 +545,7 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou continue; } - double d1 = dx* dx + dy * dy; + float d1 = dx* dx + dy * dy; pxFromLonLat(&dx, &dy, currentPoint->lon, currentPoint->lat); screenCoords(&x2, &y2, dx, dy); @@ -562,9 +562,9 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou continue; } - double d2 = dx* dx + dy * dy; + float d2 = dx* dx + dy * dy; - double factor = 1.0 - (d1+d2) / (3* appData.maxDist * appData.maxDist); + float factor = 1.0 - (d1+d2) / (3* appData.maxDist * appData.maxDist); SDL_Color lineColor = lerpColor(purple, blue, factor); @@ -598,7 +598,7 @@ void drawPolys(QuadTree *tree, double screen_lat_min, double screen_lat_max, dou } void drawGeography() { - double screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max; + float screen_lat_min, screen_lat_max, screen_lon_min, screen_lon_max; latLonFromScreenCoords(&screen_lat_min, &screen_lon_min, 0, appData.screen_height * -0.2); latLonFromScreenCoords(&screen_lat_max, &screen_lon_max, appData.screen_width, appData.screen_height * 1.2); @@ -991,7 +991,7 @@ void drawPlanes() { int x, y; - double dx, dy; + float dx, dy; pxFromLonLat(&dx, &dy, p->lon, p->lat); screenCoords(&x, &y, dx, dy); @@ -999,7 +999,7 @@ void drawPlanes() { p->created = mstime(); } - double age_ms = (double)(mstime() - p->created); + float age_ms = (float)(mstime() - p->created); if(age_ms < 500) { circleRGBA(appData.renderer, x, y, 500 - age_ms, 255,255, 255, (uint8_t)(255.0 * age_ms / 500.0)); } else { @@ -1014,8 +1014,8 @@ void drawPlanes() { pxFromLonLat(&dx, &dy, p->oldLon[idx], p->oldLat[idx]); screenCoords(&oldx, &oldy, dx, dy); - double velx = (x - oldx) / (1000.0 * (p->seenLatLon - p->oldSeen[idx])); - double vely = (y - oldy) / (1000.0 * (p->seenLatLon - p->oldSeen[idx])); + float velx = (x - oldx) / (1000.0 * (p->seenLatLon - p->oldSeen[idx])); + float vely = (y - oldy) / (1000.0 * (p->seenLatLon - p->oldSeen[idx])); usex = x + (mstime() - p->msSeenLatLon) * velx; usey = y + (mstime() - p->msSeenLatLon) * vely; diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id index d5e9144..6241175 100644 --- a/draw.o.REMOVED.git-id +++ b/draw.o.REMOVED.git-id @@ -1 +1 @@ -4019e6c1da59af5e54909b8625f116916ed7b2de \ No newline at end of file +7a72d06a00457897159cc7ebf3afff0f1806f3ab \ No newline at end of file diff --git a/font.o b/font.o index 801bef849bc4d5a670a3606163e7b25a806805dc..3ed6ad06c2f2837e9c1eee3acf70796029b5021d 100644 GIT binary patch delta 4577 zcmaKu3viXi6~}ikNx1itKyDs)??-Y&LQ1&u5Myh@qZIpIZ4i}~;SulH4os&I2Q7~Ek*QV0+LF<>bhKimj;2!V|LpD;Z?{8t zCj0%*`R$%Pdv?F?=KN!UeFp=bi9oEQchcPf8Au%rd||XaO8>}>CC3W1XlUMOAwnZq za|?2p8y$53-q^avjUt+TlwoY$hV>$v!#X3xW1^#ZNKj-2oAC^2*BF*MLLwT8jzL`Q z&eIW$&L57D6wv}Uf(8__&Nf={++3q$-$IO-(PN9@FU69-z&csMCx#a;VyPFN9*yrG zUbrM};c>$Yi)bn9q+PfyZQ*jBn;To-BBB!xLdIgvkQFRTW9wIo=tP!@STkgT<#kA7 zJf2y>spw4=u3>44JNXEtQ`}=Jt3CoRZOO~4Wo7bE;ib@K(<*y8wAr-EVO^>VphmM! z7@f=dI-?`Y=}&nllf08n#*<*Z+2~0Jpxcd}%;oGfdJ5|YjJ}rjKBK2KBJ$6SuH?A~ zvA-)hyvxzL@FlwEz3CmR>z~&Z-r+0&rtk!_Ot#F+V@`$#apafgyUJUo{MJ+3-n0*yOE;#lpo&tYaq?TeOU$m4-$337{27HD@}+7?C|2 z53Y)~M+*I>a$&UHBC@M6kGE#+tl)N>jlP-ctL*>en2hslaOS3YOA=~DF0G5+|&Pq;H?oE7GQSCgiC6`4EXo=N>`Y{?#|MHo3zE(zR)>*SB?f&V*&)ak`< zJPdii9oHM*)_6Qe3X|@W~E!7e!??y`3jHNjfT!<^w2O73n_*uQi zX`_|XAn3IY&A02$q_XcT?$tS4~^jU{4v-T@A2>OOYug^1cFH+e(%KONnAK03Xqz2G@`=a}m{I+N2j-xiv z$qp^XmylZ(^@7fG=)LyT*3bZGvqP6;nYl@dB$e0h(7pDi?V)PW9*4HuGdfI7pvN8h zAbwA{Jw-jB{SMu(e`I1#Up%=%Qxw~i(be}_|J<&&~tW9|dTXjEY8(7>x4WM%! zy3pEtsSR|$wfLPK{>DNdqF&HnrO^o{A>E&$0nnG6$VHq0+IfoHtGu@z8YtCJd`Q)x z88%5j=Xv)1jZhP4u|sFuZ$*N7Kr0{h$jS`g0rkD|CA)#F+DRC!N zg0`elp0>!+HfjXj=FlSi9CPcWF3>#=ebC<6pHd&_0f!daFZK}{1Wh@##?F0`%C;)+ zcWIP!e%w~$57Yqqu0tvmmaz(8&(<>wW_@g3ffPU-w$-0$rR&Ijc^4&u*nY&=!Y2ZRsW&+@>*ZnWR+|E%0=)WDBVe4KZ#krtPCf1{0if_gwtJM<@( zKEvyIzjx@%mj03C4&{B|&>>4NQzd8~{@dfmo3tg>b~!bI&P}6y{p`gN_0$D=yQO|D zZnHPEnfi7pxtRvhZ`J)SD%+{#Zr$&t2IwE@em}KAKdSp9)C>K%?oZGF^lxn5ug6=O;KlCNt|BK{(N?u9H`&t5WeyX*jM#?Pe+g%m9 z(4e;|){yM1l80$V=WO{!YDNDgI*xuV4WZvhGrDFY*H-jr=s5an8bbePn$bNwFshdN oYopZJy+)p=q3)VMFoWjOXG3S}Ozid4MpdCX_Z#bF>gyQyAJKDjZU6uP delta 4542 zcmZ{m4RDmj8OQg%kT1C8a{0Ku7jhwykOT-Hp$^2t2tfyeijXm2KcFTJGAI_g0upTD za()qoLc&uKMrI^}659-Lb2L(LMk1p{r>&%|ohsEKGj!V0apaIXrA6rf+1)o@ck0gE z-v8O(?z8(myZgTH-d^8@!@jN>--VwfCT{UL8OdJXo%v2beOeHX`TH}3cqm_pLJ<@w zq3rL$$YB`{<-P(Pex!AS2#w@^(2uSap;4@Ja=A~)&s_>cR?Y_e`&3gNOXZyGew`y#`qmUJqHxa$0!pgCaDZWqo)(WEIP~ zSjIT~XXQ*mt+PnW@cXg&4& z@Z76)9gjVR@NVRBkohX_Wvb@TRKRlj`zqkMa3OD9jlo|RhF$J=3yrY?Bv3`E+6TpDB06^LwxX8F@Vq>bBI?}hf-_Xi@IO!I+2 zWVMlp0+C12d)ZM;)eDW@O7{gKD~G``Hav3NtU+}<5h%sAK;+7L!=U@w+v$Mtp9E^b zQuFE|V9&uHXGPiBLS1N1jIuWg|4fYI(2Sjx(}}%N2UC8B+rQc--M9jc1!=8iHS&QV ztqIL{L&ew#foaEbiq7NLhjm+({=>FVty`739nG`ooE%-Y2kJibtah4xkKz1#{a!}< zV~Yt8x)?%oQ~pmZa=*pJZl|1I`Q+Ub^M@>)wM;TBc#>LyF>yOaYPUXZoA zOKxPrbLdvii*bth-gB9#|Ae>*H*k^hxwBM=N!;p;@H(+o&lQTZzm4u4T{F^Sm2K29 zxdpT$kaTNXGBUb}Ab6 z^rFELc+*_DIl|c9e^YW`QL96>i%XO97q6Y@OrT$Eo|-qj&FK9wr8Y}vBUL;u-F@m5 z3NaGxe*DhEE0;b+U$^M4v6`NtIL5wj(FU`G^OOMnt3?mt>~i^>hCpvxbV{bCqbT?z z=~m(i$i-WgH}6zx0G(ygPW2)XVgW@#@3ZJ44h!W0>H%G2(KpPz$CT$&7JbRA`B&up zSi0vd`f#E4{Aa2I{hLL9hI`HBDz$>*NuY`sQMs}G)D0T8Xwr=ea)s6 zXro1Ivovj{iY?M@vFI@zKQ50@6KK0d+eT^n6vaWiEIQlR`zZn1YtgN)9($aIKu=qA zQn{wTrr=iT{>h@Zm>s-G4WO4Tdc|bpIz>Tq%!TzbnPKKFrXJ98i*7QsmIguVE!t|b zaVI%3={{spZ+|yX9cYK4d_mO9Q3oWRrB={A*4VM;)V)mIphqma!rZcxGywXJMYo!B z^*c&|eqzxPCL5QiqC>i0Sacy?L|lB-1e$L=dAaI0`#YWDptoD}t%x3bHzh#7Wzk(G z=m%*C^oJIWntK$ZU|hO8EShEZcONx?zG_kLnKOZ+pfgMa-kQw@iaV$W^aYFlQ@uKc zI7ow_eHPtl;yppm6ViRxqP-?}A5b0WkVW4$6Mssrpw}$=4|7H{sT;J=?1{JLKJ%Q6 z&;aNJLwVCHb&6Fzol>CnX_P+z=bE#zm@1x>?zhuCs}DOfeib!=uD7Wf+fH%NCoHu*QlPo`eBt8JYV(%Nr;2CrfMEfN`HIQLMrsA! zo<=zv_nWcLQ#WXzMSpK@cRvk)p0a4Yd8)iksZQy<$FnMly5o=0`N=QtNAirPS%%Qat1w4GjdNa(r#DMFKMQe ILn*5MFZVcd*#H0l diff --git a/init.o b/init.o index 332a5abe4e4e2c6e00638e81706d797d2c0c2683..b477807f1a93c753af34f60af59ce2b776cb0de8 100644 GIT binary patch delta 4207 zcmbuBeQ?yp8OL`oFXYakxg_$tgFCoOa^Vs%$wk4;1c8V%1TbwfMMP9cM4ZqfB;nf#+sY% zbf5O8c4jfj3EU8xDTHrJ(-R_)%?Y5lZ54s(tkc~*CU7GU$r71aSCPP_x^7~rGDHL3 z7l1Lc9Yb?f3LTc0k|LjVmhQiqb+*ruoHB7C$L9F9ZWn<_5v0%eIAk%)kZU$hA z%CZ8>_?22r-_&ACSnA@=E1kvjPnBFPu|JqO5-_U@X5Ep8{iziO-Q2Cq5%i2g>kT^PQTd!V)fsqFcSL!+Pib9xDMN@(t>%dQRD2DqD)esOu7}TnSkuf=Cg(?IMDcrEt(E zqMl&Y2(^a}wvWsfq7efyu$J{wmv&aL6H3?4%JXnUrgm1H!2;fPYv*oW&AY~_W9L2N ze2<-T#`!*P=7Mn=K0~%o-H{z4cuzZnYwk!JG|MmCk&WEX`b+3U|5xtFcGE39k!B;) zJ&|n~y+)lXXpB}m+Y@ZZ*v33E-4q=gJEhbT4NMd4#(Ec;nNnFlM{R zz7xlZmu~#btTfbDowwjR?oZZOcRu*d&b(-F!8UoyuJ`l{F4SvMGuvH{0aS2gFb@e4V!f)yDy@Fl9XXfAdL4fyp5ELN<9|9|`-{no zF)K;F>c}-z1N{)iptn-%LC3$-in@H0j@r$c{oNK#dQXZByV zqG+1VIggq^7vj;%EwRprS)koXU7)Khde&6oUK$47XweotHn?r0anPSww8T{GSqdL= z{AAHK6WdJ7JG*n`b<|wHBrqej6 zm*3E6iLa8P09d&@-XVGQG-$VnTtrmU6RB{)M zf$p*BZ_E{coxHC({vnG-O7*JFQVr<)7F}UpLKmnN^mB{WnmcQPdO)X{6P>8Wh`F=! zX%sYU(LtA<_W;S)9shtut2GqArx@tJEm~Bp@z>M@It_1LZi#t?x%zq31zKd$W}hBi zLBpVnEV{;Ag<2X1U2V~s>gx+%TogX)_#d@tn$Fxt4WLh3G;C-mb%1so%143=(PFCc z8V!IBS+vv8vor?!zD4&NdV##haE&Z_)X+()Ip$=@5GEtqP%}hTg+3)zftk}0q>@O$=den-oH?bqs1p1*x3ry_4 zs0(z`qKgg9rD4!TVeKYX^}M0?(Ku+EMZY$5H-!iA97&=0{1xWdiC$^|J&{8B>o4(r z_6O50X1Cv85lL{?EB>|weB+e{@Vm&kLp8Mcf1PA+l1bw4#6pYg(}X89Ct eKDAu-)4-|Q-S0N)+|SZDy#7J$eMqt2&G{cVI9>Vx delta 4181 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 delta 5191 zcma)<4RBOf6@c%}e?nlhr1191ZnB$@?1rC)g^&ab4WUCJMZs8TXNZzSNF}2s1f*c8 zUDE2%qK;XQwvB_b0c?ZeZ`lwc#E}e+pi_|GDAfVOs{FOpX|4C{ONLRFEQHo5CZAjT{gr*81it!`dsb$z_CX-Apn@GeE zVytkI?oR(PDw!m@+?f|pc746^8^WDM^H6SCBiy4%&d8zxcQ#GQ5osCS_?==6jV96Z zQ0aCob_tOsLNqnUa-qze2`lD9NBu6Jf5-+DA~0X$ERV)zhj)VjDLL? z*d);kywE-2uU24+>z-=GSH_-%z{S)~B&w2^TnV8(QgbWCK2O@#&rof!c`{s7d?jbnu&S;n z>-#9H(s;4~WmOu_Xp&WFJYz^!rSasDJWcs=l3b}|c*}FxIs;pj9-!5}pyWv+O^9|S zPo^@zqU0$gZ&&jDBuA87+JSz%lpG}6gShUQ)>h27`ejys#jb>BdYVa<@SqD%*$y-w zsRYgx;*`TvxfN#TzZ%-=7NP+^IB_A#-V~+Oka8(qDUZC2-;q&DSu~W2CJv>1jHnFmV7PEzw+Skzb1&4o=@GJ`vXm|L(i86^la`;!$ILWV|Y>#hu_&4%! z#Nl7f;%cCzw)aJuTzcSlD9A!EzcOsj(XT@<#`A1D^T-?ugpP209KR3+jCjO*#J& z<7`^{qd3uu6SDdw6(>*5iJkEkNZA0x1uNw+EGt}8*H9=#a`EHoz0hVwr@ zd;^ER2oeAN^WH~EWDjDu7A5PnrYL=jt*0uT7R;yFs(#WOI_b$LVmX2H<*{okHYLlx zSmRfQWadIn+yRZN3^QK}d{N%Go57>@_w-nJRjGvEH|0qYyV~TrPgcZIpFU6|%i-{j z($O<{I(>D*@D4-n1z*H4&ssO2dJY}PW+kbK|FG!4HM+)nmW6l^+9HNbgVs(%j)f@7 zdC-aSB#5KWa=dw|(X&lHZ{Zb5Z5}u~4YN+8w$CS^8tFQXPO&ZsA)d8jZL?y%M6t}B z+RW$ERFtchpBoyz&2{tF!sS2fz|S8>Jg3%*^3`Laes^ghG33u=)b&}h+UMUO!n(vup! z!a4sDqDY4{8p%_(Z$TXCZH?aIGms3<-G=GFTc4U;$?ow=p8(ZJ{TfZ;_0E7+q*WR% z;<$^T6Y1j`?O?hR29dUCw2G^-8RX9mGon#@f4d=w^axXYl7v^KYxT#W5$S2oHfxNU z@)rmry{yrF2D9oP}zn7d2|% z9u3fn^htb^Q?u9WQ>u6xI+5SYxFwbIUB&Y$1tDO=$&L0 zcN^3q1&x}#gFB!NX_rP{=k@kL6zQ)t`V8m%JBTAar_md^p&IE@jaJ~#5Na!-73q@+l;SSule7*xk+vmJ@|?$~p&bU1 z{v?5tZ4cY-0J$G;nNOhmA&B(136wl{@ruquBho)<^i8hw5QLFlV@f6zvIRfX-hlz6 zcN1(WEBf0)Edz#;I=z-+-B3jLGaV1U1BN-9DS4(#k$=XBMNo_M38wa`8)VxSXhXV5 zqn;FWfDLbCq}#lfV#TH1Kd4mE0db@|6DVcX!nWPuJZP8)ncC}pk?VXOs*zsNXggC0 ztw^(c=nk8m^B7)IE_5PwF||GSvTYR%B3-P}*O@*BGHRGjn&&q5yas|uH)?c{=`+xX zbXS7s#5x~>Fw)bSt(V_Ve})01LmFMn^q(*sHBv_v;9?=%n=5fg4;kh>(y>YWQ2KSe zXZ28v^xGQkV7dp|ke<=#d8RiYiZrv3{Em38RI2bo9O=viYM&yS@F+NAh8bo`yF#b` zCa>WLR3rV3MsxX{dkR{Sp7{iN5jtarj9dLR7)1GPtG@}d$B?(J{sRc2oCGyJRq|Zy z#h&^kc`A0j_oS5R5bdkT>}#eR@vjUF_f^QvQ1Z(v8G~l*1F#4Cb#NW~J}5a_C3iwI z_J?54(W<0tJ@Dqy2l3B9$+0Tg56#DLXa&^PkB8&OR!adT{R`w=Xzj1aY+t1!ltUCX M*I}h$UPto(2hXn0=Kufz diff --git a/map_conversion/README.md b/map_conversion/README.md new file mode 100644 index 0000000..a7cd10f --- /dev/null +++ b/map_conversion/README.md @@ -0,0 +1,21 @@ +Very hacky map pipeline: + +using latlon maps from sourced from http://www.mccurley.org/svg/ + +get all.svg + +run mapconverted.py + +**at this point you have to manually format into a c array and get the length.** + +now compile write2bin +gcc write2bin.c allstates.c -o write2bin + +and run write2bin + +this will produce mapdata.bin that the main program reads in + + +** this should be one python that generates the binary file ** + +** then it should be grabbed from mapbox or something ** diff --git a/map_conversion/a.out.REMOVED.git-id b/map_conversion/a.out.REMOVED.git-id new file mode 100644 index 0000000..8050288 --- /dev/null +++ b/map_conversion/a.out.REMOVED.git-id @@ -0,0 +1 @@ +4a9fe852dcd3e65638b4f5a4f943c0e85c5e2ddb \ No newline at end of file diff --git a/map_conversion/allstates.c.REMOVED.git-id b/map_conversion/allstates.c.REMOVED.git-id new file mode 100644 index 0000000..9558799 --- /dev/null +++ b/map_conversion/allstates.c.REMOVED.git-id @@ -0,0 +1 @@ +a617d7924210634db9b7a5c7323d803d371319df \ No newline at end of file diff --git a/map_conversion/data.REMOVED.git-id b/map_conversion/data.REMOVED.git-id new file mode 100644 index 0000000..1e2b8d3 --- /dev/null +++ b/map_conversion/data.REMOVED.git-id @@ -0,0 +1 @@ +d970486a784f62d0e7072845fb9ba545adb51332 \ No newline at end of file diff --git a/map_conversion/write2bin.c b/map_conversion/write2bin.c new file mode 100644 index 0000000..b26c41d --- /dev/null +++ b/map_conversion/write2bin.c @@ -0,0 +1,12 @@ +// +#include + +extern float mapPoints[3878131]; + +int main(int argc, char **argv) { + FILE *file = fopen("mapdata.bin", "wb"); + fwrite(mapPoints, sizeof(mapPoints), 1, file); + fclose(file); + + return(0); +} diff --git a/mapconversion.xlsx.REMOVED.git-id b/mapconversion.xlsx.REMOVED.git-id deleted file mode 100644 index 989f816..0000000 --- a/mapconversion.xlsx.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -cef8f740e8ef23f03d0d46f43348d73f1ca76c8e \ No newline at end of file diff --git a/mapdata.bin.REMOVED.git-id b/mapdata.bin.REMOVED.git-id new file mode 100644 index 0000000..1e2b8d3 --- /dev/null +++ b/mapdata.bin.REMOVED.git-id @@ -0,0 +1 @@ +d970486a784f62d0e7072845fb9ba545adb51332 \ No newline at end of file diff --git a/mapdata.c b/mapdata.c new file mode 100644 index 0000000..098bf62 --- /dev/null +++ b/mapdata.c @@ -0,0 +1,237 @@ +#include "dump1090.h" +#include "mapdata.h" + +#include + +//sourced from http://www.mccurley.org/svg/ +// +//extern float mapPoints[3878131]; + +bool QTInsert(QuadTree *tree, Polygon* polygon) { + // printf("Inserting %d point poly\n", polygon->numPoints); + + if (!(polygon->lat_min >= tree->lat_min && + polygon->lat_max <= tree->lat_max && + polygon->lon_min >= tree->lon_min && + polygon->lon_max <= tree->lon_max)) { + // printf("doesnt fit: %f > %f, %f < %f, %f < %f,%f > %f \n",polygon->lat_min, tree->lat_min, polygon->lat_max, tree->lat_max, polygon->lon_min, tree->lon_min, polygon->lon_max,tree->lon_max); + + return false; + } + + if (tree->nw == NULL) { + tree->nw = (QuadTree*)malloc(sizeof(QuadTree)); + tree->nw->polygons = NULL; + tree->nw->nw = NULL; + tree->nw->ne = NULL; + tree->nw->sw = NULL; + tree->nw->se = NULL; + + tree->nw->lat_min = tree->lat_min; + tree->nw->lat_max = tree->lat_min + 0.5 * (tree->lat_max - tree->lat_min); + tree->nw->lon_min = tree->lon_min; + tree->nw->lon_max = tree->lon_min + 0.5 * (tree->lon_max - tree->lon_min); + } + + if (QTInsert(tree->nw,polygon)){ + return true; + } + + if (tree->sw == NULL) { + tree->sw = (QuadTree*)malloc(sizeof(QuadTree)); + tree->sw->polygons = NULL; + tree->sw->nw = NULL; + tree->sw->ne = NULL; + tree->sw->sw = NULL; + tree->sw->se = NULL; + + tree->sw->lat_min = tree->lat_min; + tree->sw->lat_max = tree->lat_min + 0.5 * (tree->lat_max - tree->lat_min); + tree->sw->lon_min = tree->lon_min + 0.5 * (tree->lon_max - tree->lon_min); + tree->sw->lon_max = tree->lon_max; + } + + if (QTInsert(tree->sw,polygon)){ + return true; + } + + if (tree->ne == NULL) { + tree->ne = (QuadTree*)malloc(sizeof(QuadTree)); + tree->ne->polygons = NULL; + tree->ne->nw = NULL; + tree->ne->ne = NULL; + tree->ne->sw = NULL; + tree->ne->se = NULL; + + tree->ne->lat_min = tree->lat_min + 0.5 * (tree->lat_max - tree->lat_min); + tree->ne->lat_max = tree->lat_max; + tree->ne->lon_min = tree->lon_min; + tree->ne->lon_max = tree->lon_min + 0.5 * (tree->lon_max - tree->lon_min); + } + + if (QTInsert(tree->ne,polygon)){ + return true; + } + + if (tree->se == NULL) { + tree->se = (QuadTree*)malloc(sizeof(QuadTree)); + tree->se->polygons = NULL; + tree->se->nw = NULL; + tree->se->ne = NULL; + tree->se->sw = NULL; + tree->se->se = NULL; + + tree->se->lat_min = tree->lat_min + 0.5 * (tree->lat_max - tree->lat_min); + tree->se->lat_max = tree->lat_max; + tree->se->lon_min = tree->lon_min + 0.5 * (tree->lon_max - tree->lon_min); + tree->se->lon_max = tree->lon_max; + } + + if (QTInsert(tree->se,polygon)){ + return true; + } + + polygon->next = tree->polygons; + tree->polygons = polygon; + // printf("insert done\n"); + return true; +} + +void initMaps() { + mapPoints_count = sizeof(mapPoints) / sizeof(float); + + + FILE *fileptr; + +fileptr = fopen("mapdata.bin", "rb"); // Open the file in binary mode +fseek(fileptr, 0, SEEK_END); // Jump to the end of the file +mapPoints_count = ftell(fileptr) / sizeof(float); // Get the current byte offset in the file +rewind(fileptr); // Jump back to the beginning of the file + +mapPoints = (float *)malloc(mapPoints_count * sizeof(float)); // Enough memory for the file +fread(mapPoints, sizeof(float), mapPoints_count, fileptr); // Read in the entire file +fclose(fileptr); // Close the fileptr + +printf("%d points read\n",mapPoints_count); + + //mapPoints_relative = (float *) malloc(sizeof(mapPoints)); + + // mapPoints_count = sizeof(mapPoints) / (2 * sizeof(double)); + // mapPoints_x = (double *) malloc(sizeof(mapPoints) / 2); + // mapPoints_y = (double *) malloc(sizeof(mapPoints) / 2); + + // int current = 0; + // for(int i = 0; i < 2 * mapPoints_count; i++) { + // if(mapPoints[i] != 0) { + // if(i%2 == 0) { //longitude points + // double dLon = mapPoints[i] - Modes.fUserLon; + // mapPoints_x[current] = 6371.0 * dLon * M_PI / 180.0 * cos(((mapPoints[i+1] + Modes.fUserLat)/2.0) * M_PI / 180.0); + // } else { //latitude points + // double dLat = mapPoints[i] - Modes.fUserLat; + // mapPoints_y[current] = 6371.0 * dLat * M_PI / 180.0f; + // current++; + // } + // } + // } + + root.lat_min = 180; + root.lon_min = 180; + root.lat_max = -180; + root.lon_max = -180; + + root.nw = NULL; + root.ne = NULL; + root.sw = NULL; + root.se = NULL; + + for(int i = 0; i < mapPoints_count; i+=2) { + if(mapPoints[i] == 0) + continue; + + if(mapPoints[i] < root.lon_min) { + root.lon_min = mapPoints[i]; + } else if(mapPoints[i] > root.lon_max) { + root.lon_max = mapPoints[i]; + } + + if(mapPoints[i+1] < root.lat_min) { + root.lat_min = mapPoints[i+1]; + } else if(mapPoints[i+1] > root.lat_max) { + root.lat_max = mapPoints[i+1]; + } + } + + Polygon *currentPolygon = (Polygon*)malloc(sizeof(Polygon)); + + currentPolygon->lat_min = 180.0; + currentPolygon->lon_min = 180.0; + currentPolygon->lat_max = -180.0; + currentPolygon->lon_max = -180.0; + + currentPolygon->numPoints = 0; + + currentPolygon->points = NULL; + currentPolygon->next = NULL; + + for(int i = 0; i < mapPoints_count; i+=2) { + + if(mapPoints[i] == 0) { //end of polygon + if(currentPolygon->numPoints != 7) + QTInsert(&root, currentPolygon); + + currentPolygon = (Polygon*)malloc(sizeof(Polygon)); + + currentPolygon->lat_min = 180.0; + currentPolygon->lon_min = 180.0; + currentPolygon->lat_max = -180.0; + currentPolygon->lon_max = -180.0; + + currentPolygon->numPoints = 0; + currentPolygon->points = NULL; + currentPolygon->next = NULL; + continue; + } + + currentPolygon->numPoints++; + + Point *currentPoint = (Point*)malloc(sizeof(Point)); + + if(mapPoints[i] < currentPolygon->lon_min) { + currentPolygon->lon_min = mapPoints[i]; + } else if(mapPoints[i] > currentPolygon->lon_max) { + currentPolygon->lon_max = mapPoints[i]; + } + + if(mapPoints[i+1] < currentPolygon->lat_min) { + currentPolygon->lat_min = mapPoints[i+1]; + } else if(mapPoints[i+1] > currentPolygon->lat_max) { + currentPolygon->lat_max = mapPoints[i+1]; + } + + currentPoint->lon = mapPoints[i]; + currentPoint->lat = mapPoints[i+1]; + + currentPoint->next = currentPolygon->points; + currentPolygon->points = currentPoint; + } + + +} + + +// void recenter() { +// for(int i = 0; i < mapPoints_count; i++) { + +// if(mapPoints[i] == 0) { +// mapPoints_relative[i] = 0; +// } else { +// if(i%2 == 0) { //longitude points +// double dLon = mapPoints[i] - Modes.fUserLon; +// mapPoints_relative[i] = 6371.0 * dLon * M_PI / 180.0 * cos(((mapPoints[i+1] + Modes.fUserLat)/2.0) * M_PI / 180.0); +// } else { //latitude points +// double dLat = mapPoints[i] - Modes.fUserLat; +// mapPoints_relative[i] = 6371.0 * dLat * M_PI / 180.0f; +// } +// } +// } +// } \ No newline at end of file diff --git a/mapdata.c.REMOVED.git-id b/mapdata.c.REMOVED.git-id deleted file mode 100644 index baee0a1..0000000 --- a/mapdata.c.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -1420a2ee0d38618a03222daea18788de0178f471 \ No newline at end of file diff --git a/mapdata.h b/mapdata.h index 2dc6d4e..d349a79 100644 --- a/mapdata.h +++ b/mapdata.h @@ -1,22 +1,24 @@ #ifndef MAPPOINTS_H #define MAPPOINTS_H -double *mapPoints_relative; +float *mapPoints_relative; int mapPoints_count; -extern double mapPoints[]; +//extern float mapPoints[]; + +float *mapPoints; typedef struct Point{ - double lat; - double lon; + float lat; + float lon; struct Point *next; } Point; typedef struct Polygon{ - double lat_min; - double lat_max; - double lon_min; - double lon_max; + float lat_min; + float lat_max; + float lon_min; + float lon_max; Point *points; int numPoints; @@ -25,10 +27,10 @@ typedef struct Polygon{ } Polygon; typedef struct QuadTree{ - double lat_min; - double lat_max; - double lon_min; - double lon_max; + float lat_min; + float lat_max; + float lon_min; + float lon_max; Polygon *polygons; diff --git a/mapdata.o b/mapdata.o index 3d3304425867ad365da4907eb837c638ca6bf7b4..723c197366acaf417bfba57f17646e56f5eea18f 100644 GIT binary patch literal 26408 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

F^(+y$2@1d)rQ;sywQfE ze3;{Ti@?oCq%R8Gd|9}kadbPUJfPtJrL^H_=M1*<(ndgiXggl$CW()Zb z*q(YDj(&FF;GitF;TX>yJde#b9OZp1A7b3tIUkikStIZtX;^I%_|F)BM&M5|{+hrK zGybW-&F`A01wN7O?8h&L8aqE>{9?w9KeO0B;|0Ez7tM5mSFrp%ftz)`OyF$3S|RX8 zj^}j(FXIOH3cL{~0m{F2gFh&6WB;Q9-@^0zguspbQvz>h`QLVf?-ckDzRuaz4gRvg zm*7M|d9@q-ErI_B`~Tf;@DBw3Df{h{Zt$Z5e}UuVt8Vba><>KI^AB%VbRWc*hBPkT z9?y9%<+x1`cS-VYI_lhM$7=*`_E}XDU)c&Tr3A|Sh?}g)6XIgClK4XjFSBC$8iW}6R%gsC) zt(8p3FZIp589Dsj6_;$K0r>nO|4_b<*K+~j*bgs*q7R1E--ArnQx9h z`zP%~AlsGwQ7>vqy}yX|V@j0v{|jJU*?;>`sDM(cPsyW{y$Nc%>VF;gZ`x!3_(((c zzY#F06Cm|F?*AAvwjyO8hB}F%_+vb8bt15(?5{w!EBkkJ;Xk}4l=eRf80s|R1d_^k zBlP(l9JH;N{>}M0sOzfz8@!-!ecFp@XU=<|($IFf({e#_rIf|@zc;#=e_V>Dy;(n9_6>3yP5(T9_zr4*7wvHy7E=s}Qf|(l=KUK2;ULG~ T8?dh0tEIZd$NH2!%J%;a8v8M` literal 25608 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 E04T{Q%m4rY diff --git a/monokai.o b/monokai.o index 6f670082aa843be3934aac4417aacb39a254467f..370716e80ac78d7131514ae0bfb726d65329b067 100644 GIT binary patch delta 3017 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 diff --git a/planeObj.o b/planeObj.o index 56b644e9d4e5ae610f8d80b738ba24cb305017c7..cf16ab65e109218e4175c61fe7e1c757c381c0f2 100644 GIT binary patch delta 8095 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 EA1Y*qhX4Qo delta 7991 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 Date: Sun, 1 Mar 2020 21:17:12 -0800 Subject: [PATCH 65/65] map conversion in python directly from svg to c array bin file, with bash script. File cleanup (BFG to follow) Former-commit-id: fdd12fece30cc9258a918cb1ffed2c8a8e89ce43 [formerly 87b04ceb9008fabd80258f5c979b9d238411e748] [formerly cd38a9b42c4973e454f8d7b7208539c7bcc6495e] Former-commit-id: c770542b274873228b4eb8bf5cff3210a8876e84 Former-commit-id: db0f8a35610270ed4b381463c8cc4c83a56f5726 --- Android.mk | 39 -- Application.mk | 3 - GL_edit.svf | 23 - anet.o | Bin 40712 -> 0 bytes draw.o.REMOVED.git-id | 1 - font.o | Bin 37912 -> 0 bytes font/DroidSansMono.ttf.REMOVED.git-id | 1 - font/Envy Code R Bold.ttf.REMOVED.git-id | 1 - font/Envy Code R Italic.ttf.REMOVED.git-id | 1 - font/Envy Code R.ttf.REMOVED.git-id | 1 - font/Monoid-Bold.ttf.REMOVED.git-id | 1 - font/Monoid-Italic.ttf.REMOVED.git-id | 1 - font/Monoid-Regular.ttf.REMOVED.git-id | 1 - font/Monoid-Retina.ttf.REMOVED.git-id | 1 - ...PxPlus_AmstradPC1512-2y.ttf.REMOVED.git-id | 1 - .../PxPlus_AmstradPC1512.ttf.REMOVED.git-id | 1 - .../PxPlus_IBM_BIOS-2x.ttf.REMOVED.git-id | 1 - .../PxPlus_IBM_BIOS-2y.ttf.REMOVED.git-id | 1 - .../PxPlus/PxPlus_IBM_BIOS.ttf.REMOVED.git-id | 1 - .../PxPlus_IBM_CGA-2y.ttf.REMOVED.git-id | 1 - font/PxPlus/PxPlus_IBM_CGA.ttf.REMOVED.git-id | 1 - .../PxPlus_IBM_CGAthin-2y.ttf.REMOVED.git-id | 1 - .../PxPlus_IBM_CGAthin.ttf.REMOVED.git-id | 1 - .../PxPlus_IBM_EGA8-2x.ttf.REMOVED.git-id | 1 - .../PxPlus/PxPlus_IBM_EGA8.ttf.REMOVED.git-id | 1 - .../PxPlus_IBM_EGA9-2x.ttf.REMOVED.git-id | 1 - .../PxPlus/PxPlus_IBM_EGA9.ttf.REMOVED.git-id | 1 - font/PxPlus/PxPlus_IBM_MDA.ttf.REMOVED.git-id | 1 - .../PxPlus_IBM_VGA8-2x.ttf.REMOVED.git-id | 1 - .../PxPlus/PxPlus_IBM_VGA8.ttf.REMOVED.git-id | 1 - .../PxPlus_IBM_VGA9-2x.ttf.REMOVED.git-id | 1 - .../PxPlus/PxPlus_IBM_VGA9.ttf.REMOVED.git-id | 1 - .../PxPlus_TandyNew_225-2y.ttf.REMOVED.git-id | 1 - .../PxPlus_TandyNew_225.ttf.REMOVED.git-id | 1 - .../PxPlus_TandyNew_TV-2y.ttf.REMOVED.git-id | 1 - .../PxPlus_TandyNew_TV.ttf.REMOVED.git-id | 1 - .../PxPlus_VGA_SquarePx.ttf.REMOVED.git-id | 1 - font/Ubuntu-B.ttf.REMOVED.git-id | 1 - font/Ubuntu-BI.ttf.REMOVED.git-id | 1 - font/Ubuntu-C.ttf.REMOVED.git-id | 1 - font/Ubuntu-L.ttf.REMOVED.git-id | 1 - font/Ubuntu-LI.ttf.REMOVED.git-id | 1 - font/Ubuntu-M.ttf.REMOVED.git-id | 1 - font/Ubuntu-MI.ttf.REMOVED.git-id | 1 - font/Ubuntu-R.ttf.REMOVED.git-id | 1 - font/Ubuntu-RI.ttf.REMOVED.git-id | 1 - font/UbuntuMono-B.ttf.REMOVED.git-id | 1 - font/UbuntuMono-BI.ttf.REMOVED.git-id | 1 - font/UbuntuMono-R.ttf.REMOVED.git-id | 1 - font/UbuntuMono-RI.ttf.REMOVED.git-id | 1 - font/unifont.ttf.REMOVED.git-id | 1 - gmon.out | Bin 39807 -> 0 bytes init.o | Bin 48520 -> 0 bytes input.o.REMOVED.git-id | 1 - interactive.o | Bin 44376 -> 0 bytes list.o | Bin 48400 -> 0 bytes map_conversion/41.svg.REMOVED.git-id | 1 - map_conversion/README.md | 21 - map_conversion/a.out.REMOVED.git-id | 1 - map_conversion/all.svg.REMOVED.git-id | 1 - map_conversion/allstates.c.REMOVED.git-id | 1 - map_conversion/data.REMOVED.git-id | 1 - map_conversion/getmap.sh | 5 + map_conversion/mapconverter.py | 20 +- map_conversion/write2bin.c | 12 - mapdata.bin.REMOVED.git-id | 1 - mapdata.c | 18 +- mapdata.o | Bin 26408 -> 0 bytes mode_ac.o | Bin 36024 -> 0 bytes mode_s.o.REMOVED.git-id | 1 - monokai.o | Bin 27904 -> 0 bytes net_io.o.REMOVED.git-id | 1 - old_hw_build/dump1090/interactive.c | 4 +- parula.o | Bin 3736 -> 0 bytes planeObj.o | Bin 44504 -> 0 bytes prof_output_nogeography | 517 ------------------ prof_output_withgeography | 517 ------------------ states.svg.REMOVED.git-id | 1 - status.o.REMOVED.git-id | 1 - testfiles/modes1.bin.REMOVED.git-id | 1 - testing.svg | 19 - tools/debug.html | 193 ------- view1090.REMOVED.git-id | 2 +- view1090.c | 4 +- view1090.dSYM/Contents/Info.plist | 20 - .../Resources/DWARF/view1090.REMOVED.git-id | 1 - view1090.o.REMOVED.git-id | 1 - 87 files changed, 35 insertions(+), 1442 deletions(-) delete mode 100644 Android.mk delete mode 100644 Application.mk delete mode 100644 GL_edit.svf delete mode 100644 anet.o delete mode 100644 draw.o.REMOVED.git-id delete mode 100644 font.o delete mode 100644 font/DroidSansMono.ttf.REMOVED.git-id delete mode 100644 font/Envy Code R Bold.ttf.REMOVED.git-id delete mode 100644 font/Envy Code R Italic.ttf.REMOVED.git-id delete mode 100644 font/Envy Code R.ttf.REMOVED.git-id delete mode 100644 font/Monoid-Bold.ttf.REMOVED.git-id delete mode 100644 font/Monoid-Italic.ttf.REMOVED.git-id delete mode 100644 font/Monoid-Regular.ttf.REMOVED.git-id delete mode 100644 font/Monoid-Retina.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_AmstradPC1512-2y.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_AmstradPC1512.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_BIOS-2x.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_BIOS-2y.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_BIOS.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_CGA-2y.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_CGA.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_CGAthin-2y.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_CGAthin.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_EGA8-2x.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_EGA8.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_EGA9-2x.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_EGA9.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_MDA.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_VGA8-2x.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_VGA8.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_VGA9-2x.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_IBM_VGA9.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_TandyNew_225-2y.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_TandyNew_225.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_TandyNew_TV-2y.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_TandyNew_TV.ttf.REMOVED.git-id delete mode 100644 font/PxPlus/PxPlus_VGA_SquarePx.ttf.REMOVED.git-id delete mode 100644 font/Ubuntu-B.ttf.REMOVED.git-id delete mode 100644 font/Ubuntu-BI.ttf.REMOVED.git-id delete mode 100644 font/Ubuntu-C.ttf.REMOVED.git-id delete mode 100644 font/Ubuntu-L.ttf.REMOVED.git-id delete mode 100644 font/Ubuntu-LI.ttf.REMOVED.git-id delete mode 100644 font/Ubuntu-M.ttf.REMOVED.git-id delete mode 100644 font/Ubuntu-MI.ttf.REMOVED.git-id delete mode 100644 font/Ubuntu-R.ttf.REMOVED.git-id delete mode 100644 font/Ubuntu-RI.ttf.REMOVED.git-id delete mode 100644 font/UbuntuMono-B.ttf.REMOVED.git-id delete mode 100644 font/UbuntuMono-BI.ttf.REMOVED.git-id delete mode 100644 font/UbuntuMono-R.ttf.REMOVED.git-id delete mode 100644 font/UbuntuMono-RI.ttf.REMOVED.git-id delete mode 100644 font/unifont.ttf.REMOVED.git-id delete mode 100644 gmon.out delete mode 100644 init.o delete mode 100644 input.o.REMOVED.git-id delete mode 100644 interactive.o delete mode 100644 list.o delete mode 100644 map_conversion/41.svg.REMOVED.git-id delete mode 100644 map_conversion/README.md delete mode 100644 map_conversion/a.out.REMOVED.git-id delete mode 100644 map_conversion/all.svg.REMOVED.git-id delete mode 100644 map_conversion/allstates.c.REMOVED.git-id delete mode 100644 map_conversion/data.REMOVED.git-id create mode 100644 map_conversion/getmap.sh delete mode 100644 map_conversion/write2bin.c delete mode 100644 mapdata.bin.REMOVED.git-id delete mode 100644 mapdata.o delete mode 100644 mode_ac.o delete mode 100644 mode_s.o.REMOVED.git-id delete mode 100644 monokai.o delete mode 100644 net_io.o.REMOVED.git-id delete mode 100644 parula.o delete mode 100644 planeObj.o delete mode 100644 prof_output_nogeography delete mode 100644 prof_output_withgeography delete mode 100644 states.svg.REMOVED.git-id delete mode 100644 status.o.REMOVED.git-id delete mode 100644 testfiles/modes1.bin.REMOVED.git-id delete mode 100644 testing.svg delete mode 100644 tools/debug.html delete mode 100644 view1090.dSYM/Contents/Info.plist delete mode 100644 view1090.dSYM/Contents/Resources/DWARF/view1090.REMOVED.git-id delete mode 100644 view1090.o.REMOVED.git-id diff --git a/Android.mk b/Android.mk deleted file mode 100644 index 3987d7c..0000000 --- a/Android.mk +++ /dev/null @@ -1,39 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE := main.out - -SDL_PATH := ~/Downloads/SDL - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/$(SDL_PATH)/include \ - $(LOCAL_PATH)/$(SDL_PATH) - -#LOCALCFLAGS= - -LOCAL_SRC_FILES := \ - $(SDL_PATH)/src/main/android/SDL_android_main.cpp \ - allstates.c \ - input.c \ - mapdata.c \ - monokai.c \ - planeObj.c \ - anet.c \ - font.c \ - interactive.c \ - mode_ac.c \ - net_io.c \ - status.c \ - draw.c \ - init.c \ - list.c \ - mode_s.c \ - parula.c \ - view1090.c - -LOCAL_SHARED_LIBRARIES := SDL2 SDL2_gfx SDL2_ttf - -LOCAL_LDLIBS := -lGLESv1_CM #-lstdc++ - -include $(BUILD_EXECUTABLE) \ No newline at end of file diff --git a/Application.mk b/Application.mk deleted file mode 100644 index 0f73767..0000000 --- a/Application.mk +++ /dev/null @@ -1,3 +0,0 @@ -APP_ABI := arm64-v8a -APP_PLATFORM := android-29 -APP_BUILD_SCRIPT := Android.mk \ No newline at end of file diff --git a/GL_edit.svf b/GL_edit.svf deleted file mode 100644 index be61dc1..0000000 --- a/GL_edit.svf +++ /dev/null @@ -1,23 +0,0 @@ - - - - --89.65033744.938281 - - - --82.45585539.579205 - - - --89.32713239.204773 - - - - - - - --86.25093945.382258 - - diff --git a/anet.o b/anet.o deleted file mode 100644 index 8bad4d6fa87dad97317c16a5a030d336aee2aaaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40712 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 diff --git a/draw.o.REMOVED.git-id b/draw.o.REMOVED.git-id deleted file mode 100644 index 6241175..0000000 --- a/draw.o.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -7a72d06a00457897159cc7ebf3afff0f1806f3ab \ No newline at end of file diff --git a/font.o b/font.o deleted file mode 100644 index 3ed6ad06c2f2837e9c1eee3acf70796029b5021d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37912 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 diff --git a/font/DroidSansMono.ttf.REMOVED.git-id b/font/DroidSansMono.ttf.REMOVED.git-id deleted file mode 100644 index aba6c11..0000000 --- a/font/DroidSansMono.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -a007071944f7c90020e798eea53b10065e2b45a5 \ No newline at end of file diff --git a/font/Envy Code R Bold.ttf.REMOVED.git-id b/font/Envy Code R Bold.ttf.REMOVED.git-id deleted file mode 100644 index aa348d6..0000000 --- a/font/Envy Code R Bold.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -5e04b16605e6f165afada700fa09ec2c744bd4ca \ No newline at end of file diff --git a/font/Envy Code R Italic.ttf.REMOVED.git-id b/font/Envy Code R Italic.ttf.REMOVED.git-id deleted file mode 100644 index 080db4a..0000000 --- a/font/Envy Code R Italic.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -cf67fe0caf3e7853db2af48cdcd28a4522a15572 \ No newline at end of file diff --git a/font/Envy Code R.ttf.REMOVED.git-id b/font/Envy Code R.ttf.REMOVED.git-id deleted file mode 100644 index 5c6e31e..0000000 --- a/font/Envy Code R.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -e8e4a6045fa8374ca37fd7f53dfa95c61142ae98 \ No newline at end of file diff --git a/font/Monoid-Bold.ttf.REMOVED.git-id b/font/Monoid-Bold.ttf.REMOVED.git-id deleted file mode 100644 index aac093f..0000000 --- a/font/Monoid-Bold.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -730c63d4b5435fc57d6551f5a71d64b7e7d60fbb \ No newline at end of file diff --git a/font/Monoid-Italic.ttf.REMOVED.git-id b/font/Monoid-Italic.ttf.REMOVED.git-id deleted file mode 100644 index 3e0aa9e..0000000 --- a/font/Monoid-Italic.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -97a5b8f6ed4324088d095d616a147d05cfe8917a \ No newline at end of file diff --git a/font/Monoid-Regular.ttf.REMOVED.git-id b/font/Monoid-Regular.ttf.REMOVED.git-id deleted file mode 100644 index bb7eaee..0000000 --- a/font/Monoid-Regular.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -a09e9faff2c39c9dc56f6a0101a300851922e78d \ No newline at end of file diff --git a/font/Monoid-Retina.ttf.REMOVED.git-id b/font/Monoid-Retina.ttf.REMOVED.git-id deleted file mode 100644 index e77b083..0000000 --- a/font/Monoid-Retina.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -ec881731ace782f1f692c4d9afabe1710ef6ac25 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_AmstradPC1512-2y.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_AmstradPC1512-2y.ttf.REMOVED.git-id deleted file mode 100644 index f455312..0000000 --- a/font/PxPlus/PxPlus_AmstradPC1512-2y.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -091001c845fa041bb58677bdb97edc546a43b72d \ No newline at end of file diff --git a/font/PxPlus/PxPlus_AmstradPC1512.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_AmstradPC1512.ttf.REMOVED.git-id deleted file mode 100644 index ec43a52..0000000 --- a/font/PxPlus/PxPlus_AmstradPC1512.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -248a001641f39a4ad8b75387b889698120fd4983 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_BIOS-2x.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_BIOS-2x.ttf.REMOVED.git-id deleted file mode 100644 index 0177c5d..0000000 --- a/font/PxPlus/PxPlus_IBM_BIOS-2x.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -130bb4a9cecd7210769427502b3ee33cdb097341 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_BIOS-2y.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_BIOS-2y.ttf.REMOVED.git-id deleted file mode 100644 index b5a67e7..0000000 --- a/font/PxPlus/PxPlus_IBM_BIOS-2y.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -2a1ec89b5722143dfbdee504bbddab3a48b7bdd6 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_BIOS.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_BIOS.ttf.REMOVED.git-id deleted file mode 100644 index 7ff8681..0000000 --- a/font/PxPlus/PxPlus_IBM_BIOS.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -672aac709f31f3596fe66420cbc409122c8cb706 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_CGA-2y.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_CGA-2y.ttf.REMOVED.git-id deleted file mode 100644 index 357dec5..0000000 --- a/font/PxPlus/PxPlus_IBM_CGA-2y.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -f20e8486e0becccceddade23c1f89d5336aebc49 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_CGA.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_CGA.ttf.REMOVED.git-id deleted file mode 100644 index d4bbba6..0000000 --- a/font/PxPlus/PxPlus_IBM_CGA.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -11cbae78cf937af2f5c0236b8f86cad443162a2f \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_CGAthin-2y.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_CGAthin-2y.ttf.REMOVED.git-id deleted file mode 100644 index 5371b0c..0000000 --- a/font/PxPlus/PxPlus_IBM_CGAthin-2y.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -e8aa21e61df3e92fb290abc35215afdfe9a6db0a \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_CGAthin.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_CGAthin.ttf.REMOVED.git-id deleted file mode 100644 index ea69cca..0000000 --- a/font/PxPlus/PxPlus_IBM_CGAthin.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -bca6a642079482aab1d8d68488c6302c9e0e284d \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_EGA8-2x.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_EGA8-2x.ttf.REMOVED.git-id deleted file mode 100644 index dde90b5..0000000 --- a/font/PxPlus/PxPlus_IBM_EGA8-2x.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -5aeb931af933ee4dd2557a465ecadf908dc53978 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_EGA8.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_EGA8.ttf.REMOVED.git-id deleted file mode 100644 index 8439bf8..0000000 --- a/font/PxPlus/PxPlus_IBM_EGA8.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -22983e3d94e5c6e9c3f85f2bb6aff805b31657d0 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_EGA9-2x.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_EGA9-2x.ttf.REMOVED.git-id deleted file mode 100644 index 15c8736..0000000 --- a/font/PxPlus/PxPlus_IBM_EGA9-2x.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -66c93d8a95903ec73a80ea4f49811d23525ed967 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_EGA9.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_EGA9.ttf.REMOVED.git-id deleted file mode 100644 index dad2805..0000000 --- a/font/PxPlus/PxPlus_IBM_EGA9.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -d07ca5d41b3a257274f42c5fe0b402a672ea612a \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_MDA.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_MDA.ttf.REMOVED.git-id deleted file mode 100644 index c85933c..0000000 --- a/font/PxPlus/PxPlus_IBM_MDA.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -db3b7b20ab68a2010a29158ad5a86a1fff1f86e5 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_VGA8-2x.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_VGA8-2x.ttf.REMOVED.git-id deleted file mode 100644 index 5d81c78..0000000 --- a/font/PxPlus/PxPlus_IBM_VGA8-2x.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -6963c72346edf4b03a76271242ca933ac9afb750 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_VGA8.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_VGA8.ttf.REMOVED.git-id deleted file mode 100644 index 336ad79..0000000 --- a/font/PxPlus/PxPlus_IBM_VGA8.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -0368d2bbae0b02dfeeb66950db2f79109714756e \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_VGA9-2x.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_VGA9-2x.ttf.REMOVED.git-id deleted file mode 100644 index e2201ea..0000000 --- a/font/PxPlus/PxPlus_IBM_VGA9-2x.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -f159709859ade068ba25e93720a5c8abc2fd20ce \ No newline at end of file diff --git a/font/PxPlus/PxPlus_IBM_VGA9.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_IBM_VGA9.ttf.REMOVED.git-id deleted file mode 100644 index 97b020d..0000000 --- a/font/PxPlus/PxPlus_IBM_VGA9.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -53c606887962f52031d77dd4fe9c1ce85ce0783e \ No newline at end of file diff --git a/font/PxPlus/PxPlus_TandyNew_225-2y.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_TandyNew_225-2y.ttf.REMOVED.git-id deleted file mode 100644 index d0e8092..0000000 --- a/font/PxPlus/PxPlus_TandyNew_225-2y.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -e52ba0d0e32c0a8a9de183dc11352f59c754c764 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_TandyNew_225.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_TandyNew_225.ttf.REMOVED.git-id deleted file mode 100644 index 5a95e3a..0000000 --- a/font/PxPlus/PxPlus_TandyNew_225.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -f279c6703790767cc5efae5941913527c039cb0b \ No newline at end of file diff --git a/font/PxPlus/PxPlus_TandyNew_TV-2y.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_TandyNew_TV-2y.ttf.REMOVED.git-id deleted file mode 100644 index b42dc2f..0000000 --- a/font/PxPlus/PxPlus_TandyNew_TV-2y.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -653a1008f0ee073bafcd84e21bddd930e03579b1 \ No newline at end of file diff --git a/font/PxPlus/PxPlus_TandyNew_TV.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_TandyNew_TV.ttf.REMOVED.git-id deleted file mode 100644 index 11015b7..0000000 --- a/font/PxPlus/PxPlus_TandyNew_TV.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -d206e1de86a19ab735257abba83e25bd1d296ebb \ No newline at end of file diff --git a/font/PxPlus/PxPlus_VGA_SquarePx.ttf.REMOVED.git-id b/font/PxPlus/PxPlus_VGA_SquarePx.ttf.REMOVED.git-id deleted file mode 100644 index 8d9102d..0000000 --- a/font/PxPlus/PxPlus_VGA_SquarePx.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -9fe3e4aecd84c498563c3af03fe7050924915f60 \ No newline at end of file diff --git a/font/Ubuntu-B.ttf.REMOVED.git-id b/font/Ubuntu-B.ttf.REMOVED.git-id deleted file mode 100644 index d8c3702..0000000 --- a/font/Ubuntu-B.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -b173da27417c00101dff72617f9b9a2b80ecc8f3 \ No newline at end of file diff --git a/font/Ubuntu-BI.ttf.REMOVED.git-id b/font/Ubuntu-BI.ttf.REMOVED.git-id deleted file mode 100644 index 0a52557..0000000 --- a/font/Ubuntu-BI.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -72a5a99ac0c781eb60dd8721ae93eedda298e07e \ No newline at end of file diff --git a/font/Ubuntu-C.ttf.REMOVED.git-id b/font/Ubuntu-C.ttf.REMOVED.git-id deleted file mode 100644 index cf2e7e8..0000000 --- a/font/Ubuntu-C.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -602a3ee4ab20743037eee6daa1b304fa680967b6 \ No newline at end of file diff --git a/font/Ubuntu-L.ttf.REMOVED.git-id b/font/Ubuntu-L.ttf.REMOVED.git-id deleted file mode 100644 index fdcf7fa..0000000 --- a/font/Ubuntu-L.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -ed0f5bce879796461ebb93969d28a2bbb35efd0f \ No newline at end of file diff --git a/font/Ubuntu-LI.ttf.REMOVED.git-id b/font/Ubuntu-LI.ttf.REMOVED.git-id deleted file mode 100644 index 7c9dda5..0000000 --- a/font/Ubuntu-LI.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -c6cec55fcd5d8e00347661eba8684f848065594e \ No newline at end of file diff --git a/font/Ubuntu-M.ttf.REMOVED.git-id b/font/Ubuntu-M.ttf.REMOVED.git-id deleted file mode 100644 index fcce345..0000000 --- a/font/Ubuntu-M.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -ca9c03a4767153b6d2f64c1d8909525ba39bb8d7 \ No newline at end of file diff --git a/font/Ubuntu-MI.ttf.REMOVED.git-id b/font/Ubuntu-MI.ttf.REMOVED.git-id deleted file mode 100644 index e28f8bb..0000000 --- a/font/Ubuntu-MI.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -e8d186c510a26f1b4319bbb797c3ee18cb104e26 \ No newline at end of file diff --git a/font/Ubuntu-R.ttf.REMOVED.git-id b/font/Ubuntu-R.ttf.REMOVED.git-id deleted file mode 100644 index f146cda..0000000 --- a/font/Ubuntu-R.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -d748728a20789bf5f95e524f3d508f54c67f9475 \ No newline at end of file diff --git a/font/Ubuntu-RI.ttf.REMOVED.git-id b/font/Ubuntu-RI.ttf.REMOVED.git-id deleted file mode 100644 index 64b1304..0000000 --- a/font/Ubuntu-RI.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -4f2d2bc7cb6ae34d90066e1b330dc18ae2386e38 \ No newline at end of file diff --git a/font/UbuntuMono-B.ttf.REMOVED.git-id b/font/UbuntuMono-B.ttf.REMOVED.git-id deleted file mode 100644 index 45ccf0d..0000000 --- a/font/UbuntuMono-B.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -7bd6665765768ae885e2868623e7e9c2fd0cfc8a \ No newline at end of file diff --git a/font/UbuntuMono-BI.ttf.REMOVED.git-id b/font/UbuntuMono-BI.ttf.REMOVED.git-id deleted file mode 100644 index 53e6806..0000000 --- a/font/UbuntuMono-BI.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -6c5b8ba023e41689a2e14dc3c88f978e3188a1de \ No newline at end of file diff --git a/font/UbuntuMono-R.ttf.REMOVED.git-id b/font/UbuntuMono-R.ttf.REMOVED.git-id deleted file mode 100644 index 86fed0a..0000000 --- a/font/UbuntuMono-R.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -fdd309d716629f4e5339d5e5508225ed857a3ede \ No newline at end of file diff --git a/font/UbuntuMono-RI.ttf.REMOVED.git-id b/font/UbuntuMono-RI.ttf.REMOVED.git-id deleted file mode 100644 index a1689b5..0000000 --- a/font/UbuntuMono-RI.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -18f81a29258d13e1d6f1ce98cdd167091ea9bd4a \ No newline at end of file diff --git a/font/unifont.ttf.REMOVED.git-id b/font/unifont.ttf.REMOVED.git-id deleted file mode 100644 index 7475c33..0000000 --- a/font/unifont.ttf.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -8ee248f748192c6ab6b2f5a1c18979d5bb16e646 \ No newline at end of file diff --git a/gmon.out b/gmon.out deleted file mode 100644 index cbb6f49c8d0dac4a334e1651fa2ca6505616d503..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39807 zcmeI5ONbm*6o#veh*5$~l95p}(z@^w6YUwJA&JI{B$|X|Xc3H}kWwRpk4%}4yCA)g zEEJ@dJ~joqQ4q^aL~vDt#@$eYZX^jEe4}WS_}Z9w&-u@l>Ylqx>*_BEr_WdCo>TSR z+Y`bp^5nB~`{QWjYOV#?HH%xjwnx!EhdNI@KDU2g$5;RR!2?DbpaB}70UDqI8lV9h zpaB}70UDqI8lV9hpaB}70UDqI8lV9hpaB}70UDqI8lV9hpaB}70UDqI8lV9hpaB}7 z0UDqI8lV9hpaB}70UDqI8lV9hpaB}70UDqI8lV9hpaB}70UDqI8lV9hpaB}70UDqI z8lV9hpaB}70UDqI8lV9hpaB}70UDqI8lV9h2pJgt4>Csc(3*FWXIp-Q9pEcOvd}H0~L!b^tDOA#Svh zME4@D64)MrQvwGD4;QGsUSR7!BOrJtBY4Kfw z)d>7dV1Evkoz$YdQIsL^Jv#!k=Ky{0Yh4=m41Qw0U7<5SQmL?gV0igUQrYML`sK$2 zrUwBZkXLcn689&Lp4ZROhG!7p6IdQX^0PtN@i>10&@aDGVD>iPR@*DxxV|)T*WY$? z)_sms+lI<+>UMPB*TQJQDiszXn9rlq_teTV1f!#<^n+H)^oBvdTwxM|xxp!WUac$* z`sY;G{9t&{3K^6b^n(SOC_!^bxK1WoT z{D5TkJH(GJaLd~UUpJ^`}6M8157}xC!utc~$e#8o+tmD}@b%lh@#;9M?EA_{znA z`aNo`MdG*P8>vhUdY=k&gI?WIsVqjIRyJ=L?s-Hi+Xj74g#&}WCn{T5J_K`vemAwU zGI+-yZi2h?YdA1CeYOT0_Lu$qRp^aD2K^vamxW;0;OXztQ!9H08ynG6VQKJF+be~Y z!8f+nDqFWBxy-&tlEv*1?1o?-f@KJ{*JIFei#n)lNmifU3&A`Dix4bBFxiah{>OzL X#cl|u+fcc%2@&c-Fu5mCSp?ueYcDw@ diff --git a/init.o b/init.o deleted file mode 100644 index b477807f1a93c753af34f60af59ce2b776cb0de8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48520 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 G{{H}F4C#pg diff --git a/list.o b/list.o deleted file mode 100644 index 713d792ff1ba02afe3a1d202400afa57d65a3766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48400 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 - -extern float mapPoints[3878131]; - -int main(int argc, char **argv) { - FILE *file = fopen("mapdata.bin", "wb"); - fwrite(mapPoints, sizeof(mapPoints), 1, file); - fclose(file); - - return(0); -} diff --git a/mapdata.bin.REMOVED.git-id b/mapdata.bin.REMOVED.git-id deleted file mode 100644 index 1e2b8d3..0000000 --- a/mapdata.bin.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -d970486a784f62d0e7072845fb9ba545adb51332 \ No newline at end of file diff --git a/mapdata.c b/mapdata.c index 098bf62..da5b722 100644 --- a/mapdata.c +++ b/mapdata.c @@ -103,16 +103,18 @@ void initMaps() { FILE *fileptr; -fileptr = fopen("mapdata.bin", "rb"); // Open the file in binary mode -fseek(fileptr, 0, SEEK_END); // Jump to the end of the file -mapPoints_count = ftell(fileptr) / sizeof(float); // Get the current byte offset in the file -rewind(fileptr); // Jump back to the beginning of the file + fileptr = fopen("mapdata.bin", "rb"); // Open the file in binary mode + fseek(fileptr, 0, SEEK_END); // Jump to the end of the file + mapPoints_count = ftell(fileptr) / sizeof(float); // Get the current byte offset in the file -mapPoints = (float *)malloc(mapPoints_count * sizeof(float)); // Enough memory for the file -fread(mapPoints, sizeof(float), mapPoints_count, fileptr); // Read in the entire file -fclose(fileptr); // Close the fileptr + rewind(fileptr); // Jump back to the beginning of the file + + mapPoints = (float *)malloc(mapPoints_count * sizeof(float)); // Enough memory for the file + fread(mapPoints, sizeof(float), mapPoints_count, fileptr); // Read in the entire file + fclose(fileptr); // Close the fileptr + + printf("Read %d map points.\n",mapPoints_count); -printf("%d points read\n",mapPoints_count); //mapPoints_relative = (float *) malloc(sizeof(mapPoints)); diff --git a/mapdata.o b/mapdata.o deleted file mode 100644 index 723c197366acaf417bfba57f17646e56f5eea18f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26408 zcmb_^4SZBZvTvW6gbYbY!bd^?g#r19Nu4& z`(h)2n3I-UGCM6c5Xc2CI4p7Hmb@3s0?M16Te2iO-lJ^Sp4=g7{yb0T_nyuZo{ldH zJ?n2N^xSqPaigd6Z--F#nq7%pPsiTE9camQi&5UQ{zf;*8;*ql} zUhs6>SgLZ@lsiCv{f(uzHjjALSLb;;r@B3z%kqx?EO*EhrCz9ju8!ySUNk%#j&;Mq z_TDwa)8LpkoNR&-qz(6Uz6@u;J)PBs$8#6$`#Lvo1X>JoswwxYFOTOg+y&>8AVoSB z?)SW0nTHZ^F4U5F&om>Cn*SQN1fzn-2 zzXuxZ1?&xI(2@ofUjq@%KD_&fGiPWB#?~xtYBgHwh8{pk-ub8yR*I0&UAqZr*eySV-Khi8)H2Pu1Ldf*#1)pxDHoKGp_^tUd}Dr z16CG+zAWgFyu}vhYl|1|M^#Wq9yG>*%KEf(EhGbWCk+HC4_OK7t6^|w*$H;{u8?MC zAO7t>gg57*8%t@Ny=x&T&M}l-s||(vc{sylEolETWih$djiUmLCKxREKXz#ad-D)9 zYH=MN0cKV$sJg~;*CnX2YJOFn=dLS|gw+M>>g9B#A^sIbMcGMD=bq<~1)me*>HNT) zJue<|bdtPA8jG>5=dOuc@yt^H;psf`d>Z1NFMI6LtYjhlC)RZfBC{R*7NT}SB-K!i4@M%(b`Lnqtq@{g_X?1j46Xgk0 z@hqw_m7uQeDP2F~_hyVQ6hYTzU()!emVFAoujwqR>1=Vq%u|e~!r6^RmhC#av}t3< zsSL<{dKNvM2dOn_BI=(isp{D4@O1paHRaL~s55uNop5Adt*V5SVuhP*~Sfj4Ht`0@aP)ZShXwbd^0atTF0R5%d68ek_W1A_eR z@T{Mg2Mo+B=Ga=-;ozAwXPQcKhpa(^6sGm-7FR8*T3ofH%DZP{Zb@}^`{SrR`{-uK z^T4OIZ$&=s=wq=4)#{7-eFvbaZz!!@9s2P*LB${@ya(aE8?GzO`S(?PL7jnYO<1G%)cbTETfmP)&D7OAnx zj7G&;{LWjFdvME3+<9Y{Yh6I9S3(@(Y{r0MUU1=6MI z(@5uO`X5LaYWfGH-I_jwbWs)@RJyW|DbSDk$T&SZL&M%H22g3r`aobfoNE-uRyBQ zsZ<~38UZJ2;2MO8)0GO~o*9pWFbz5{bMA7er9o%bA<6W7q+KwWxo`%pfM0_owJOSN zKLNCEwE}x)dgUx2(=@&caqYIun-I^|_^pWRpw7JgI-vV$oah2gul*6IFI0V9nVSk= z)obuqsD$YUkWN$mT$%rR2?)@>l=+Jkxf$&S})Sft*G0rP2Yy}a7{mnGDWHvLLUK1VPk0@ zXAQy_>Q|IiT>#TXqsp4P4u+!1X(@C%rWhS%BSDmujAA98FF>b;k(VRsOoO50#M6m%59RPiXVi0F) zd>GQ%dLcd!EoojVl?%0yHGKzLh--QX(Y>yOHb;$chIUcE!6yNstkEB;Rbg8G^HX5g zqHgkEKvESp`BnZd9EG+d|3#$rGRxnMbY5XYTa(J)a}|j9gVB8tI%&GE17HBrl^s9qA&C{}H`c zs_8e7uF&+K4nkj*ntl^$kEY+kXsOlo+o-2r(|<;Kk*424nWdV37wHyFA3&L?rr$?8 zq3ORMy+YG}MfxU9A4K|AO@Dwktkd*|NN+3*`4TGsqY@bVeTAV&nCZ=0=3{KTMbn?` z1Yd2}9!8R8KNtLt?xujM%>V2HAhh`BNHTp0X_v+iV_Th3@{gdabVkWPisrbr%ojLC zMTM>LW|jZth0u01bh8`UQ8Zl&0CnC=4NOd#rt<%WRXs6&sSHx-`Tun?$8`QR<{>uZ z8%!r`$O+5}JZC3Se5vmI+iVET56?qY`KNIFA6lCEJ2Ia#^BppWnE4)=FPQm94`_dk znIDij#mpHTqH@sfR=%=s0H3=YgE7u6TE&H2<*?3!R&M6t>I%3b=F&*Al(`Jz%9(Q! zSHWCQ;wCx<`vdJNKhqipS}M6Ni|Rbg=_{TZ=5nnfkgR1c&%)JM>(oZ~rgrtt!LdkO z<@X_O5pY4^`VzO)Ik*Aq`Vr>`4(sxXYhf(~#D$paPnTs;<_f891#<(a?pEdoQr$Y{ z+*G%bxuH~dA9KTq+r-=j#BByUealt;aN-`}x)H=}VQwUGPcS!%xb4ot;Q*|WBI2Im zx(kWh!Q4f}?PTs^;&w4Nnz+5p6%)6Qxf0@DV{Qy_Z!lL%+}q5R5qE&OvBdp_Iej7c zA#>&AmqW~5LXyXr8&BLf%uOKf6mu2Coo4P*;#8WR_sfV&WA1X|T+B@*E}OY4h|6Pc z5^?>QyOOv<<|>IhkGX0KQ;?gvDZ~{qHw4$;n1(1$c=y01+`Kcw}pRFIFfzRD@+k4^PfSx|^J>#ee2;6%XP(Bmu6O@`~w z$$keRN&Qw7oWDES?_gWMLu~!JZT$|l^?Ly}%_|HqR|O;X0a;iW2XZ8m?!s_D6^uf% zs4xy>5t5}~#bh{VxMsmo``|((-C(pTxcGG-Q~n-`pykISmcNobAe)BvRcaVQRtu6? zH2Vk|gyjM}RKhj$@Sw7OiY}o-@J@!e8+ZiPX$5~kPhuIVPjE#69sC$tjI!pZEE{Fj zIpQ{7;q#;(LqTjb`oYR9f>x&73OOH(wF%K;A~VOZ0JA27l0(D*=%8-vz~w1(5dTFt z_|x6suXcf>`JWIz-{GoA=|}wgZt%WPhi(A*bKL+pG)@b=fZo6bRf42r06h_MVx){= z;2Ag@8b@F1^@fe0#s^xXzyei94VrMhIMJ-Jn*Rnm8K=sT!P0+_gPv9+?Z~$9G#(FF z91D_U#-U`3j3*o^`Y9XzJ4Z_VWo7lYM&$I(a^?)m>23AN$b(x!M}czYT$Xit)(o)E zIb3CBO@ewzwM@F;IbbfJ5DOC&%48sigli=6J^NbDoUANVVF8-iE2*yn8f7t?KBF(P z*`_zxSuATtUu=;x6!eUN%G|!tbRw*}ymGAr8eKU6f!+*2zZ&R+8Le+$E7fnm{x&8* zWdtO{UZ5X4?@yMd8%qm8$fZY)wFAfu*!TuQXN+Gtz)`5wAm}IA>b#Wd3J^ZuHa=hn zvrZf?utV$vK~--1KoA&OVqG~vPXNwHW#P{!4?w33O9?t)mM+M$=J!W@c*;1$M<5PM zsdKdjb6ZCK9CgQPc>Gg%_he9CWGWzQo)7hNLA*ZeTAHbg(p6bsRB|!aVDF}8bjqkv z17=WF(y-$6l}wr+5W46tMo*KJ+Q4UrDt$n=PaUt~PG<8NWelC_ZPB^CElTOo)B)Cz zYE^q~t6JF#o`zCM=W`dsI9KGFf2PHu%Fh|8QKKKVp%2e7rWYGAlFylnr&pJVOQ;N>j(J`41Q_xxJkmDlD&NC3V#q(w~H`F{Dw5>g$r~_oM_3c_<0h z88T(WIc~)rnf4{P3bq#$b9M~rqfU+dozKSQW^$#x@$+c*cYx2$d^Q1`$Dwsjd&V#1 zb1k1sd2LjRH6q&^d9%E>{ol5SaXQpzuyb10_c^`bNUy9QKc+1n8xssShT8mrF)J#@ zd&id-hl1g@6~)crwlNLCL|lSP{lTWHO47LU%nw&PHW-3rHerg9KOc^Nk24b;LFrLs- ziC}BMi!{h3TJYD=;&_WM7VsC_v_^G}4Z&ut5sV5aire52)+*b=pxv))n*)hRG~sQG z#84dUZuKQvbQPB^3ud~CuXXlx)kA%KwR7dftD(g@*MyF>bscMVZkpwqKFhTf>#n|H z0o6}!^T$RAT=7+B>zG8pJ*Z6tidYS#g0Z`Z_0zn--4_+r=4IS{lExFz;bM2zb3s zt#F(%$2-C@ZTrU}b zBPCl|X=Hgg5L3};E3UmrOu<88FIXQ~p}dVPK6pRD+t?NZXNB5Y!?Z*}JVwTV-X@S) zh7nKJ#8oT)Xb_ErRyKpbX{gZ_u-@MoYgD*?12L~&uAra^0k1C<^nr`ObM3(xG=hn0 zcH_tbD}o8-3&t8_zNUm8Tfi4fGz4J$F<&B}f>XdrH4*SBVDZG9w#586xDq`83SpG3 zzSuGtnpuyH3cX6x4*iAO;(=IP#RGw`Y7Hb}!A6?VfZq+Hj;Z!QjJrWin67k4v?Zc# zSg~B&;PqmDSQUY1A5FnfAna=m&|JdMTcau#iP-0%wJi}?;f<@dFvgDQ2?91649C?h z2(-9rY79kSuE7g5$yc}e{B^NFK*6I)FSS=qFv?gBxS6Ka*O&;l2PjIb=vWP7OROS8 zyptml9h+#sHyUa~M=y^DZWuRK(I~;-h7g2zvyN|^)|Oy%i=Mfr;0kajMsqNXgC;MV z*lNb50@DGS&_Ni55WkcxK?x?@vhe`G>Ij?Vm(qmpqZo}R=BNp^Tm=gnB8cq>Hu@soMqgtK z1ShUJJvrVGM5nh6U-${Acr*Y`#iUYI-4yaQO7$U<^WPA=OV@*BI!;mwft=+(Yl+k> z>zqV+T`yu=Jo_VUunrV#>aeGKF#{%Sj1Hg(EP+T9#1Z9U@Uc$KCgVf3$qeM2IQ{@> z>&>K$q!%FZHFIo&S1~PxVJ`?qAQjm6i>6Qn);f6z)^04&q;nhmz^!+MF)fkSz?d*x zy2RW3zA??g#2CmY;7_yhLF+DOUuPrUkTCgFRV&a6Nlb;?S~;K7Orq&_^Keux$y{t^ zHR|)1!K}dv;t5aV^r>8*F4113{V5i>p$+B{MiR##>ThTZLa^Ic3`_)GPpN2?$^SZ1 zl^0hIDAb(>Vad+&LAIv|!DY}I426OT*!*$Hw}XrQxM})Yads(*H$|c_Kw6QFp@1*k z7NrcXU}3>Oy;vx$&hiM!UrC}O)#0}ycqcqGyZr2R}>h?(XEp;?uCI^ zd$1AKKN{A6D?SdEMH=Dy0P+EJjrtn&BKHRx+L|Fj2Oy_n*1<7X8#m)(!$l4~P%zjP z`eTu36x8ts9M>D3-ZoOpFcyGK8aEA06b+Ejzz6zTAl?EO4mcyW6oO%|DCl8}Zt;a- z46VKp3_yALS_Otqd50{4G;0>V;r#&^KpXTK@R#cGgOCj@>k1s(6*x{OXSkABPFWD` zhjoBUkUE1svJUQKY}ZwKyMtQ1s#7#Ry12lZOBt;*fjz{}3dYFtIJgub*q$NV>&q>3 zRg>J|V4Zo}6SSXl`i6@d2pd?@bZvlpSn8ULE$6r7%mR#$cP!Y` z{3z-3t7f{&OlDMc6sg5L6A$}wiaDji+OY*rDa1GXf~MbAHSVl*;tzyi!IE=CMkXi2 zo)Y&p!^Ky0HeP*4Y0sA$IZADPj8)NEydbA#Fn#uXcXe5rdqPQhNvXTIHPIFhT+tkW zYvo`gu)bJh%N1}NUp&6tUEJ(0o-@{6+yq@TE-QvCkbuM=i50_*3tarN8&j8&IA>~l zb@gTLqWKN5gSP2Tip$!FE4#U@qNKFEr0hbC<1Hw>^`winYObwP0n$HC^VUzl-Vt?91@Eicf9(?&vX4lFJ6M*q^Adx z%JeQRb;A3%vJ3&Bk8K_)<^aPu)P0}bVp2EwRKQV>X>WcSo(*_!_4OHk;FpYmCEe)p zcY|Nw4Ib?VUk*6->w+^DbN&~gyBgQpZtxA=;J*MI^}FGWr9z+7W;l1%@6(LC;Y@|6 zRKGo%(o@ORwwvOTn(9&ohcY~j#lyJN)w6ec&78?qHQqVXrp=pL=dG)n3^$VI0w8($ zmAbajn})u~(tD-8ZQ~s~Dae_h?{;BZq+2R_m_RqpNkQ15_-bVqY)Wy3SJhCi=5gTj zG>p~L@HGaOmEGV!=?3504gQ~uV_d<{M@juoPD$7=&a>(FZpNkj)^6l0_(7nQ_cAW^ zf6$G*ix;SrUu(nRHHD;|Ke6GsT8;g`vf=PUraGnFdFFA((N0|ZM*dkFKFEf@Xv1-z zG4ihq{RV%_CXX+a8T`F&#?hbX2P03f zzXOjrW?h31v*{UX!;8AnbEyp<2J$9XOcA)zKU3h$s<{GpgDx!if<6|s6ZPXSlvu78 zIObn0H`;K!-|n&DsE1kgpumlt+q%JD7r4>$p1@81{InbVxWLJHI9QzL%yKZ|q-c!|nOx`fl{xZTQM?$5Wo(PMUGeD%xt0LNgi91!mXf6E!bwT#8! zeQ@AV^nRVfkFjF34GX3r7A5{dI%;{-7eXaA9Q&nL#^8Lp!1dRNN=+8{!`#UXf$Ptl z;B{ev_v1^g1p>dE^(+y%e)C?bMuB(m`fn3BzBhQFhQ4fgfb~-2yLSJ6{v{)jZw<0)LnN^QpjJV?D<9f7 zVQRduvRps*hZ*k<*5ej<6USAtz&~O9GJzju|4bM7Q0D6delg4Y1a9UvEbyT`UpEST zCiCkA?&ERYD{y#Sgvvt#U%~j30-wwLPJ!z$E0o$V@XL8z?+E-W_WvgW-^=4VCh+AP z5C0JO&5UPq9GQ8%jq&~hzmxId0{QP~a1IzP=NL+;dvb|@H5O;3;c8TzenJ|)9Tecf%jznUV*>I^2-GNd&X}Tcs=8t0>7L6 za<9Oj;&^^g;Ggn5ZWZ_#w$of^8h?&t{eKYhcnyl>PXd36<^L-1_3Zz{0-w)u`-8w= zGCYsN*fWXoAp*}~{TB&*2+LOpd=mFNRp6%Is|9ZQZ4&r@GJk`>1KjVA1pZ65^Im~} z&i0t=Ju}|h7~d-7ALKZER^a&M9F{)_d>i-svA{22JtqXdSF6E~y{Q;`{LE(w{BiDg zl)#5_yj>=6qkpQvjehf{kLlOw4+;5UZ0A~mJJ|m}5%>q}hhGXj%yGL#;IFY?o)-9* zoM)aF`0u&j{Q?j1JeuoLGp>5p^MQ~b$#xzQ`0sd~o))(<#{mr53>Dz1pZsL z=X`-rVEiJ1zrlQ&z%OBbyucT+p2-3?{+TWCXL&pe1s-Jo!~~8XZezJw;4iWK9RmM> zczkBO!2eAA767gX{-$U1RK=!~VZd$Unew_=v#G{quH#Pv`Zx zQ{ZD5-zRXBf8Q3kxnB8D;Gc5*d?E00?B`PgKgs>3vA@lDPcxn;aD1MRVkt6WP!23p~WQ*$<7M|DEUKxR5vTU>*z``S;oWEWWNZxQX*=jN@_`K_k+KdLe&5 zuNS|-dogeBM~(jTI38{i@{@U7>jZAD!|o9{eHjlXJt*)K?1yavujcXoo4}8-{rd!d z70>&h1wMiCj|IM;?f**PeK^kb|4Wd%&&B@-0*n4mE`={(JI(%P{ATXo$`OEK@G7={ zvcR9_erp9@%yAwPxc)z2lv*Y539Nsez|A`OnZR%4ejgF|5+2tPf$PtN;Q6k=kFkGx z82`bT@%hg~%=Z&`70VA3_&02SslZoq98MDWe4f7=f!DGAg#zEt>#bej2U*V=ft%+| zKM}ae3)=)f9VZ*gPJuUaoWCOQcX_-A1pXZR_cMVfIRAVj@P+Ij2gfxwNB`f&@_7Ou z!u()?-_P+jTHr%i&t(FyWqFUlSECc4TqE%BHLUysf0f5$@~*M}Y4+Q#LjDMkcZ0yE zvEMcc+{E#(1@2;ghrmy;oi7P|JFknk1zyhfd@S&rd47)x{8=8?4+8&)^w$gD=#LpUv~oJ_29BaXwh!^dB&Ro{I!-##JqFWB+V{ zzs~c!P~c`t=zQaor*CG>(%$3f$Q9p1|*9J3nI_!(bRXlFL^@-rT>P zu*ste^WI7}|A1%we=qyFz=pGl)WaYfjwvmV^UMevj`HT~>5FVQF6mOz0>9tcaFl

F^(+y$2@1d)rQ;sywQfE ze3;{Ti@?oCq%R8Gd|9}kadbPUJfPtJrL^H_=M1*<(ndgiXggl$CW()Zb z*q(YDj(&FF;GitF;TX>yJde#b9OZp1A7b3tIUkikStIZtX;^I%_|F)BM&M5|{+hrK zGybW-&F`A01wN7O?8h&L8aqE>{9?w9KeO0B;|0Ez7tM5mSFrp%ftz)`OyF$3S|RX8 zj^}j(FXIOH3cL{~0m{F2gFh&6WB;Q9-@^0zguspbQvz>h`QLVf?-ckDzRuaz4gRvg zm*7M|d9@q-ErI_B`~Tf;@DBw3Df{h{Zt$Z5e}UuVt8Vba><>KI^AB%VbRWc*hBPkT z9?y9%<+x1`cS-VYI_lhM$7=*`_E}XDU)c&Tr3A|Sh?}g)6XIgClK4XjFSBC$8iW}6R%gsC) zt(8p3FZIp589Dsj6_;$K0r>nO|4_b<*K+~j*bgs*q7R1E--ArnQx9h z`zP%~AlsGwQ7>vqy}yX|V@j0v{|jJU*?;>`sDM(cPsyW{y$Nc%>VF;gZ`x!3_(((c zzY#F06Cm|F?*AAvwjyO8hB}F%_+vb8bt15(?5{w!EBkkJ;Xk}4l=eRf80s|R1d_^k zBlP(l9JH;N{>}M0sOzfz8@!-!ecFp@XU=<|($IFf({e#_rIf|@zc;#=e_V>Dy;(n9_6>3yP5(T9_zr4*7wvHy7E=s}Qf|(l=KUK2;ULG~ T8?dh0tEIZd$NH2!%J%;a8v8M` diff --git a/mode_ac.o b/mode_ac.o deleted file mode 100644 index e0ad49b2ed31b6b42466dc27961bcad5c3478386..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36024 zcmeHQ33yahvOYK62@MJ9K(mBJ2zwB+vPMzTkc6NhQG$YsO{cq)^q6#qURcy2C?G@# z+u(=}V;G+^>eEqYhEbm4$l@rj1Fkqaipz6D=i!F9jJ&Ekb#C9BWSp7k`@T2dm-~_K z`u|g>PMtb+>fXL|ZW>Exl_eR5P=_JT773(SAttX)$i*ZUi$0>aaNgh7dH8%+dcXVXufFXf#ERXAziPH$kBaW5=SqqWHQqM8d0^ANx00HU-1x

$C9G=U^aV;_B(g%b2|>klZ#h>6mx*f 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 K^`=(j`~L%bi%yXM diff --git a/net_io.o.REMOVED.git-id b/net_io.o.REMOVED.git-id deleted file mode 100644 index 8056b37..0000000 --- a/net_io.o.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -22b5fc5c241eb98e511019d0ffa249f80ba7a933 \ No newline at end of file diff --git a/old_hw_build/dump1090/interactive.c b/old_hw_build/dump1090/interactive.c index 2a7db58..cf4cb02 100644 --- a/old_hw_build/dump1090/interactive.c +++ b/old_hw_build/dump1090/interactive.c @@ -521,12 +521,12 @@ void interactiveShowData(void) { if (a->bFlags & MODES_ACFLAGS_LATLON_VALID) { double dLon = a->lon+87.6651033; - double dLat = a->lat-***REMOVED***; + double dLat = a->lat-41.9809263; snprintf(strLat, 8,"%7.03f", dLat); snprintf(strLon, 9,"%8.03f", dLon); - double x = dLon * M_PI / 180.0f * cos(((a->lat+***REMOVED***)/2.0f) * M_PI / 180.0f); + double x = dLon * M_PI / 180.0f * cos(((a->lat+41.9809263)/2.0f) * M_PI / 180.0f); double y = dLat * M_PI / 180.0f; d = sqrt(x*x + y*y) * 6371.0; diff --git a/parula.o b/parula.o deleted file mode 100644 index 4e87f8fc66ef5a12f6e25887f2f49a8f3619c8c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3736 zcmbW3X>3$g7>4h3%33JJs(@&iMhRA#X$z&0n!>~?q)4j45aNo{c9<61X`KauC^bgG zB`A?7U|dimxP#)pVpI&ciwi=;VvI4GxUa$OdGCC;9d7F%Px8$B-tV5}JLjHz?sT6% zZ+1Z-;CLnA%yjy$yr|=B7~bcju8le+&M0RZ{v=opH4uh1<}1;4=BJ_?&8yxf^R?(^ zP(O9>5L81Hw!;*thi9My=D-e^40B;8OoB#u3(8*lwhubICeeFZeu z1Mo5^p9kS3P@WIN^PshT1fB)WaVtCxTDNWR1dM@4VLOb6$3XWcfMV+Fcu-x9F$tc8 z`#}5cDNx>(=I=(QfyTKLYC-!{>oNk#9DY*ZlNcwI&yVp1u5qup6{)=fm6P&qcL& z6+Z{`K4_g6!anm_%LC@mMn4CQJs-X_ueJZ$d?Wg;`FZG%<{QvoK>g2#KS1Nw!=Io$ zqwqIq?sf1FXg;;(Uqz>b>gy>lmn#@z$u@H=SEli)Yl z3lrg2*bmyj%31R-Gk*}BVEzmAIQSX9f@47Szk#vlzeA4(_4yN&g2vT&dbgC1@+$_d zZy|6x1oS&XKVB)&Doll-e!AV?0;h235LFmdIH)a|aSsV65KvCTf{ME(Fgh@?xU?u( zJifSOjN|ZyYA6kmN3hIkD6J@B%oCiVqM1~nBeNV&gR7ljac$8lMGd91#uaEj$3lVI zCASACTDt;wbpnAy#UshY{TMQrfYTLAW!qzsX1Cd##s#7Js;bcRNOhz#6z<4mlkvJl zJQ+{5HFFtDHMiC+n^6<4sSbq`q41egLgB^fOsx6ha964`6K~FRro!n=sxz5z+W84( zlj*iZGTsu>BIHKu8?d6avm;)S?1*L3*_K#EqAgRA?rLjE@%^i>uMM5JpedWoWOKQM ztFrD@)yk?Fk;>{wRe3Hxz-046dRT?d58AH%N^rn`0Qy$uR?^=f=zc~0QPt1w4F8>A z?xFj`)OR<=0P$h{VhRME;r|goY!~*{3A$g5-b>f0htc`-8f^D_AHF>s3wyWK&hxtE zji`8jwt8Pwym(9Q(mBf1i|agB8J82ce*TWF$&0K1Gwk|QU;F~QZZy?%_Ht9m%URi_F_nriOee7&Bc zp7E*b=9e-q6ze;Za(AOS>DO_{i<|0v*7NJv-k*@w_m5vi+#gfbsI^~c?L6_9dC9BA1Am{2ueb3Vbdgv5b@hGq$5g$?+J|(JSNwIgzX!_y zd&}R;Q~B%E@aMmXn7>a#xynend(rpfud6Mnn7+&TrQD9FRrx`@*WS~m7W22?YVGxW z@{8Bb({65hKEK|6Yo8yJ_t(|+K&N$&wVz=P^bObf;9oy2vw!ara>m;Fd*_;BD*o|x Sf1vh5b?{Jb%t`OBzx}_Q^k7;5 diff --git a/planeObj.o b/planeObj.o deleted file mode 100644 index cf16ab65e109218e4175c61fe7e1c757c381c0f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44504 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 diff --git a/prof_output_nogeography b/prof_output_nogeography deleted file mode 100644 index 515e323..0000000 --- a/prof_output_nogeography +++ /dev/null @@ -1,517 +0,0 @@ -Flat profile: - -Each sample counts as 0.01 seconds. - % cumulative self self total - time seconds seconds calls us/call us/call name - 66.67 0.02 0.02 600 33.34 33.34 resolveLabelConflicts - 33.34 0.03 0.01 2147 4.66 4.66 drawTrail - 0.00 0.03 0.00 9666 0.00 0.00 screenDist - 0.00 0.03 0.00 4935 0.00 0.00 mstime - 0.00 0.03 0.00 4608 0.00 0.00 pxFromLonLat - 0.00 0.03 0.00 4608 0.00 0.00 screenCoords - 0.00 0.03 0.00 2831 0.00 0.00 outOfBounds - 0.00 0.03 0.00 2147 0.00 0.00 findPlaneObj - 0.00 0.03 0.00 1770 0.00 0.00 drawStringBG - 0.00 0.03 0.00 1650 0.00 0.00 drawString - 0.00 0.03 0.00 1598 0.00 0.00 CROSSVP - 0.00 0.03 0.00 985 0.00 0.00 drawPlaneText - 0.00 0.03 0.00 656 0.00 0.00 drawSignalMarks - 0.00 0.03 0.00 656 0.00 0.00 setColor - 0.00 0.03 0.00 656 0.00 0.00 signalToColor - 0.00 0.03 0.00 600 0.00 0.00 drawStatusBox - 0.00 0.03 0.00 528 0.00 0.00 drawPlaneHeading - 0.00 0.03 0.00 493 0.00 0.00 modesChecksum - 0.00 0.03 0.00 457 0.00 0.00 drawPlaneOffMap - 0.00 0.03 0.00 387 0.00 0.00 ICAOCacheHashAddress - 0.00 0.03 0.00 386 0.00 0.00 decodeBinMessage - 0.00 0.03 0.00 386 0.00 0.00 decodeModesMessage - 0.00 0.03 0.00 386 0.00 0.00 modesMessageLenByType - 0.00 0.03 0.00 386 0.00 0.00 useModesMessage - 0.00 0.03 0.00 373 0.00 0.00 interactiveFindAircraft - 0.00 0.03 0.00 373 0.00 0.00 interactiveReceiveData - 0.00 0.03 0.00 330 0.00 0.00 cprNLFunction - 0.00 0.03 0.00 324 0.00 0.00 getInput - 0.00 0.03 0.00 323 0.00 92.88 draw - 0.00 0.03 0.00 323 0.00 0.00 interactiveRemoveStaleAircrafts - 0.00 0.03 0.00 323 0.00 0.00 modesReadFromClient - 0.00 0.03 0.00 206 0.00 0.00 addRecentlySeenICAOAddr - 0.00 0.03 0.00 181 0.00 0.00 ICAOAddressWasRecentlySeen - 0.00 0.03 0.00 172 0.00 0.00 sign - 0.00 0.03 0.00 167 0.00 0.00 decodeAC13Field - 0.00 0.03 0.00 165 0.00 0.00 cprModFunction - 0.00 0.03 0.00 150 0.00 0.00 drawGrid - 0.00 0.03 0.00 150 0.00 200.01 drawMap - 0.00 0.03 0.00 150 0.00 0.00 drawStatus - 0.00 0.03 0.00 150 0.00 0.00 updatePlanes - 0.00 0.03 0.00 150 0.00 0.00 updateStatus - 0.00 0.03 0.00 110 0.00 0.00 cprNFunction - 0.00 0.03 0.00 108 0.00 0.00 mstime - 0.00 0.03 0.00 72 0.00 0.00 decodeAC12Field - 0.00 0.03 0.00 72 0.00 0.00 mstime - 0.00 0.03 0.00 55 0.00 0.00 cprDlonFunction - 0.00 0.03 0.00 55 0.00 0.00 decodeCPR - 0.00 0.03 0.00 22 0.00 0.00 decodeID13Field - 0.00 0.03 0.00 19 0.00 0.00 ModeAToModeC - 0.00 0.03 0.00 17 0.00 0.00 createPlaneObj - 0.00 0.03 0.00 17 0.00 0.00 decodeCPRrelative - 0.00 0.03 0.00 17 0.00 0.00 interactiveCreateAircraft - 0.00 0.03 0.00 6 0.00 0.00 interactiveRemoveStaleDF - 0.00 0.03 0.00 5 0.00 0.00 closeFont - 0.00 0.03 0.00 5 0.00 0.00 loadFont - 0.00 0.03 0.00 1 0.00 0.00 anetCreateSocket - 0.00 0.03 0.00 1 0.00 0.00 anetNonBlock - 0.00 0.03 0.00 1 0.00 0.00 anetTcpConnect - 0.00 0.03 0.00 1 0.00 0.00 anetTcpGenericConnect - 0.00 0.03 0.00 1 0.00 0.00 init - 0.00 0.03 0.00 1 0.00 0.00 initMaps - 0.00 0.03 0.00 1 0.00 0.00 modesInitErrorInfo - 0.00 0.03 0.00 1 0.00 0.00 setupConnection - 0.00 0.03 0.00 1 0.00 0.00 view1090Init - 0.00 0.03 0.00 1 0.00 0.00 view1090InitConfig - - % the percentage of the total running time of the -time program used by this function. - -cumulative a running sum of the number of seconds accounted - seconds for by this function and those listed above it. - - self the number of seconds accounted for by this -seconds function alone. This is the major sort for this - listing. - -calls the number of times this function was invoked, if - this function is profiled, else blank. - - self the average number of milliseconds spent in this -ms/call function per call, if this function is profiled, - else blank. - - total the average number of milliseconds spent in this -ms/call function and its descendents per call, if this - function is profiled, else blank. - -name the name of the function. This is the minor sort - for this listing. The index shows the location of - the function in the gprof listing. If the index is - in parenthesis it shows where it would appear in - the gprof listing if it were to be printed. - -Copyright (C) 2012-2018 Free Software Foundation, Inc. - -Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. - - Call graph (explanation follows) - - -granularity: each sample hit covers 2 byte(s) for 33.33% of 0.03 seconds - -index % time self children called name - 0.00 0.03 323/323 main [3] -[1] 100.0 0.00 0.03 323 draw [1] - 0.00 0.03 150/150 drawMap [2] - 0.00 0.00 473/4935 mstime [7] - 0.00 0.00 150/150 updatePlanes [41] - 0.00 0.00 150/150 updateStatus [42] - 0.00 0.00 150/150 drawStatus [40] ------------------------------------------------ - 0.00 0.03 150/150 draw [1] -[2] 100.0 0.00 0.03 150 drawMap [2] - 0.02 0.00 600/600 resolveLabelConflicts [4] - 0.01 0.00 2147/2147 drawTrail [5] - 0.00 0.00 3150/4935 mstime [7] - 0.00 0.00 2152/4608 pxFromLonLat [8] - 0.00 0.00 2152/4608 screenCoords [9] - 0.00 0.00 985/2831 outOfBounds [10] - 0.00 0.00 985/985 drawPlaneText [15] - 0.00 0.00 528/528 drawPlaneHeading [20] - 0.00 0.00 457/457 drawPlaneOffMap [22] - 0.00 0.00 150/150 drawGrid [39] ------------------------------------------------ - -[3] 100.0 0.00 0.03 main [3] - 0.00 0.03 323/323 draw [1] - 0.00 0.00 324/324 getInput [31] - 0.00 0.00 323/323 interactiveRemoveStaleAircrafts [32] - 0.00 0.00 323/323 modesReadFromClient [33] - 0.00 0.00 1/1 view1090InitConfig [66] - 0.00 0.00 1/1 view1090Init [65] - 0.00 0.00 1/1 setupConnection [64] - 0.00 0.00 1/1 init [61] ------------------------------------------------ - 0.02 0.00 600/600 drawMap [2] -[4] 66.7 0.02 0.00 600 resolveLabelConflicts [4] - 0.00 0.00 172/172 sign [36] ------------------------------------------------ - 0.01 0.00 2147/2147 drawMap [2] -[5] 33.3 0.01 0.00 2147 drawTrail [5] - 0.00 0.00 2456/4608 pxFromLonLat [8] - 0.00 0.00 2456/4608 screenCoords [9] - 0.00 0.00 1846/2831 outOfBounds [10] - 0.00 0.00 613/1598 CROSSVP [14] ------------------------------------------------ - 0.00 0.00 450/9666 drawGrid [39] - 0.00 0.00 9216/9666 screenCoords [9] -[6] 0.0 0.00 0.00 9666 screenDist [6] ------------------------------------------------ - 0.00 0.00 473/4935 draw [1] - 0.00 0.00 1312/4935 drawSignalMarks [16] - 0.00 0.00 3150/4935 drawMap [2] -[7] 0.0 0.00 0.00 4935 mstime [7] ------------------------------------------------ - 0.00 0.00 2152/4608 drawMap [2] - 0.00 0.00 2456/4608 drawTrail [5] -[8] 0.0 0.00 0.00 4608 pxFromLonLat [8] ------------------------------------------------ - 0.00 0.00 2152/4608 drawMap [2] - 0.00 0.00 2456/4608 drawTrail [5] -[9] 0.0 0.00 0.00 4608 screenCoords [9] - 0.00 0.00 9216/9666 screenDist [6] ------------------------------------------------ - 0.00 0.00 985/2831 drawMap [2] - 0.00 0.00 1846/2831 drawTrail [5] -[10] 0.0 0.00 0.00 2831 outOfBounds [10] ------------------------------------------------ - 0.00 0.00 2147/2147 updatePlanes [41] -[11] 0.0 0.00 0.00 2147 findPlaneObj [11] ------------------------------------------------ - 0.00 0.00 1770/1770 drawPlaneText [15] -[12] 0.0 0.00 0.00 1770 drawStringBG [12] ------------------------------------------------ - 0.00 0.00 450/1650 drawGrid [39] - 0.00 0.00 1200/1650 drawStatusBox [19] -[13] 0.0 0.00 0.00 1650 drawString [13] ------------------------------------------------ - 0.00 0.00 457/1598 drawPlaneOffMap [22] - 0.00 0.00 528/1598 drawPlaneHeading [20] - 0.00 0.00 613/1598 drawTrail [5] -[14] 0.0 0.00 0.00 1598 CROSSVP [14] ------------------------------------------------ - 0.00 0.00 985/985 drawMap [2] -[15] 0.0 0.00 0.00 985 drawPlaneText [15] - 0.00 0.00 1770/1770 drawStringBG [12] - 0.00 0.00 656/656 drawSignalMarks [16] ------------------------------------------------ - 0.00 0.00 656/656 drawPlaneText [15] -[16] 0.0 0.00 0.00 656 drawSignalMarks [16] - 0.00 0.00 1312/4935 mstime [7] - 0.00 0.00 656/656 signalToColor [18] ------------------------------------------------ - 0.00 0.00 656/656 signalToColor [18] -[17] 0.0 0.00 0.00 656 setColor [17] ------------------------------------------------ - 0.00 0.00 656/656 drawSignalMarks [16] -[18] 0.0 0.00 0.00 656 signalToColor [18] - 0.00 0.00 656/656 setColor [17] ------------------------------------------------ - 0.00 0.00 600/600 drawStatus [40] -[19] 0.0 0.00 0.00 600 drawStatusBox [19] - 0.00 0.00 1200/1650 drawString [13] ------------------------------------------------ - 0.00 0.00 528/528 drawMap [2] -[20] 0.0 0.00 0.00 528 drawPlaneHeading [20] - 0.00 0.00 528/1598 CROSSVP [14] ------------------------------------------------ - 0.00 0.00 107/493 modesInitErrorInfo [63] - 0.00 0.00 386/493 decodeModesMessage [25] -[21] 0.0 0.00 0.00 493 modesChecksum [21] ------------------------------------------------ - 0.00 0.00 457/457 drawMap [2] -[22] 0.0 0.00 0.00 457 drawPlaneOffMap [22] - 0.00 0.00 457/1598 CROSSVP [14] ------------------------------------------------ - 0.00 0.00 181/387 ICAOAddressWasRecentlySeen [35] - 0.00 0.00 206/387 addRecentlySeenICAOAddr [34] -[23] 0.0 0.00 0.00 387 ICAOCacheHashAddress [23] ------------------------------------------------ - 0.00 0.00 386/386 modesReadFromClient [33] -[24] 0.0 0.00 0.00 386 decodeBinMessage [24] - 0.00 0.00 386/386 decodeModesMessage [25] - 0.00 0.00 386/386 useModesMessage [27] ------------------------------------------------ - 0.00 0.00 386/386 decodeBinMessage [24] -[25] 0.0 0.00 0.00 386 decodeModesMessage [25] - 0.00 0.00 386/386 modesMessageLenByType [26] - 0.00 0.00 386/493 modesChecksum [21] - 0.00 0.00 206/206 addRecentlySeenICAOAddr [34] - 0.00 0.00 181/181 ICAOAddressWasRecentlySeen [35] - 0.00 0.00 167/167 decodeAC13Field [37] - 0.00 0.00 72/72 decodeAC12Field [45] - 0.00 0.00 3/22 decodeID13Field [49] ------------------------------------------------ - 0.00 0.00 386/386 decodeModesMessage [25] -[26] 0.0 0.00 0.00 386 modesMessageLenByType [26] ------------------------------------------------ - 0.00 0.00 386/386 decodeBinMessage [24] -[27] 0.0 0.00 0.00 386 useModesMessage [27] - 0.00 0.00 373/373 interactiveReceiveData [29] ------------------------------------------------ - 0.00 0.00 373/373 interactiveReceiveData [29] -[28] 0.0 0.00 0.00 373 interactiveFindAircraft [28] ------------------------------------------------ - 0.00 0.00 373/373 useModesMessage [27] -[29] 0.0 0.00 0.00 373 interactiveReceiveData [29] - 0.00 0.00 373/373 interactiveFindAircraft [28] - 0.00 0.00 72/72 mstime [46] - 0.00 0.00 55/55 decodeCPR [48] - 0.00 0.00 17/17 interactiveCreateAircraft [53] - 0.00 0.00 17/17 decodeCPRrelative [52] ------------------------------------------------ - 0.00 0.00 110/330 cprNFunction [43] - 0.00 0.00 220/330 decodeCPR [48] -[30] 0.0 0.00 0.00 330 cprNLFunction [30] ------------------------------------------------ - 0.00 0.00 324/324 main [3] -[31] 0.0 0.00 0.00 324 getInput [31] ------------------------------------------------ - 0.00 0.00 323/323 main [3] -[32] 0.0 0.00 0.00 323 interactiveRemoveStaleAircrafts [32] - 0.00 0.00 6/6 interactiveRemoveStaleDF [54] ------------------------------------------------ - 0.00 0.00 323/323 main [3] -[33] 0.0 0.00 0.00 323 modesReadFromClient [33] - 0.00 0.00 386/386 decodeBinMessage [24] ------------------------------------------------ - 0.00 0.00 206/206 decodeModesMessage [25] -[34] 0.0 0.00 0.00 206 addRecentlySeenICAOAddr [34] - 0.00 0.00 206/387 ICAOCacheHashAddress [23] ------------------------------------------------ - 0.00 0.00 181/181 decodeModesMessage [25] -[35] 0.0 0.00 0.00 181 ICAOAddressWasRecentlySeen [35] - 0.00 0.00 181/387 ICAOCacheHashAddress [23] ------------------------------------------------ - 0.00 0.00 172/172 resolveLabelConflicts [4] -[36] 0.0 0.00 0.00 172 sign [36] ------------------------------------------------ - 0.00 0.00 167/167 decodeModesMessage [25] -[37] 0.0 0.00 0.00 167 decodeAC13Field [37] - 0.00 0.00 10/22 decodeID13Field [49] - 0.00 0.00 10/19 ModeAToModeC [50] ------------------------------------------------ - 0.00 0.00 165/165 decodeCPR [48] -[38] 0.0 0.00 0.00 165 cprModFunction [38] ------------------------------------------------ - 0.00 0.00 150/150 drawMap [2] -[39] 0.0 0.00 0.00 150 drawGrid [39] - 0.00 0.00 450/9666 screenDist [6] - 0.00 0.00 450/1650 drawString [13] ------------------------------------------------ - 0.00 0.00 150/150 draw [1] -[40] 0.0 0.00 0.00 150 drawStatus [40] - 0.00 0.00 600/600 drawStatusBox [19] ------------------------------------------------ - 0.00 0.00 150/150 draw [1] -[41] 0.0 0.00 0.00 150 updatePlanes [41] - 0.00 0.00 2147/2147 findPlaneObj [11] - 0.00 0.00 108/108 mstime [44] - 0.00 0.00 17/17 createPlaneObj [51] ------------------------------------------------ - 0.00 0.00 150/150 draw [1] -[42] 0.0 0.00 0.00 150 updateStatus [42] ------------------------------------------------ - 0.00 0.00 55/110 cprDlonFunction [47] - 0.00 0.00 55/110 decodeCPR [48] -[43] 0.0 0.00 0.00 110 cprNFunction [43] - 0.00 0.00 110/330 cprNLFunction [30] ------------------------------------------------ - 0.00 0.00 108/108 updatePlanes [41] -[44] 0.0 0.00 0.00 108 mstime [44] ------------------------------------------------ - 0.00 0.00 72/72 decodeModesMessage [25] -[45] 0.0 0.00 0.00 72 decodeAC12Field [45] - 0.00 0.00 9/22 decodeID13Field [49] - 0.00 0.00 9/19 ModeAToModeC [50] ------------------------------------------------ - 0.00 0.00 72/72 interactiveReceiveData [29] -[46] 0.0 0.00 0.00 72 mstime [46] ------------------------------------------------ - 0.00 0.00 55/55 decodeCPR [48] -[47] 0.0 0.00 0.00 55 cprDlonFunction [47] - 0.00 0.00 55/110 cprNFunction [43] ------------------------------------------------ - 0.00 0.00 55/55 interactiveReceiveData [29] -[48] 0.0 0.00 0.00 55 decodeCPR [48] - 0.00 0.00 220/330 cprNLFunction [30] - 0.00 0.00 165/165 cprModFunction [38] - 0.00 0.00 55/110 cprNFunction [43] - 0.00 0.00 55/55 cprDlonFunction [47] ------------------------------------------------ - 0.00 0.00 3/22 decodeModesMessage [25] - 0.00 0.00 9/22 decodeAC12Field [45] - 0.00 0.00 10/22 decodeAC13Field [37] -[49] 0.0 0.00 0.00 22 decodeID13Field [49] ------------------------------------------------ - 0.00 0.00 9/19 decodeAC12Field [45] - 0.00 0.00 10/19 decodeAC13Field [37] -[50] 0.0 0.00 0.00 19 ModeAToModeC [50] ------------------------------------------------ - 0.00 0.00 17/17 updatePlanes [41] -[51] 0.0 0.00 0.00 17 createPlaneObj [51] ------------------------------------------------ - 0.00 0.00 17/17 interactiveReceiveData [29] -[52] 0.0 0.00 0.00 17 decodeCPRrelative [52] ------------------------------------------------ - 0.00 0.00 17/17 interactiveReceiveData [29] -[53] 0.0 0.00 0.00 17 interactiveCreateAircraft [53] ------------------------------------------------ - 0.00 0.00 6/6 interactiveRemoveStaleAircrafts [32] -[54] 0.0 0.00 0.00 6 interactiveRemoveStaleDF [54] ------------------------------------------------ - 0.00 0.00 5/5 cleanup [85] -[55] 0.0 0.00 0.00 5 closeFont [55] ------------------------------------------------ - 0.00 0.00 5/5 init [61] -[56] 0.0 0.00 0.00 5 loadFont [56] ------------------------------------------------ - 0.00 0.00 1/1 anetTcpGenericConnect [60] -[57] 0.0 0.00 0.00 1 anetCreateSocket [57] ------------------------------------------------ - 0.00 0.00 1/1 setupConnection [64] -[58] 0.0 0.00 0.00 1 anetNonBlock [58] ------------------------------------------------ - 0.00 0.00 1/1 setupConnection [64] -[59] 0.0 0.00 0.00 1 anetTcpConnect [59] - 0.00 0.00 1/1 anetTcpGenericConnect [60] ------------------------------------------------ - 0.00 0.00 1/1 anetTcpConnect [59] -[60] 0.0 0.00 0.00 1 anetTcpGenericConnect [60] - 0.00 0.00 1/1 anetCreateSocket [57] ------------------------------------------------ - 0.00 0.00 1/1 main [3] -[61] 0.0 0.00 0.00 1 init [61] - 0.00 0.00 5/5 loadFont [56] - 0.00 0.00 1/1 initMaps [62] ------------------------------------------------ - 0.00 0.00 1/1 init [61] -[62] 0.0 0.00 0.00 1 initMaps [62] ------------------------------------------------ - 0.00 0.00 1/1 view1090Init [65] -[63] 0.0 0.00 0.00 1 modesInitErrorInfo [63] - 0.00 0.00 107/493 modesChecksum [21] ------------------------------------------------ - 0.00 0.00 1/1 main [3] -[64] 0.0 0.00 0.00 1 setupConnection [64] - 0.00 0.00 1/1 anetTcpConnect [59] - 0.00 0.00 1/1 anetNonBlock [58] ------------------------------------------------ - 0.00 0.00 1/1 main [3] -[65] 0.0 0.00 0.00 1 view1090Init [65] - 0.00 0.00 1/1 modesInitErrorInfo [63] ------------------------------------------------ - 0.00 0.00 1/1 main [3] -[66] 0.0 0.00 0.00 1 view1090InitConfig [66] ------------------------------------------------ - - This table describes the call tree of the program, and was sorted by - the total amount of time spent in each function and its children. - - Each entry in this table consists of several lines. The line with the - index number at the left hand margin lists the current function. - The lines above it list the functions that called this function, - and the lines below it list the functions this one called. - This line lists: - index A unique number given to each element of the table. - Index numbers are sorted numerically. - The index number is printed next to every function name so - it is easier to look up where the function is in the table. - - % time This is the percentage of the `total' time that was spent - in this function and its children. Note that due to - different viewpoints, functions excluded by options, etc, - these numbers will NOT add up to 100%. - - self This is the total amount of time spent in this function. - - children This is the total amount of time propagated into this - function by its children. - - called This is the number of times the function was called. - If the function called itself recursively, the number - only includes non-recursive calls, and is followed by - a `+' and the number of recursive calls. - - name The name of the current function. The index number is - printed after it. If the function is a member of a - cycle, the cycle number is printed between the - function's name and the index number. - - - For the function's parents, the fields have the following meanings: - - self This is the amount of time that was propagated directly - from the function into this parent. - - children This is the amount of time that was propagated from - the function's children into this parent. - - called This is the number of times this parent called the - function `/' the total number of times the function - was called. Recursive calls to the function are not - included in the number after the `/'. - - name This is the name of the parent. The parent's index - number is printed after it. If the parent is a - member of a cycle, the cycle number is printed between - the name and the index number. - - If the parents of the function cannot be determined, the word - `' is printed in the `name' field, and all the other - fields are blank. - - For the function's children, the fields have the following meanings: - - self This is the amount of time that was propagated directly - from the child into the function. - - children This is the amount of time that was propagated from the - child's children to the function. - - called This is the number of times the function called - this child `/' the total number of times the child - was called. Recursive calls by the child are not - listed in the number after the `/'. - - name This is the name of the child. The child's index - number is printed after it. If the child is a - member of a cycle, the cycle number is printed - between the name and the index number. - - If there are any cycles (circles) in the call graph, there is an - entry for the cycle-as-a-whole. This entry shows who called the - cycle (as parents) and the members of the cycle (as children.) - The `+' recursive calls entry shows the number of function calls that - were internal to the cycle, and the calls entry for each member shows, - for that member, how many times it was called from other members of - the cycle. - -Copyright (C) 2012-2018 Free Software Foundation, Inc. - -Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. - -Index by function name - - [14] CROSSVP [1] draw [21] modesChecksum - [35] ICAOAddressWasRecentlySeen [39] drawGrid [63] modesInitErrorInfo - [23] ICAOCacheHashAddress [2] drawMap [26] modesMessageLenByType - [50] ModeAToModeC [20] drawPlaneHeading [33] modesReadFromClient - [34] addRecentlySeenICAOAddr [22] drawPlaneOffMap [46] mstime - [57] anetCreateSocket [15] drawPlaneText [44] mstime - [58] anetNonBlock [16] drawSignalMarks [7] mstime - [59] anetTcpConnect [40] drawStatus [10] outOfBounds - [60] anetTcpGenericConnect [19] drawStatusBox [8] pxFromLonLat - [55] closeFont [13] drawString [4] resolveLabelConflicts - [47] cprDlonFunction [12] drawStringBG [9] screenCoords - [38] cprModFunction [5] drawTrail [6] screenDist - [43] cprNFunction [11] findPlaneObj [17] setColor - [30] cprNLFunction [31] getInput [64] setupConnection - [51] createPlaneObj [61] init [36] sign - [45] decodeAC12Field [62] initMaps [18] signalToColor - [37] decodeAC13Field [53] interactiveCreateAircraft [41] updatePlanes - [24] decodeBinMessage [28] interactiveFindAircraft [42] updateStatus - [48] decodeCPR [29] interactiveReceiveData [27] useModesMessage - [52] decodeCPRrelative [32] interactiveRemoveStaleAircrafts [65] view1090Init - [49] decodeID13Field [54] interactiveRemoveStaleDF [66] view1090InitConfig - [25] decodeModesMessage [56] loadFont diff --git a/prof_output_withgeography b/prof_output_withgeography deleted file mode 100644 index 9c55a8a..0000000 --- a/prof_output_withgeography +++ /dev/null @@ -1,517 +0,0 @@ -Flat profile: - -Each sample counts as 0.01 seconds. - % cumulative self self total - time seconds seconds calls ms/call ms/call name - 38.46 0.05 0.05 62 0.81 2.10 drawGeography - 23.08 0.08 0.03 7006834 0.00 0.00 screenDist - 23.08 0.11 0.03 3503324 0.00 0.00 screenCoords - 15.39 0.13 0.02 3508939 0.00 0.00 pxFromLonLat - 0.00 0.13 0.00 3502994 0.00 0.00 outOfBounds - 0.00 0.13 0.00 1057 0.00 0.00 mstime - 0.00 0.13 0.00 698 0.00 0.00 drawTrail - 0.00 0.13 0.00 698 0.00 0.00 findPlaneObj - 0.00 0.13 0.00 682 0.00 0.00 drawString - 0.00 0.13 0.00 510 0.00 0.00 drawStringBG - 0.00 0.13 0.00 478 0.00 0.00 modesChecksum - 0.00 0.13 0.00 372 0.00 0.00 ICAOCacheHashAddress - 0.00 0.13 0.00 371 0.00 0.00 decodeBinMessage - 0.00 0.13 0.00 371 0.00 0.00 decodeModesMessage - 0.00 0.13 0.00 371 0.00 0.00 modesMessageLenByType - 0.00 0.13 0.00 371 0.00 0.00 useModesMessage - 0.00 0.13 0.00 351 0.00 0.00 interactiveFindAircraft - 0.00 0.13 0.00 351 0.00 0.00 interactiveReceiveData - 0.00 0.13 0.00 251 0.00 0.00 CROSSVP - 0.00 0.13 0.00 248 0.00 0.00 drawStatusBox - 0.00 0.13 0.00 248 0.00 0.00 resolveLabelConflicts - 0.00 0.13 0.00 234 0.00 0.00 cprNLFunction - 0.00 0.13 0.00 199 0.00 0.00 ICAOAddressWasRecentlySeen - 0.00 0.13 0.00 178 0.00 0.00 drawPlaneText - 0.00 0.13 0.00 175 0.00 0.00 decodeAC13Field - 0.00 0.13 0.00 173 0.00 0.00 addRecentlySeenICAOAddr - 0.00 0.13 0.00 172 0.00 0.00 sign - 0.00 0.13 0.00 170 0.00 0.00 drawSignalMarks - 0.00 0.13 0.00 170 0.00 0.00 setColor - 0.00 0.13 0.00 170 0.00 0.00 signalToColor - 0.00 0.13 0.00 117 0.00 0.00 cprModFunction - 0.00 0.13 0.00 89 0.00 0.00 drawPlaneHeading - 0.00 0.13 0.00 89 0.00 0.00 drawPlaneOffMap - 0.00 0.13 0.00 82 0.00 0.00 mstime - 0.00 0.13 0.00 78 0.00 0.00 cprNFunction - 0.00 0.13 0.00 63 0.00 0.00 getInput - 0.00 0.13 0.00 62 0.00 2.10 draw - 0.00 0.13 0.00 62 0.00 0.00 drawGrid - 0.00 0.13 0.00 62 0.00 2.10 drawMap - 0.00 0.13 0.00 62 0.00 0.00 drawStatus - 0.00 0.13 0.00 62 0.00 0.00 interactiveRemoveStaleAircrafts - 0.00 0.13 0.00 62 0.00 0.00 modesReadFromClient - 0.00 0.13 0.00 62 0.00 0.00 updatePlanes - 0.00 0.13 0.00 62 0.00 0.00 updateStatus - 0.00 0.13 0.00 57 0.00 0.00 decodeAC12Field - 0.00 0.13 0.00 57 0.00 0.00 mstime - 0.00 0.13 0.00 39 0.00 0.00 cprDlonFunction - 0.00 0.13 0.00 39 0.00 0.00 decodeCPR - 0.00 0.13 0.00 18 0.00 0.00 decodeCPRrelative - 0.00 0.13 0.00 13 0.00 0.00 createPlaneObj - 0.00 0.13 0.00 13 0.00 0.00 interactiveCreateAircraft - 0.00 0.13 0.00 7 0.00 0.00 decodeID13Field - 0.00 0.13 0.00 6 0.00 0.00 interactiveRemoveStaleDF - 0.00 0.13 0.00 5 0.00 0.00 closeFont - 0.00 0.13 0.00 5 0.00 0.00 loadFont - 0.00 0.13 0.00 1 0.00 0.00 anetCreateSocket - 0.00 0.13 0.00 1 0.00 0.00 anetNonBlock - 0.00 0.13 0.00 1 0.00 0.00 anetTcpConnect - 0.00 0.13 0.00 1 0.00 0.00 anetTcpGenericConnect - 0.00 0.13 0.00 1 0.00 0.00 init - 0.00 0.13 0.00 1 0.00 0.00 initMaps - 0.00 0.13 0.00 1 0.00 0.00 modesInitErrorInfo - 0.00 0.13 0.00 1 0.00 0.00 setupConnection - 0.00 0.13 0.00 1 0.00 0.00 view1090Init - 0.00 0.13 0.00 1 0.00 0.00 view1090InitConfig - - % the percentage of the total running time of the -time program used by this function. - -cumulative a running sum of the number of seconds accounted - seconds for by this function and those listed above it. - - self the number of seconds accounted for by this -seconds function alone. This is the major sort for this - listing. - -calls the number of times this function was invoked, if - this function is profiled, else blank. - - self the average number of milliseconds spent in this -ms/call function per call, if this function is profiled, - else blank. - - total the average number of milliseconds spent in this -ms/call function and its descendents per call, if this - function is profiled, else blank. - -name the name of the function. This is the minor sort - for this listing. The index shows the location of - the function in the gprof listing. If the index is - in parenthesis it shows where it would appear in - the gprof listing if it were to be printed. - -Copyright (C) 2012-2018 Free Software Foundation, Inc. - -Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. - - Call graph (explanation follows) - - -granularity: each sample hit covers 2 byte(s) for 7.69% of 0.13 seconds - -index % time self children called name - 0.00 0.13 62/62 main [3] -[1] 100.0 0.00 0.13 62 draw [1] - 0.00 0.13 62/62 drawMap [2] - 0.00 0.00 124/1057 mstime [11] - 0.00 0.00 62/62 updatePlanes [44] - 0.00 0.00 62/62 updateStatus [45] - 0.00 0.00 62/62 drawStatus [41] ------------------------------------------------ - 0.00 0.13 62/62 draw [1] -[2] 100.0 0.00 0.13 62 drawMap [2] - 0.05 0.08 62/62 drawGeography [4] - 0.00 0.00 698/698 drawTrail [8] - 0.00 0.00 406/3503324 screenCoords [5] - 0.00 0.00 406/3508939 pxFromLonLat [7] - 0.00 0.00 62/62 drawGrid [9] - 0.00 0.00 593/1057 mstime [11] - 0.00 0.00 248/248 resolveLabelConflicts [25] - 0.00 0.00 178/3502994 outOfBounds [10] - 0.00 0.00 178/178 drawPlaneText [28] - 0.00 0.00 89/89 drawPlaneOffMap [37] - 0.00 0.00 89/89 drawPlaneHeading [36] ------------------------------------------------ - -[3] 100.0 0.00 0.13 main [3] - 0.00 0.13 62/62 draw [1] - 0.00 0.00 63/63 getInput [40] - 0.00 0.00 62/62 interactiveRemoveStaleAircrafts [42] - 0.00 0.00 62/62 modesReadFromClient [43] - 0.00 0.00 1/1 view1090InitConfig [66] - 0.00 0.00 1/1 view1090Init [65] - 0.00 0.00 1/1 setupConnection [64] - 0.00 0.00 1/1 init [61] ------------------------------------------------ - 0.05 0.08 62/62 drawMap [2] -[4] 100.0 0.05 0.08 62 drawGeography [4] - 0.03 0.03 3502560/3503324 screenCoords [5] - 0.02 0.00 3508175/3508939 pxFromLonLat [7] - 0.00 0.00 3502560/3502994 outOfBounds [10] ------------------------------------------------ - 0.00 0.00 358/3503324 drawTrail [8] - 0.00 0.00 406/3503324 drawMap [2] - 0.03 0.03 3502560/3503324 drawGeography [4] -[5] 46.2 0.03 0.03 3503324 screenCoords [5] - 0.03 0.00 7006648/7006834 screenDist [6] ------------------------------------------------ - 0.00 0.00 186/7006834 drawGrid [9] - 0.03 0.00 7006648/7006834 screenCoords [5] -[6] 23.1 0.03 0.00 7006834 screenDist [6] ------------------------------------------------ - 0.00 0.00 358/3508939 drawTrail [8] - 0.00 0.00 406/3508939 drawMap [2] - 0.02 0.00 3508175/3508939 drawGeography [4] -[7] 15.4 0.02 0.00 3508939 pxFromLonLat [7] ------------------------------------------------ - 0.00 0.00 698/698 drawMap [2] -[8] 0.0 0.00 0.00 698 drawTrail [8] - 0.00 0.00 358/3503324 screenCoords [5] - 0.00 0.00 358/3508939 pxFromLonLat [7] - 0.00 0.00 256/3502994 outOfBounds [10] - 0.00 0.00 73/251 CROSSVP [23] ------------------------------------------------ - 0.00 0.00 62/62 drawMap [2] -[9] 0.0 0.00 0.00 62 drawGrid [9] - 0.00 0.00 186/7006834 screenDist [6] - 0.00 0.00 186/682 drawString [13] ------------------------------------------------ - 0.00 0.00 178/3502994 drawMap [2] - 0.00 0.00 256/3502994 drawTrail [8] - 0.00 0.00 3502560/3502994 drawGeography [4] -[10] 0.0 0.00 0.00 3502994 outOfBounds [10] ------------------------------------------------ - 0.00 0.00 124/1057 draw [1] - 0.00 0.00 340/1057 drawSignalMarks [32] - 0.00 0.00 593/1057 drawMap [2] -[11] 0.0 0.00 0.00 1057 mstime [11] ------------------------------------------------ - 0.00 0.00 698/698 updatePlanes [44] -[12] 0.0 0.00 0.00 698 findPlaneObj [12] ------------------------------------------------ - 0.00 0.00 186/682 drawGrid [9] - 0.00 0.00 496/682 drawStatusBox [24] -[13] 0.0 0.00 0.00 682 drawString [13] ------------------------------------------------ - 0.00 0.00 510/510 drawPlaneText [28] -[14] 0.0 0.00 0.00 510 drawStringBG [14] ------------------------------------------------ - 0.00 0.00 107/478 modesInitErrorInfo [63] - 0.00 0.00 371/478 decodeModesMessage [18] -[15] 0.0 0.00 0.00 478 modesChecksum [15] ------------------------------------------------ - 0.00 0.00 173/372 addRecentlySeenICAOAddr [30] - 0.00 0.00 199/372 ICAOAddressWasRecentlySeen [27] -[16] 0.0 0.00 0.00 372 ICAOCacheHashAddress [16] ------------------------------------------------ - 0.00 0.00 371/371 modesReadFromClient [43] -[17] 0.0 0.00 0.00 371 decodeBinMessage [17] - 0.00 0.00 371/371 decodeModesMessage [18] - 0.00 0.00 371/371 useModesMessage [20] ------------------------------------------------ - 0.00 0.00 371/371 decodeBinMessage [17] -[18] 0.0 0.00 0.00 371 decodeModesMessage [18] - 0.00 0.00 371/371 modesMessageLenByType [19] - 0.00 0.00 371/478 modesChecksum [15] - 0.00 0.00 199/199 ICAOAddressWasRecentlySeen [27] - 0.00 0.00 175/175 decodeAC13Field [29] - 0.00 0.00 173/173 addRecentlySeenICAOAddr [30] - 0.00 0.00 57/57 decodeAC12Field [46] - 0.00 0.00 7/7 decodeID13Field [53] ------------------------------------------------ - 0.00 0.00 371/371 decodeModesMessage [18] -[19] 0.0 0.00 0.00 371 modesMessageLenByType [19] ------------------------------------------------ - 0.00 0.00 371/371 decodeBinMessage [17] -[20] 0.0 0.00 0.00 371 useModesMessage [20] - 0.00 0.00 351/351 interactiveReceiveData [22] ------------------------------------------------ - 0.00 0.00 351/351 interactiveReceiveData [22] -[21] 0.0 0.00 0.00 351 interactiveFindAircraft [21] ------------------------------------------------ - 0.00 0.00 351/351 useModesMessage [20] -[22] 0.0 0.00 0.00 351 interactiveReceiveData [22] - 0.00 0.00 351/351 interactiveFindAircraft [21] - 0.00 0.00 57/57 mstime [47] - 0.00 0.00 39/39 decodeCPR [49] - 0.00 0.00 18/18 decodeCPRrelative [50] - 0.00 0.00 13/13 interactiveCreateAircraft [52] ------------------------------------------------ - 0.00 0.00 73/251 drawTrail [8] - 0.00 0.00 89/251 drawPlaneOffMap [37] - 0.00 0.00 89/251 drawPlaneHeading [36] -[23] 0.0 0.00 0.00 251 CROSSVP [23] ------------------------------------------------ - 0.00 0.00 248/248 drawStatus [41] -[24] 0.0 0.00 0.00 248 drawStatusBox [24] - 0.00 0.00 496/682 drawString [13] ------------------------------------------------ - 0.00 0.00 248/248 drawMap [2] -[25] 0.0 0.00 0.00 248 resolveLabelConflicts [25] - 0.00 0.00 172/172 sign [31] ------------------------------------------------ - 0.00 0.00 78/234 cprNFunction [39] - 0.00 0.00 156/234 decodeCPR [49] -[26] 0.0 0.00 0.00 234 cprNLFunction [26] ------------------------------------------------ - 0.00 0.00 199/199 decodeModesMessage [18] -[27] 0.0 0.00 0.00 199 ICAOAddressWasRecentlySeen [27] - 0.00 0.00 199/372 ICAOCacheHashAddress [16] ------------------------------------------------ - 0.00 0.00 178/178 drawMap [2] -[28] 0.0 0.00 0.00 178 drawPlaneText [28] - 0.00 0.00 510/510 drawStringBG [14] - 0.00 0.00 170/170 drawSignalMarks [32] ------------------------------------------------ - 0.00 0.00 175/175 decodeModesMessage [18] -[29] 0.0 0.00 0.00 175 decodeAC13Field [29] ------------------------------------------------ - 0.00 0.00 173/173 decodeModesMessage [18] -[30] 0.0 0.00 0.00 173 addRecentlySeenICAOAddr [30] - 0.00 0.00 173/372 ICAOCacheHashAddress [16] ------------------------------------------------ - 0.00 0.00 172/172 resolveLabelConflicts [25] -[31] 0.0 0.00 0.00 172 sign [31] ------------------------------------------------ - 0.00 0.00 170/170 drawPlaneText [28] -[32] 0.0 0.00 0.00 170 drawSignalMarks [32] - 0.00 0.00 340/1057 mstime [11] - 0.00 0.00 170/170 signalToColor [34] ------------------------------------------------ - 0.00 0.00 170/170 signalToColor [34] -[33] 0.0 0.00 0.00 170 setColor [33] ------------------------------------------------ - 0.00 0.00 170/170 drawSignalMarks [32] -[34] 0.0 0.00 0.00 170 signalToColor [34] - 0.00 0.00 170/170 setColor [33] ------------------------------------------------ - 0.00 0.00 117/117 decodeCPR [49] -[35] 0.0 0.00 0.00 117 cprModFunction [35] ------------------------------------------------ - 0.00 0.00 89/89 drawMap [2] -[36] 0.0 0.00 0.00 89 drawPlaneHeading [36] - 0.00 0.00 89/251 CROSSVP [23] ------------------------------------------------ - 0.00 0.00 89/89 drawMap [2] -[37] 0.0 0.00 0.00 89 drawPlaneOffMap [37] - 0.00 0.00 89/251 CROSSVP [23] ------------------------------------------------ - 0.00 0.00 82/82 updatePlanes [44] -[38] 0.0 0.00 0.00 82 mstime [38] ------------------------------------------------ - 0.00 0.00 39/78 cprDlonFunction [48] - 0.00 0.00 39/78 decodeCPR [49] -[39] 0.0 0.00 0.00 78 cprNFunction [39] - 0.00 0.00 78/234 cprNLFunction [26] ------------------------------------------------ - 0.00 0.00 63/63 main [3] -[40] 0.0 0.00 0.00 63 getInput [40] ------------------------------------------------ - 0.00 0.00 62/62 draw [1] -[41] 0.0 0.00 0.00 62 drawStatus [41] - 0.00 0.00 248/248 drawStatusBox [24] ------------------------------------------------ - 0.00 0.00 62/62 main [3] -[42] 0.0 0.00 0.00 62 interactiveRemoveStaleAircrafts [42] - 0.00 0.00 6/6 interactiveRemoveStaleDF [54] ------------------------------------------------ - 0.00 0.00 62/62 main [3] -[43] 0.0 0.00 0.00 62 modesReadFromClient [43] - 0.00 0.00 371/371 decodeBinMessage [17] ------------------------------------------------ - 0.00 0.00 62/62 draw [1] -[44] 0.0 0.00 0.00 62 updatePlanes [44] - 0.00 0.00 698/698 findPlaneObj [12] - 0.00 0.00 82/82 mstime [38] - 0.00 0.00 13/13 createPlaneObj [51] ------------------------------------------------ - 0.00 0.00 62/62 draw [1] -[45] 0.0 0.00 0.00 62 updateStatus [45] ------------------------------------------------ - 0.00 0.00 57/57 decodeModesMessage [18] -[46] 0.0 0.00 0.00 57 decodeAC12Field [46] ------------------------------------------------ - 0.00 0.00 57/57 interactiveReceiveData [22] -[47] 0.0 0.00 0.00 57 mstime [47] ------------------------------------------------ - 0.00 0.00 39/39 decodeCPR [49] -[48] 0.0 0.00 0.00 39 cprDlonFunction [48] - 0.00 0.00 39/78 cprNFunction [39] ------------------------------------------------ - 0.00 0.00 39/39 interactiveReceiveData [22] -[49] 0.0 0.00 0.00 39 decodeCPR [49] - 0.00 0.00 156/234 cprNLFunction [26] - 0.00 0.00 117/117 cprModFunction [35] - 0.00 0.00 39/78 cprNFunction [39] - 0.00 0.00 39/39 cprDlonFunction [48] ------------------------------------------------ - 0.00 0.00 18/18 interactiveReceiveData [22] -[50] 0.0 0.00 0.00 18 decodeCPRrelative [50] ------------------------------------------------ - 0.00 0.00 13/13 updatePlanes [44] -[51] 0.0 0.00 0.00 13 createPlaneObj [51] ------------------------------------------------ - 0.00 0.00 13/13 interactiveReceiveData [22] -[52] 0.0 0.00 0.00 13 interactiveCreateAircraft [52] ------------------------------------------------ - 0.00 0.00 7/7 decodeModesMessage [18] -[53] 0.0 0.00 0.00 7 decodeID13Field [53] ------------------------------------------------ - 0.00 0.00 6/6 interactiveRemoveStaleAircrafts [42] -[54] 0.0 0.00 0.00 6 interactiveRemoveStaleDF [54] ------------------------------------------------ - 0.00 0.00 5/5 cleanup [86] -[55] 0.0 0.00 0.00 5 closeFont [55] ------------------------------------------------ - 0.00 0.00 5/5 init [61] -[56] 0.0 0.00 0.00 5 loadFont [56] ------------------------------------------------ - 0.00 0.00 1/1 anetTcpGenericConnect [60] -[57] 0.0 0.00 0.00 1 anetCreateSocket [57] ------------------------------------------------ - 0.00 0.00 1/1 setupConnection [64] -[58] 0.0 0.00 0.00 1 anetNonBlock [58] ------------------------------------------------ - 0.00 0.00 1/1 setupConnection [64] -[59] 0.0 0.00 0.00 1 anetTcpConnect [59] - 0.00 0.00 1/1 anetTcpGenericConnect [60] ------------------------------------------------ - 0.00 0.00 1/1 anetTcpConnect [59] -[60] 0.0 0.00 0.00 1 anetTcpGenericConnect [60] - 0.00 0.00 1/1 anetCreateSocket [57] ------------------------------------------------ - 0.00 0.00 1/1 main [3] -[61] 0.0 0.00 0.00 1 init [61] - 0.00 0.00 5/5 loadFont [56] - 0.00 0.00 1/1 initMaps [62] ------------------------------------------------ - 0.00 0.00 1/1 init [61] -[62] 0.0 0.00 0.00 1 initMaps [62] ------------------------------------------------ - 0.00 0.00 1/1 view1090Init [65] -[63] 0.0 0.00 0.00 1 modesInitErrorInfo [63] - 0.00 0.00 107/478 modesChecksum [15] ------------------------------------------------ - 0.00 0.00 1/1 main [3] -[64] 0.0 0.00 0.00 1 setupConnection [64] - 0.00 0.00 1/1 anetTcpConnect [59] - 0.00 0.00 1/1 anetNonBlock [58] ------------------------------------------------ - 0.00 0.00 1/1 main [3] -[65] 0.0 0.00 0.00 1 view1090Init [65] - 0.00 0.00 1/1 modesInitErrorInfo [63] ------------------------------------------------ - 0.00 0.00 1/1 main [3] -[66] 0.0 0.00 0.00 1 view1090InitConfig [66] ------------------------------------------------ - - This table describes the call tree of the program, and was sorted by - the total amount of time spent in each function and its children. - - Each entry in this table consists of several lines. The line with the - index number at the left hand margin lists the current function. - The lines above it list the functions that called this function, - and the lines below it list the functions this one called. - This line lists: - index A unique number given to each element of the table. - Index numbers are sorted numerically. - The index number is printed next to every function name so - it is easier to look up where the function is in the table. - - % time This is the percentage of the `total' time that was spent - in this function and its children. Note that due to - different viewpoints, functions excluded by options, etc, - these numbers will NOT add up to 100%. - - self This is the total amount of time spent in this function. - - children This is the total amount of time propagated into this - function by its children. - - called This is the number of times the function was called. - If the function called itself recursively, the number - only includes non-recursive calls, and is followed by - a `+' and the number of recursive calls. - - name The name of the current function. The index number is - printed after it. If the function is a member of a - cycle, the cycle number is printed between the - function's name and the index number. - - - For the function's parents, the fields have the following meanings: - - self This is the amount of time that was propagated directly - from the function into this parent. - - children This is the amount of time that was propagated from - the function's children into this parent. - - called This is the number of times this parent called the - function `/' the total number of times the function - was called. Recursive calls to the function are not - included in the number after the `/'. - - name This is the name of the parent. The parent's index - number is printed after it. If the parent is a - member of a cycle, the cycle number is printed between - the name and the index number. - - If the parents of the function cannot be determined, the word - `' is printed in the `name' field, and all the other - fields are blank. - - For the function's children, the fields have the following meanings: - - self This is the amount of time that was propagated directly - from the child into the function. - - children This is the amount of time that was propagated from the - child's children to the function. - - called This is the number of times the function called - this child `/' the total number of times the child - was called. Recursive calls by the child are not - listed in the number after the `/'. - - name This is the name of the child. The child's index - number is printed after it. If the child is a - member of a cycle, the cycle number is printed - between the name and the index number. - - If there are any cycles (circles) in the call graph, there is an - entry for the cycle-as-a-whole. This entry shows who called the - cycle (as parents) and the members of the cycle (as children.) - The `+' recursive calls entry shows the number of function calls that - were internal to the cycle, and the calls entry for each member shows, - for that member, how many times it was called from other members of - the cycle. - -Copyright (C) 2012-2018 Free Software Foundation, Inc. - -Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. - -Index by function name - - [23] CROSSVP [4] drawGeography [15] modesChecksum - [27] ICAOAddressWasRecentlySeen [9] drawGrid [63] modesInitErrorInfo - [16] ICAOCacheHashAddress [2] drawMap [19] modesMessageLenByType - [30] addRecentlySeenICAOAddr [36] drawPlaneHeading [43] modesReadFromClient - [57] anetCreateSocket [37] drawPlaneOffMap [47] mstime - [58] anetNonBlock [28] drawPlaneText [38] mstime - [59] anetTcpConnect [32] drawSignalMarks [11] mstime - [60] anetTcpGenericConnect [41] drawStatus [10] outOfBounds - [55] closeFont [24] drawStatusBox [7] pxFromLonLat - [48] cprDlonFunction [13] drawString [25] resolveLabelConflicts - [35] cprModFunction [14] drawStringBG [5] screenCoords - [39] cprNFunction [8] drawTrail [6] screenDist - [26] cprNLFunction [12] findPlaneObj [33] setColor - [51] createPlaneObj [40] getInput [64] setupConnection - [46] decodeAC12Field [61] init [31] sign - [29] decodeAC13Field [62] initMaps [34] signalToColor - [17] decodeBinMessage [52] interactiveCreateAircraft [44] updatePlanes - [49] decodeCPR [21] interactiveFindAircraft [45] updateStatus - [50] decodeCPRrelative [22] interactiveReceiveData [20] useModesMessage - [53] decodeID13Field [42] interactiveRemoveStaleAircrafts [65] view1090Init - [18] decodeModesMessage [54] interactiveRemoveStaleDF [66] view1090InitConfig - [1] draw [56] loadFont diff --git a/states.svg.REMOVED.git-id b/states.svg.REMOVED.git-id deleted file mode 100644 index f94f7f4..0000000 --- a/states.svg.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -e0401e269cca0eea688090bd3b3254ca87db9834 \ No newline at end of file diff --git a/status.o.REMOVED.git-id b/status.o.REMOVED.git-id deleted file mode 100644 index 11d6b20..0000000 --- a/status.o.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -bf0a21d45c74ca1ec5086a28d3c765f51ca09193 \ No newline at end of file diff --git a/testfiles/modes1.bin.REMOVED.git-id b/testfiles/modes1.bin.REMOVED.git-id deleted file mode 100644 index fec9d3f..0000000 --- a/testfiles/modes1.bin.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -62f7f97e41c0ad19d03f7bfd16da920c9b6b096b \ No newline at end of file diff --git a/testing.svg b/testing.svg deleted file mode 100644 index 3ab5971..0000000 --- a/testing.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - -Polygon - - - - - --122.00493847.118663 - - - - diff --git a/tools/debug.html b/tools/debug.html deleted file mode 100644 index 4d56d34..0000000 --- a/tools/debug.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - -

-
-
- - - - - diff --git a/view1090.REMOVED.git-id b/view1090.REMOVED.git-id index 63f1aa0..de1d1bd 100644 --- a/view1090.REMOVED.git-id +++ b/view1090.REMOVED.git-id @@ -1 +1 @@ -57081b3b8e95e553e4b5ef8d741befabb4cbbcdd \ No newline at end of file +9ff39d15cbd3fab99fcdbff1a18051b256c66b1a \ No newline at end of file diff --git a/view1090.c b/view1090.c index d2a32cb..bfd0762 100644 --- a/view1090.c +++ b/view1090.c @@ -163,8 +163,8 @@ int setupConnection(struct client *c) { Modes.clients = c; // replace with gps - Modes.fUserLat = ***REMOVED***; - Modes.fUserLon = ***REMOVED***; + Modes.fUserLat = 47.6611754; + Modes.fUserLon = -122.3562983; appData.centerLon = Modes.fUserLon; appData.centerLat = Modes.fUserLat; } diff --git a/view1090.dSYM/Contents/Info.plist b/view1090.dSYM/Contents/Info.plist deleted file mode 100644 index 1ddd71d..0000000 --- a/view1090.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.view1090 - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/view1090.dSYM/Contents/Resources/DWARF/view1090.REMOVED.git-id b/view1090.dSYM/Contents/Resources/DWARF/view1090.REMOVED.git-id deleted file mode 100644 index 05b4fe9..0000000 --- a/view1090.dSYM/Contents/Resources/DWARF/view1090.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -8090a053ba2c7c31e5b2cfc5870918d933a99849 \ No newline at end of file diff --git a/view1090.o.REMOVED.git-id b/view1090.o.REMOVED.git-id deleted file mode 100644 index 9094a2b..0000000 --- a/view1090.o.REMOVED.git-id +++ /dev/null @@ -1 +0,0 @@ -14bceef428bd087e58e4552f6ee11d3afc8586ed \ No newline at end of file

sd8o@(3inYDA80g!c-6<;vxpF^)5; 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 WZt)XvWW$$LI_JXTk_qFeYyBT;gTVO! diff --git a/dump1090/view1090.REMOVED.git-id b/dump1090/view1090.REMOVED.git-id index 829e152..a41cd58 100644 --- a/dump1090/view1090.REMOVED.git-id +++ b/dump1090/view1090.REMOVED.git-id @@ -1 +1 @@ -60deaf6a9ce941e4cfaa1b5db651750171d63f37 \ No newline at end of file +a747e61e42f6d5e47b99924389b8df5fa0c11786 \ No newline at end of file diff --git a/dump1090/view1090.o b/dump1090/view1090.o index a9231fc001b09429d43ac3e03493b9f8bdb459f1..ed822246aeb6c45a50e0cb0e3f5a4a3bb1ab7e8f 100644 GIT binary patch literal 28860 zcmb__dwdkt`S+QfO|nTK2@oZ)F|J&rl1&03A|ix9kU)SK0^+U9Cc8;iHoNQY22f~C zxhN`awMA5nTe!pj)*&QPNyuUx* z;WPU^&*ePlInTMwnKLutrlyufhG8iCFjS?=Qc7JD)smb#4V9`~jngSlL)BkgYVepU z89esksZ)RT)C>$6zQJQV&f7ZV>HpygD!C6=4H=M+II!$!IdrKvtz=+mq;K$uA@m;K zAC8nGZ{5VLLzI_7ZtIRX@TsHjx4v|IOuH^p|IjAwQSUT6>JLYp`U&_)-*z<&4DD(i z81f*GTMZtW@3;KOL7H+Od}g_6_+YFZJeJr$Fl4H4pP=pXr?w64srmI0rM3^bOSTW? zB2PQY-B(jT*wW&`V{>40&BSd(*UZ>9v=$fw)^u(gs)MaL z=C+|(W46JUPaRE2jO?1t>{E*MED^sOi~((*KF)HaYb5O|u>77he_%+d)?@v~wxL?3 z3aIb8z>>YZY1bQd>jvIrUIRRc zd<~nvqw}CI6c{yIwO&cX4^JRgubteTo@qKsCwN2@}cpgyYRb3;?4o$P+2 zxJ$Tx~rkzL_dVkhtobrAffxm+QB1>(Ki;OO(VtIkCsooOUK+$iDRl^ z@JK%DPQJTj@Cf?|+gR1yJTwC5zQ*lCo`#!;+&J&=K>tABIK54E`@L4D3mrW2){3gX zl%fx+e)Ro4mOYN2hEl7Y4YlT&(J=T_u2Rn;&ui1_28QzB1IN^f30q-*%@IG^&wcq9 z|6GbZ?7#HMNNhXmQCA#MYX`rI{`+nBo#@x-4`|~thRSs@y;iC5)IU5%`V{4ZkPlLR z)v=(+pLWR61_jKs*TF;m#~3xtv+|g`=2JuHvfA!0ht72H5;L;C)9)IL?E~l&YdQyp zYG&Mx{ZOp)O z(Jqv+u2({rZ9&>CwokfFFT=LWa!#P0hUzHVNt^xO_R^ml)4*5AeOwNv~kK)-kT zdJpvIYaM*O3ObDQY&pA8}>CMEP3p@(4PaCTd4nX z;np`QA>R+0am^bYDVU8KUkva}LqeO3?t=G_c z6w}f8hcT})pWROfkuS$Lcw{&9l=_^O?GPP%zT50WoiKJbYn{&y)q$oBTdt=W{7lPH zY7Wj8oNI7KahAflhQ?yG8R=$t+}|y7wYRx=)`Jp!bw|wHIlP^wf@=~|BM>^)Ykbn7ySQptqRs6 zv2-{Y>`X`2hwXBS%?@^NJQVgN!(GX6swWezc+8jTOoqd;(`{5G;~P@GIkCRpxxQt= zjXoqgPz^*~3nDR}vp{XRG8FC#_C?dE>dfQf{)Fu z>+4VvU;BbqUt>6kD#ZKJ3G_);Cmi!p?#tF8({ouBF_nlX)4nP&W4b@qfi*U=+6&{R6sz2Q_U*p2XRh@^Xb9m)7Q z#A`v@0)#7)>Wud#Aq?p_#jCm^8|~~FwC$wOUeRz>M#gp|TRj-GH6kEF+A)yzs2|4rhz`c`M|d(SH6K0B!gx%hRV^gxhogItMr>@pl>{#v zYb%egl3Ep87mII*`Ows{c-j|^#rwK@e8FUQUvD^uc(Hqf>$~}4iyb|DP0Xy$qsw>YwpqKZbA0z4Ze1MAPz0b7A^A&iO_W{!* zJV)`H_aW0Io;`3O?-bLe`G0~BdCDMBmcJHp$TKuio_{-B&vR+QmtSRoaBE^x{?C~| zM-!F#>uESw6VvinVvUgJF}@5BYw|mor@;6Ih`Ri_2x{I4gAUKizn6}cXkt$OM0zmV zxDk?u{Og(LY-28nh52o)%UGiY#G?G)vCuN(Td;On{@=mMD>r@!VsZZ2v^Lq;30`ad z?^p%Du@}Ue{KF)wHE~V;pGnkcVr~ALBx*Gg%Ks;c>BeN_>B+yEfvwZNMf0Dh>3ZWS zl#@^eKZQaB$->VgVX6`LGVb^0m4P)PZ;+Mt6f$UEW>R^IY3VDhzT0yi1M_v(-h=i{ zfS2oLn`)b^hPFvA3((wO+uW(t1u>H4yCR5CZr692_aglK+t$icuE#-pmflCLTj6;A z(-$ai5#dNkf7g5h|_JgbP zUI4o+|I%-O@Zj!4<)JJt)uP`8aE_mgy4DtBhoj z=`zns>UXej`8;pabSLvp@=RkiLQGexqMH0GAEZmVUg5Jd-gRlN_O3e!RjXd#hg{dI zTDiCi&hMd@sMmE2u~n~VwqCtfy_!&?{Mggb&|T$2+sL^VT?C)C(LA(rDTvXovrxT) zT8=B%g&2wjGw7}Bd34u;*{q!DcCSKMO^=%!9eH0v0V4{}{Uq{wPC~!%Ja#nY*@g%d zPM{gLXBA8qPF#s}u4f9*Ubpch*dk0H`o1H{Eqn&eoA%7^LkN;XQcNP8a{?h zBhR5R<@p%X71}?~ICO)N=URoh&=ezmOy?@s0}vEd3?c7XPa=8tH%Icer1*&$AUuO0 zihsnU8rv08#rs*H+j9{N7yp=PkLN)YUi>7}BgW!}LKQ!CG1N=oCho+n&@BO@jN=<& z$omrtzo+=8U!>1hGw;uQ&{Lk>Y?_~w?e<&;M)9-Q#Z;x935ZnjFKEBq^DF8+$F$G0 zh3V&+p5(cmee?yUD?KTuf62&B^L&*$2biw$JWc+uE<{ z<3$SlusR;zLY_ zJk!x|#eZPB$MYy{{*mdZ2YVW-_)qj9;mJdQiVriraV!@F#YZkhx_>Oznv&k(>1DY` znfDH>S&n@ZCGN5!%%tv|=-h6GJI?^8rufy-=v$uaSj9gxsXX^GeS&GXrxCx!e_>va z6}HzHsu7+b-T5osDY2U9bv9Ai*xppPDt@C3xyn(@|3N-IT~>mj3m>V*mAH%legH*y zevD==e%p--E6)>j{Ts6%h7=IMf7~Z37 z4P`6@l`zWLr44;q+H80qVJ4UHF4X%C@1IzbY0$_Q~O-r(Tx1r zntI&jZKBPwdWo^$<^2Q8E7P*4UEVH6Vw{%!%;n8tzVTZ2oXh(IQa&v^;PSppug}x6 zmt5W(m~Von4!XQIQZ`Xjhu~*$gDRe+slzVscFd8*lQnhR>;Y+^ELI3%li}bz~T!ub<*WM!FXP%srOypyV%gvG^I@M8|+b4 znsS@o`&b9RraY!MmsYAZHNx~RV@ua)s>Jj@!2w&VsZ!IsomQr6s?78zDVw3Ga?`t& zp4I8N_)PBz`Z80?CYjz37~OhJRhr(j*r6}d)HKt}MMCi`P1V3p#^qv7)tTPMScln~ znq_+H>DeWknqzw3XL)lp)nIz()3Zx8wb1l#Wc}u9YO(44Jbjs`sTR}gW$6u?YDL{y z`T~Qq%^K6|XXF=ZYOU$5U=L~1nmwj>6H8cZaI%P+UXI`5W<$?jruTnnbBV#pW25PP zkX|p-`8LB(`m)^M;O{rf6AKrq;uQv`pLXG}de@U`*VO%{ zcL%9entH(WP9n8hQxBWoYI=5sruLZLDJ*@BruLfNwXENjn%ZZ23)l|V8ly4B9*1Xa z_kfl?ZF(;vwN_I3x~4(xIsXruTW4*Qu$OOz(x1g*0{0^fr(RYwD2c zT}7%(Q-@9Ob)>pAbsX(Lsz*~NOz)#?qll(nH@!`a?sb}a%k;j;8ueI> z?0vK?tt2$1+}+3b;c6;ZsHB*}MxV<}QGp(r+ZdJf}jc4YfaTZ#;fYT!9zYLf2 zey*Df3%w>{@-AAt-H92@rDWBA2drr} zS@k=}Tz4ia7en^0w$|qQIBl8*W7=tz%U(a#S=RH&%kpX|X;IZ{z#lap&V)n(!W{Tc zEh?xQmc0>lB~D}aR5+a}@(!^6Tai<$(LP4QAXN70oZmyvS{geHl84c}2`tn(W3i{w zgHWEyqKmh|%D*2!sT@;x9e+P$9mwZ9P3A*3<=+9>ry-lEWvym` z@+trQVAAsynhDR9<(``HJ|y=;;^$QTC=xeXDlX3ymdb|8F)>t7y?$uC0u5=^x=PT- zEmuLbAE~uKWA{7AJ+l*RE*Q=Os~#&GV+WPy;q)JZ=IgL=NSBgrYqRfuQ&qkLX`xrw z7Xd{%nyqTs&wYpr{V;ZWM=Ny^?{X(=Rrps2KDHqy(xJmFi^l=P%Gmu$^t!2~aK;i` z3&GSmnxteC$olJ)afF$^K!WaS>Zb@yJ!*24H7SQ>_F)WF-i^8LY`xeAYE+q0vu}YX z#_KfD1+9zMAn^xyc*z`=|K?!$3w&UF;=u`tid`R*bO? zyp=VelP;82xf3cG1ALN`F)%0w0vQ8uXAS6N8x1_{G{A`{V_>fs7|a-WCu=|_zd{51 zod!6qWegk?14l9j-pv}&$yaIMxYIz?X<#1$&lpU=bYlhaWY&OAUVz9}J`J@@4EWS4 z>wy^P%ountYd|MEXyCZh03UhT1}@}u>_J0eR4U_dyI|(hcfh)rxyr!5Mz>v?F&UF*H#hw;zbVMy0{HFNQn)mdxTjc|6( zTT-k;UBY|l9$s#9?HZUrUZQ6nq;31&S6 z#Y|B66gCr-lVT#0F;VC+VWmGy6K?dYj0rx(wM{f|(!~M|TRy1a2;)vzs^nARVY9B* ztFiS;jPFx#)<^aHbI=LyLR1bw0fktXdF3yMDz7TXEjBNtewzCqs2XKdZNuD%k%kO# zSXDMi2H4=@q8ejPab4i|A;CpPz0Q@rwqRjXU53HVC4k?D1TT;6S_zj&RLNfnCNIc6 z7Lz_yF9h#b@S%D!5?rJBLrDA%oG)mtl`c;sd^2XjHP@Ystqb-C5PvIc#J?F?it)ta zX^WRLf{)mhe;e3z;&&F?a$+Z#bm9$1{)fSvjQj?wB@N?0jyPTdUWMkNntU`*AtU!X zge-8Tl_6&YpV#B!j_$zFTyEzB6!bia=Saq`c=kX(B@q<{k?*)qss!}E_t_gzW33+`=s-W&O}w)xxbE z*SRh(kF@KmiTh`z7hDA)S4E`^y!AttYWfbvGnwX?bV!y~BJ5+-zaXKMiq4e5LEUr?lfC|ZO#zJLsu;T0il=Ne7x(J{{6{YQv6imb-d%{UoamIo~%bT!v8 zgFRd~v1(q2#vA*bw$Fi5`XH25^Vbl{u|dt{P?6kodH?#HaRoVC)meU$Wcve_F z#@#4ma?zMVv&dVtYV0VZ1ap+@Y-JYBF1)0$84Db9k}52m3pwsCCCTnx3@&UEsFgRy zFpCNcnaKd@8JV##3u^g7<}{BXSzs8=W2jbmo@yRb4bBL=M0C0-;9-}1tdTWWoHd8x zG!hClGir=OW%Lx(Ys^{3)NwS7M+P)<))=@k2d#Uyb}z?vZ!GM2tP0XlnRWxMI1Uyw zO5?MI&VtPAr~}AyF~KTEOk$W^cSyi2?9pge)zip9iPz^#^ z=4eFdn{g2Y>at9;qwCQ6VoQ~Assn=_G-q<_?qxBTWSJIY zX@*f4D`Iww-I8JJ0%&g;hZlRLKJ=mq4--I4!s%B3Fj@yJk#)QL66QHWwGwz|YpB(> zl-GA&#vvtG(so-)WFe3e^i8f>L#};T(#x~bt8Ix730`zuco~v73#Xyl2@N<+wc(}# zCf>mbJ^=`R`lbOU+&IDK4cbX7NpQnSot23OoQArB@PJOX6ZYWLDoj{4zk)Xp9$oWx z0&fJg3KI<$pRm~GGZEGND>egmTS>wLI@wOxgVQPq2`;1I3*jxDY$tGKtW}u6^HA1^ zz-6W8v(`LnP`5f=%~rxaI=PC#Z9>GKu+QSMPOOljR?$wYHrqR-C8f~Xh%TlHzumKn2%vI}^=hXOt9;DeoHccb6VAFJu@v~_Lk!Ee$ z_RzNLQkQ0IGHu&q+P1~CZHH;6jRp`dHE*CFNWYk-4fYbID}nTn>8!nZ4tw*?U~ksI zV8-4ohrL+?4H5&dk_d`(Jc9I@!luDyzFAqieO3h96L&l=#6 zwen@#jK1u}nem+jU)?!_@9a;O-MJ3Ca~*c)W_&L}S(ffhhwe;=Zq|2hHQ4^1$w$h# zkC5?^#ML;@;3LOPzf+gQ?Pu0yT)2Obu}k7dXV%U7H78R?PIXp1>odGbXk~;6N2bZu zH0bf*RAV29kvNW%SA+L)axC+qqJ40_Xu!$2=p;_+U{2GM7{@o;g7c0&Pf*N*`fG4< z-iqRM9%u67lR3Lm7=3!FxEUn*H0iFHQtVy$u#)xl(MRWuUo+gQ~d z>k9`vB0XKze8JPwibguByE{A2s8#2`_m$8vXJ<~TN!l?{961Vaovz<&wdczhok?u)`gP~zLVl;|ksK*k~ zo~cN8EEu)ek$7i1TII-tcR{OCp(LbOuG_D~gTj%igQj#&%b=8OS)9|+7m23vUaEfI zCx~a|R_+vDkBxO(I;nW)I?abScwrV59>zx$aPy>p%?U)-bHJA{?=u_amm@?$+GnMwgktWx(uMVpjNGK20^Y>e+M8ot@vPgHr2t-o4kuM2(HqdOzH5IMw70EVzChv4oB-++-lzhd zJ;6v!*>MSU_9YR#XkRZwyCJwP+?NQX!q@A}i{`IvU(wpMT=nubEjzaJTUt~w9q-~# z#EM0t2ek>|1%JhPBAg6Z69!|ENGBCPBH(u+Di}$2CWBpRt8U?7GTjkID3if-SVa~h zUM=xdT7j2J<69oQ`yNt^KuTA&H<(<9`t@q}!|A@n0_){%yxNU|Qqu#`FcWr<(66s! zHVUNp`GwMxiej7SzCzdfQh1SGrSOf5l6TQLf8oV&gea--k%V~0?y;!3rAd2jebND! zH&|}-lOBFmqPp--c`Vo)*8Ko&*_&`U)7zI0Zw#a`B{_?L*NI3hrIzu_5{0)#0$NXX zq2|dJgxv88zU~0?_3r|!W!WAJT2?fzX|fniE83Ly+>QXpL@=F3Yv>FsRy10z#Safc zsxK7{hZDL^kr+B)K!@G#Y{@XYF3MjVjNv1kq;3KBRT$F~z6>CR0Ti>xCWnq?i{a7T zHkDp^13rG~ZO26d-`_YwqML=|1<_@%LBl0gDBg#Ubuy#c3R?ud9-b#V8B%hjAO)6IuE=#6rjuxV{e!j7com9ffC@X!wDTZndriF5YQO`5h^=EZPwB zb*5A4+T&Y}PELy(t!Xh3kB01k=$7t|$Mw_$z4eN7JST3&HOEvm%ARNq zPdzPtWNxy8CBxh?CISIehC?caieN2+rA&a+DrPklwLBhc)Khs@Vs#=Ig13Q0kDl$( z*R9FlzS20R6J7HZA8BwLIRu;@F=_RoSptC|K5El_U)nr#=?EZ#oZ9$33#LTODrnqg zE83dSaj^hYIw~A&xWHQ1o(-6L7;XFN3Z*ml0c#YpCt$ATTs41zf)P%)n#IBHEST>1 zWF~jpaeO3K3;zM^5P%sL)LAgovZXJ0$?)}kXd`ro6juY+_eIe89Rns{e^z9#8+lz^ z5XTtqRtb9uNsonfYf=qx5bB^TT(P{Jiv)-)=kS5pdaH-5K=160M5B>(ujS8r#2Zr+ zCa7LcOpIx3+ln<;Dt$rFBfT>k4#sfR)SXpN$}5&HYHnMmm6xwr*?igZ`7PEE)1B?K z7&~hKf4X>`0P0H?`xUO_st;AKt>;w9eh&<#(j1L)oxntdX<>b&6SEClNT#hsGTw>h z3uYfWc4Isi<{-kQUi-DEdAaJarjk&&qpurR4t$xXXTa=yB6BVSx4>>j8iNb?#+EY@ z`;*n7_3X{7t3;a}4Kpd?Vy#ZFio(?%tqCXasVM4_j$_8tbATQkSbX&a@rfcP34XY% z>}3?HTwjM0b=@$l+r!%#i(P&hxnx9lmemvtbCGOF5(+b&Y^6#tn1cP;v6TZ^=Qu04hFy6(-$UthSgz} ztGRYZ7F?O@FGepLD#f{X5k8__5RKpiI2Bm0zkju7O!m*FwzkVxHLYq=)jjdvaCIV5 zjb%tES#95wp>1&OM`Q59kH|ZwBhE4Uy53=ZDY+3=2S+xqc`E{M zr6hD8({1D^NQR7qGhHQGlX$yd-`aFWaqn3X8S7Jf~iDDBp9>e zS5;eczLnDNvz)?#CtjP2MvT<&eDb!O$0VGMMV_s$PaCRCb1WYBq#KLepEed2m0VNg z&d4@`Uunx4i%MD`^MU3uh;tuKu(!Fln>WMe;-WIwqM{Oh(_tNJu!GTq6J>6L+_k*m zg{O;DW1(I4ery%2J>7=(pSgY5M&Y|T(@4m{ZLP+lN!#+bdv4CVC3i>8t?t{*+hMt} zXqM~cf}%-{g=#+cvx3|zQU;%z=G3d)T#u1&6u3saOO3OPv1XYu&KU3Vn&n1?Yl5Nt zsT+DRj)9nKH1^o3WH{=_MI()ON4Svnci@)QZ!@8fo2qGt2W$9 z`mJ=Zql2xivs)a_#11l;494)8wv+Wy4mQKWwndbu{GIV$evGU9_(C`A$C#>uTUcc~ z40k1Y>*Sx`w#?5-F4BPuVakrF6VX(e!>#^)DnlS)ay!a#nB3=b947Xt*k0Mgz~?b& z#|*>Ja`r*%u;kgTLrcy+=alcZNt93fgASVZ7iQeDg`iiNK=>d5B2rlBhoymzfh;FAJS`ZvVU++ zqJ9WCh;yIN8-Vsf{ZHUTQQ8ldcMH52IHPqpuxC zcMhYk8%Fc?_Ju zToxPFqITGR+pxRq)9!#X`=$EU)Y`7IHg6pDJma2+z7NyOGufQ7RvNt0>GgH86B`lQ z;bDtht$`gH*-OxWxh32fi7m7K>W1P?H4gUCa$InIKo{s=`!Hyteq;*d(@E0%i1qM`i1H2s%V$}S#mXs1(^ z)GH^#FFs;C=Mv0Oq@mAoP(BSO5%JM+xD;;=kOn>=sOt^-u+XLSyBep|V-oQqr5cEs zC>akOPvShOe*@-6((@I*h61Agd^Lgj9w0Vi{vom)!BW;|0p2AcqOleeA&&~)A;@`) zdWVTk_~eB+A8{2qT8Sh<4#e`{kFR z9|@oD#FO7H{A+~f_0}~R{eXye=piERQNe^@T5zM_HbH*PM*W>cwBH>cR1alDz7v6N@IC52R{&J%1ADpFCU~V_Snzs5{a79OZWa12LB4W8yFUY=g8bT?{L2Ne6^sb> z3G%xY>fI;!kl=R(pA>vS@b`lJgCflLS3!PKLAn?Nl;{;)DtLupr(j%=UpZ6%7QxR6 z4hViz@Oy$!3I0;>_kw>G{D{mJ41WxJa;FutP8*_zA(M1z!|AEcmA2`-1%2R`jb(aEf4^V5{KA1fzmG1n(BS zU+_`E{emwD9uj;_@T6caZvR+*so(^`8bQ7rPkD>rRf0W&>jk$7epYZ$@Dahs1)mi> zDEO-2JAy7;s90W!V1?i`!P$bV1@)W%&`%28FZgM}-GUDZ?h|}Q@Fl^cf^P|aD2S~t z?GIjT*H|gYzjZ)A7Yeost`&?4ZWg>v@E*ah3+@$sQt(22GC;evf)@#1D!4$fS#X8m zYQbv-LxSrBlY%!0_6zP1yhHFF!9l@?1b-;_tl)9Me+s&=2|>R{3swkD5u8TEHR=+f zn~3A_O^omZ!Ve3*QScVQdj!8L_=4bX1&nGOUrB`iTA_Q1(BCMyg$VsyM81m%{Vxms2od_<7kr8c{hx{aH$>jv>O2bA_%Kyo`u>yG`g$BI*$(LO&_| z9Ynen#+Xg5MVWzToc# z-w+((wd_q1oF+I=uu1S*!Oenq3+@qoQScSP4+Tpw=hELPf^!6M`>W@B-0o<^GD;&Z zgBs5hL=$UznqZ9}wsJ*KCc&EoZx*~w@C$-p68xIrgMxbm z_X_?{@W+Bb6MRnaH-f(tJS=!z@UMb@6Fe#SzM#qbanvVIut<=5;^cELoOrI_6u}Dw zYXxTt&J}DFY!>976rvsOeG{(|3<`z?qk`OLq}~R>O@iESB%k|j#LozRPVipA`vkus z_)Wn_1-~o!Q^8*dz9{&zpnj1ay@|2p$!DRgiy0m3nUry0{+#nt#WPSR^=FaJ*oJ;1t0N1g8tu z3(ghP`#7-2KifjPs|7zM*dchGU`%km;EjS?1aB7nwBTn2zasc`!AAri6?{za3BhLs zpA~#j@MXbQ1z!_KL02uu}F}AyoK}x!3zZag7t#41seqy39c5rO0ZjSo!}P1n*~2D$iMK)a_<$? z`(dCT5&BWV#{{1cd`9qD!B+(TD5&?zVCOZV-xK^$u#o#ykn4RjApfum=?ere61+r^ ze@cb&)q;9I4Rp8A{Cg>sZxQ4lKOud$AV9C3aC@icI4otlJX zX&(`GCkbN7qiKCT247!~fpx;4B{)a0L2#kqV!;-{HGzgh4# z&gYPCmw8M3JpubtqObh~t^I_KE+4cmAG9t9bdTuoAcEd0^aDaaEcDYt|4itYgg!__ z9R9b*xln}b_*~UGW&vt2huDWl5?DrYYfm)@9co40kP*u_o!$-| z$AvhlZ;St%9^2FDAN3BfFgffbO z^(bE@2++sQBHUY)+f=q5DCV?s?_Y^$aacUET-MJnH;6Rt+Q)krU@yUT9!y)7a-^w? zFPzlZ9sb#RambwY-PVbFcI^GKT&`j5a8+B<%o)puzR zTWcA6cRBJPsXlKRr*4wl992|-)$xyzLDfoC7K-cP|`+CE-~p7XF} zzX#J!Q?B(K47;g+3z@SXhft4x@K_Jru4U?R0%?RH0no?mi?OF^6F}QE>+T4bI;YwC qT+~*z^@tb_nWJn8p25Q@j%$ut`d5OJzB%pf!;Q>?wh_qe*}ucc*{N0iwIFOi4Y1r~S7t|BkNN1EB0-rbSenQ>-z z7m(=2g~+%N;TjW-Mo9D~_>10)UcI97gN+gwBN|QA;5AWHqM&HdYZPDb`=08mnb~2z zzx?j!{`D)UKJ`6y>eQ)I)m7Cs-TV75J~-``B-tt9f~X)Cxo|NM5k?^1uCnBym+#NE z*;P~qL15^VC>9eF!88-r+Jv39@v^#=%hFh+HsshT(nq#DTq{Z4#8PZRNeZSJ3MQ|I9y?pwT_{P^MiEGNW-v{EJP`|qTRGD-2kP6+_08n%JOX{0IvknGkT%VL z)!fl)LMh8J%>|d&E?Jn8I)?HT9^iUQhub*gIzXk+7mE0qNVdM)sG|^Cd8yxywQV3;g$$xXX`61vkTo*VAJ|?n?778N!-*y z^~HSQRx5tCz9%NzND(7SeK_Iyw?-R8FmeV7M%(^*EIB(>QRqP#sHgo0tFF}uCH zxW8UiZ27};YSO zr3OzguTTDUKUG%!=`oV1?`4Zae|J5YWa!mTwIEa!j@?Mv63N&1oG7Z_y8P6B%HP+P z&}yptSmDA)>rU1894JDWZ2A48NtO!O)qG>|UL7)0^82N592cGb=$SKTm;#%@YA77r zO@d_4(#7??V+ic4g7NjqH<(y|&mMFj)yUga-(N!>l|YAZ%6wh_SoM?(Dys0WKB=|z z*J#yJf6pnDo!$ZAt;w)0=?ngG6fBk@O5svD`!s*ej-s@Eg+ zabYpj_sh%&-B&q?EuQNtNzl#;?U&wC3+T>m3-6&q0{BAy?)|7m> zybU;c_{!R=YQI}+W{>Z!bN?CU+O43wWib1e!$RCRlNyqr)h17iA=!%#t9yZ)&4zDd z@?BkpN{i9lfV3FSlosQeWKtt~ zEAua#M{MJJPCE*>yaCrA&qM8v$-mWaoqh~AC(Et7@RRSAZ|dtX8vF+udgs^!mU{%F ztedJkek%&w<^Eli+tin6v03+Lu!1&gR|YF&v+m4bMQqmgG^=paRMf+(?eBgV9gHfa z<3()1Ko0kG_hg8W`;LEsYf6^-g~IWpnOxGqWS`IGGTA-gwrpFl)i2lkpK9uz+;3ZS z6>3O%r5axG4)hA24yiMb-#{t`jxSru_)H~}p=1(MGOhn{19jK;&Ls<2Eyrgw9jW=; zF8_CEXW4M^44d`7U{P<)gvx1y+C@X>_`9qU?y>{I4gKKSx*ig`(&`@&EK)xm>Z=D; zPowbo=1lcs%)P(H*4-%-LHAsnwN9|0yKw6bU!OUHDRNU6=)gLd!8G7#Ous)q)xDyM z{_bhWfWI&k{F$#ewPy}M>w@Ilgf6cr?E;>jf(E>jCvWgm$A2lUU*CzXG_hLyu zQ`>XqOk!q3@(?Dy1wB38__ij!@Yvqk zI{k9iIe%jiV>h2As_oS!trNoV3)Kuaxx3uEqyj!QNt<6ogBAt+SwuqSEs4nsB5mY(!#4IFc}|aHONP z&G5xqJKC*qB5t%GBN9ynBVl9W`1r(%++1m)FBq}{Mj~SPBjK>+Pf&7veAf7Yy`^TZ z_5M$W+zrMzgwCMVMeZ;H9qmz;SOJa|6XGk7oMlv3R996@t-_^xnz14Gf6_EBv}N?D zsF!F%x}y#1eIsVI!24~fu>+sR{V~f557fa%g)t}G(SDK9j)*#)al>K(uN^q%!yn6iwt84#&D-)w8SFqMkp9h7{L}J7zlxbUbbb@ znr2jGYvMzX+O{AVkA{5fjFwQawG9Kn*9IJP->19 zHYndnw;^>GQ&TeTPh$?I$}(?#vWN$C z74tRDTjD;P2^n3%M4QnZi>!ga<}aC#HU{JVNJk8r0p_O&O&g+kiV8h(^jFC8HU}{~ zSg{zI=8weCW;RE3P%ddj;|5a#ZM^IMVKwPFD`g5Lnj$gFn7?>A^9QD83o|rt;G{%X z#9;Qp1S>w-sHmu*hS`(k04)TT$EhsMpGHTRS~UsCilN+^_R6+YX__w2Dr*=^+ag^? zqAeIV*nC<`r&~s2>&Bws2)>rDry zh^bS|gwzp^2V29KuECJ(yH)bH`C?K$xZa`@BqUnHzEGppX@%0#OvD$m2f0LL<59~B zNC~W5Yb3NRVa9w36vpf&C4%i1s=`sLFNQNDlVcj!tXdLk^d%axQc+es;cJgF3ujD2 zF($??18hx6@{*!=C7Mxc*>%31#@K~@#Gao{*3NGU`C8*rBoHwD(HL&UR1#*Ov0=eZ zrNQUYRCh{-0V*GebYPYvd!^=uOnI0(A{1JdYE*l?RceAEaVci`0#?jSv{6Ee+BDNi z8LUXucWsAdW^hb&3jFC0S-x;b6o=vD^^|{wV4E+D$vbA^=0j!-Ga((4nI=|mT$ypE zX)Bj#vtqV);KziNF$@i6QYs_MFu`ZKu=c0hMPM*Zf}f>`v!e@O6dMTDGf+C!{qZ*1 zLd6qH*I`a?C+}ieVMC{xU8VM52)|;qGq65_Hrpiv@dS0c6ePV3VVh$6W+#@QBi7l; z#z-7D&_Zlum<8>=R^0cP&C|nkUTDn#0|>VSq@dpyG5tR5t|Sx+LAA9uh>>A+nm9X! zZ(Dsqj4rmgnZ8y(?RvJ%XtXhy=Jbu7_l`Clk-r{hkX~Dkc-dtIFQcLi>6F%B7&`+L?mDX?=881e z7R+Kc(`h(u-m$FM?Sq5UW#Zug`ocE%+KwQck+CbwOykDHCO;$7#Cl7cCzCe!1Nc@5 zLx8by$72YPYuV!i-`=;=G?ZCFJPfqZ@_~s`vJ*5z5yzgT#L6(xh!94F*%8IPj46%M zVzOcLU9-JPFIdG-lE=3nC6w?P=htSKNzECh=Mlr#))4WI~V~}GW?tqzApz176 z^;w)LXK|+5oYqJrK*NwJZT6+pw4w(%JD4y5Z9taIB53lfMw5+brTir!?Yb#@9`E)RzN zZS(P%-OP3x+=2#7(DNghomx}7CSqZBOmsw%!8@52g06acuJvPr##D^mQ~Nq8y2hk= z6YHX%E}hafn9E`odr+kd|1DW^O3QDho{i%r-R9qHl@OliRF;;D`kX+KKe_Q!ZV}MV!*ovzxJ+XLhB8&{hE~-fE}x z-ES_LNLjE4TVh+;6 zTY2W|DIt_Rt=Xz8cpo!$HYYwJ+DVb+GP%f6o7YtRM1x2n=1#jMvUn~#7 z7;sFJoCOU-znwoTZ+4yoM<>pqva=vBk09QW&{-~lnaEQMrG}xBvTJ=c%>^JynTHl@u@ocwS+NJTV`?m8z`b zVtVaj2vd*K+@V9EehzYnK^Hf;qyo(xBG=^F=1t81c0QUaNyAmi;j(#T;yFUB8lZF< z@+dK)0!=5I$R8+X!0?e|xXqKKQKFd5;<`tVk*kMNtt<0Zp~RR9jGsYFC?gZ7nz0pJ zCAW^MF+|l9^D`*2n)=`f9VGh5uFmh;0sFB}M{Ghuj_g#la zQi1{RiB%EzeaSA^bocnsx6R2T!+gZxj!v_kShHdxGPBf8HYzv9s-II`kliwOgRM9L+DwDXSDLF zK!>Q(Hw1dl;VD=CD$w&}Ldw|RJ3Lj&Fc`#4f5G9Isf-n-zv%GPC=CMr!QrV_Rsrp# z`u^zfELNIFJgg`caAgPqO$Z7Q3hI6f(epggA*F)fZi;`pAQ$XCB z`!x_nOY19;@*EI)8&Q@!(-kGEbZWbShf}{M_mJ%BkEY;1_VYqU;p#OQ&a}qWmww z+ep>d=mABc-w_!+jUG^xeSoZg&Y%Yr{aL_0B#d|bJUbQrHDFe;47^*>Uk8>jf5;Bt zJ&JxDm}zqY_bK{GA+G=*RCN03kCk@=A5!!)0&Bo8D7u2Rkmct9zoh7ez$)p_1wO3k z=ZpM2;3JA&C2&6QQAM8xJc{HCfsZNrJm5)$iwL{)fRHZ+KIzi05qJpjCoVlKFctyN zDVH7-co^_kF1=IW65wvPzFy$rz#H9qH}K6=-#NgW-TF-;zZ7_zTmL7KKLYr6w|=L{ z9|^qEt?v@~2JkMo{-DS|7kIZ@-!Jeu;D_D%L4iHMd))dT1TF{O>(*Zpcsy{QTmQ4b z6Mzr6^`in$1U~52-xGKe@FBPUp}^k)e!;DOCh&Q{FS+$R%-*cO&Idm1*0IRgcrx&x z-TD-Py}(D@`a*%R-gu6>^(zFf1U}~069QKOpK$A&1+E4@34aMZ1^5&AN8qWzr`-C} zz|8;CfV(yQPa=Oh@McZ_tH3jWw`ls`1-<}yo2Gv$@J!$zX}TMW6>Hyxz_)99slc;< z@6vR7(Uj%S2HvUZ7YjTG_+CwK5_m4~E=^w{@I}D)Yx>m!e;atWrZ)>*1N^Y2cLK8s zaX#=KO}|0l1;BlpzFElE0Uy-#TY=e}SP%SyrvD6>-Odfbhc*2XV76*30zRVY^ePIo zzX|x5rXL1oGtwo%CpG;oV78QA3cNcty-MfctWE zda;J#<-iAW^eTZ@03XcJ=Lvi{@Sz<2Qh`?jzmTI}Dex-bmvZzL;9Kbax*GU!jvg2J zCh(CQ{RaZC20ogj-zl&U_*jmpDS<>cyq4aDDXAFTXOX)fLVLmfw$%A*NFTG@a?&J zx4=>0yK?oP2z)K@&RqQ-f#bmU=IW0LoB-aHE4cz#UWTK?+-0r^k_M8lPBnpK!BnIr z!_}(PAwg@MtBn?=?;y1c`K}->O1A)gNaz~umn4;5ICfqMUa9LsWi99t%9};yZUp*( z&}=HV8Hj0_!^-^?8HI8YT~^2xE1%Z26T9;CH0S22?RhNSCS=OK_9*ClD& zE~Prini&vsEk+$udVQZMxthTK5ZO6pu9ZlBO=`l<609#(t_5i|bwbVeNX^25Y9>h< zEna-fp#GFZ{u!4k(2_gWJsZUB&}cp6BF-zoD#}};&~qi-S9wcGzXe3)@|KY++JQbN zwA|szRW=B;!r{r6-1I_;>QHH;speu}yGn2widieU=jGGioB2Q zfY|D`pK495&3#nsWn!lO4eC)=3G^gwdshQ}kM5$UuphPE$ht#TB$f6|8VzyQM2F;f z4nyie64vX}yP08zUZ=c*oCCBU~ixWz&}|j~qg%;!?_S4ntZi zT&j!)rH&{>M@WiCAasO7IZq&TgrZCn=yHe0C5>7QEfgNJi6pPM2m%GuWO+0hAx=7I zpGl!$Mri{GGfO(Bk5~xnu{We3uV}-2Rji;m{sGOSjOM-8bY&q?PSyc>hSIB`%68fW+!oSE znraG8Fq0>eUua#RaEQ}_@p37>D91d+BvxYFQFwyWf+=$8JXpjeG6u6IskEVxHgRv( zaU+tPZsSzK&VhoPQ#|prFox5~oKEF*9;XeQuH@9@bO)!uql|0)(%O2A zAbQ$iktP}n#KY64M6Z|;#u#F08W+T){v+R$e!>(Mo_=ohB!Am`*A@*KfAcHbSNreV zoOjXB-%kGJKmSF)=7yhcxaAM+9~L}4bJ4OjOJBSf<@O>TMm&ai3Xx7pN)aa^&O{`` zRwB|pP2+SNZh=PJa$!UYG*gm2!(jBU5sxB{;CVCwqo{O@8iqjgJ>fe!rn45pm53B* zN+RsyHz_^t5~dZK0?iME@8J0~`4Dd8m?l!f+qeU1N}{6A0T*zags(}C0vBcFgs=Z! zWD22!zE>DV$`Hs$q{oT7RzYu4pAetyp#GvcftpVyQ(5{Bjn*!Dqn~8ybE%PtqY?9W z-1hU0zF&X3X~Ci6hpQ2zh&_luMx?D3 z)JwG6!l@qx+L#cFb}5`iTPI@CUW%>o_U?vQwB6w>+PD#mjz2hyHe1A^<+~gdfzJ1c zRfovc)42?>c0vJ{q8$~nXv@V}v>hN8Z4P)rI@ci<9ry4WZ{jT4i*XjM@2p^2J)I2^ zi*|cl%0QA>Y_AQ9KznOq(MFrsNLxi>(e{zE=*Wp!Y&ir)xQ7>{hcK?5wz4EeJ6z79 z-4wC@l6E0&%85lgbgrI`CW%Gol$=F3DY0m$%~^DiMJyTv++Xy-KrA|`;x*E?oLID5 z=PWwd$ zwjBA91)=Za9@iH2hsrJ7Pt zQt$sU(^JS#{e!PN@nNQ2NKy)<9DaXc1s^A?YHp)i^n@yFLsjWLpuK87lB#QwD!GmU zf5*9AYhk?6i&gcRRkq~sSvik(m8$MgJ&q|T;cR_{iFuqO7Pao!sa>JU*nS@(L9O)x zb*i)Aezn|nx0;)P_MfQ5DO)Z#y?MUL~%QA>AdWonT#SKFozZ%{}6i#lSqIt@0Q zyGR|;Lf7FgOI1T^vC}%J=D6;5X{+$FTA8*;U6%VFYN6|>x<dtBSqG8dWdeDeC0>S*UaIiZ$3qYgt}iL3Fyq$u;)^*5r-L6lLQd#*pKj&%01 zbRW`VoKLd!KBPxG53uxJmVO%PQfELLqK3x1wdJ3I{Q1sD znfx=5AM1RC$q)n(3iuRn;sOt8MpS%mIvrS81Hqbtt3GvE0`6v@%%u2Ro?Kph8N zx@KTBn5q-QA>Y|?x2hcLQAh58s{i1sa%kJf@1sOrE?ULGeEKCdq;rc|6Dqcf&LO1l=L0Jo(21_ zxvzp^>*3uBioLa$jy#J%El?_V87S5=@5P`KKfy1G*FxbK@8~nuf}`1)P2j zA;O=6Vx9563QGQX36$!8n&aPa{A*B>zk}0%0>ziW-tU1@xwW8F?i!9QjvGO#+$>I~ zf>OCMP%1Y9l*;9C?Be(YW@|h?dEW)4_B{(q^7NAk$^QbB^wLi#r0)kj|NA`uN}gZG zX(gv4ICXORiDK*h8z||0lVkd6iSY9rKg0189REAV^b=P(>c5BMEuduACQ$M#eUn@c zx(1Z=Edlia(-*ujVa(@Xjso5VO6{ayJFzMCZU!Yi>p^LpHG!TB{>7m9k00#pac~lA z2#tedpj7@vP%8HzD2-#AE)<$!cPUS!Rcsc0eyWs z9&{oo$Ab>#Qg|G<4 zJYV4Zvhah*$do@nE1!<4GxO;;D0Kt z&nkZ)D?c|2@6Ez*WR=HsKS2MCEIcj?C$ccvMo|P$R(*Ssk(vLho$svS1)k5!m*~re zPRXQCJL2^E{z81XHlMv7FPZGc`_vxY-jfIEmCzKA?Z|DG*juxAMooItewkmqHY%B! zZ>ySkWjrq7W!KafcJ@beOB243B|f%+fc=#ReW#J}+N){eQw@Cf5sOOn2aNpq%*9N- zk!p6tLzV@OX*RF7ViDdhGO3O}qiUeP0Ayyr&}y>RSj}L>kC(-ne!LcI`rFo+E%*!* z^6cv!J16FkuA?l8weXTicpkmZ%VY+=RcrbZk)UK|dWFASYqmu3$D9%^P?3n>+R_!n zpNo?4a(E;T!oJtD<^{t|_P16L!1s#-?P~4t#R6y?`%-p*Czs;oT=v0*NuM#9E5zHy F{|BT8g&Y6? From 3a20910b0db5298aa2c6ea1d6bf35e218e4c58d7 Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 5 Sep 2017 04:29:57 +0000 Subject: [PATCH 14/65] onboard fixes Former-commit-id: 8693c29bff80dc36af4a69dda5dfa0b3cfd04e68 --- dump1090/dump1090.REMOVED.git-id | 2 +- dump1090/interactive.c | 6 +++--- dump1090/interactive.o | Bin 29048 -> 29040 bytes dump1090/view1090.REMOVED.git-id | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dump1090/dump1090.REMOVED.git-id b/dump1090/dump1090.REMOVED.git-id index 8a50246..fe9e27c 100644 --- a/dump1090/dump1090.REMOVED.git-id +++ b/dump1090/dump1090.REMOVED.git-id @@ -1 +1 @@ -6f6bc86677ae1f1852853f24130b9039e026b7bc \ No newline at end of file +b31c0c4c1a9cc96f015125a795b14922cb6ae8c9 \ No newline at end of file diff --git a/dump1090/interactive.c b/dump1090/interactive.c index 9bc1e65..6244b5d 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -566,12 +566,12 @@ void interactiveShowData(void) { //formatted for terminusBold 10x20, no unicode if(d<5) { - printf("%ls",L"\n\x1B[1;37m┌───────────────────────────────┐\n│"); + printf("%ls",L"\n\x1B[1;37m┌──────────────────────────────┐\n│"); } else { printf("\n "); } - printf("\x1B[1;31m%-8s\x1B[1;32m%5s \x1B[1;33m%4s \x1B[1;34m%5s \x1B[1;36m%c%c \x1B[1;35m%d", + printf("\x1B[1;31m%-8s\x1B[1;32m%5s \x1B[1;33m%4s \x1B[1;34m%5s \x1B[1;36m%c%c \x1B[1;35m%d", a->flight, strFl, strGs, @@ -581,7 +581,7 @@ void interactiveShowData(void) { if(d<5) { - printf("%ls",L"\x1B[1;37m│\n└───────────────────────────────┘"); + printf("%ls",L"\x1B[1;37m│\n└──────────────────────────────┘"); count+=2; } diff --git a/dump1090/interactive.o b/dump1090/interactive.o index 6f432f267db9b644fa4bf2f60b67bf2277462501..f085b656c04bab4f74ade4f337dc44e574848a96 100644 GIT binary patch delta 192 zcmezIi1EWC#t90H2^$sv^DwU2tjJr;B&Hx8ZD?(5maCeqnhar^=BlPlUd8`t@&thm zn_UF^#eqt%Xnb*DyfFD>?qbG}$+>yTj4qQW=BYC_Ox_73A54A-Bugf9=BqOwMKKr(2uVu3oN_GC{W={>m+Ncv2k2_z3p cJ_sajCcgxdxswG8)fp2eTLQ@slM@TY0jl3d6951J delta 217 zcmezHi1EiG#t90H85=4=BlPJOkTzRXtII; z%j6z`4Ip~6jbOhxP|F#OFD{HXCLhdQ%osB{HBXt*XL4trI%CJ=jX?6nG zI^&ATnm{shav+f0Fu4*)c1~UhBo9tL2_z3p{s<(aCQBBmGa65J1d_p%Gl68t Date: Mon, 11 Sep 2017 17:44:53 -0500 Subject: [PATCH 15/65] added greyout for old messages, removed line count hard limit Former-commit-id: f5f1e2f1215127bc65b1f125206f5aa554edb0f1 --- dump1090/anet.o | Bin 21540 -> 17960 bytes dump1090/dump1090.REMOVED.git-id | 2 +- dump1090/dump1090.o | Bin 0 -> 37100 bytes dump1090/dump1090.o.REMOVED.git-id | 1 - dump1090/interactive.c | 32 +++++++++++++++++++---------- dump1090/interactive.o | Bin 29048 -> 25084 bytes dump1090/mode_ac.o | Bin 29920 -> 14044 bytes dump1090/mode_s.o.REMOVED.git-id | 2 +- dump1090/net_io.o | Bin 44176 -> 40816 bytes dump1090/view1090.REMOVED.git-id | 2 +- dump1090/view1090.o | Bin 28860 -> 19276 bytes 11 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 dump1090/dump1090.o delete mode 100644 dump1090/dump1090.o.REMOVED.git-id diff --git a/dump1090/anet.o b/dump1090/anet.o index 4b4f362365cfbf819b8d2e3e4de596ddb7d728cb..78e8fd76107e659002a738be646d7f642ec72bdb 100644 GIT binary patch literal 17960 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

sd8o@(3inYDA80g!c-6<;vxpF^)5; z>+5Q2eZ=sRyuK3Q>}m=%HHy%R%KEyhX5^3x6uc@(E9-rAK7W-*hqe(YcAu*SWy2XG zd@Yr3q{3Bs^ax{wx7p*V5;D9F<*mdkTY&Xs*6Z=`6xQS|a)2=XP-f5y~;Ys?t}P zce%HzQJKeEkIkbu6Sv#n;;B-4HX6tLGN-M&uAY+hD)f?KKG~Y$uB~kGdVJITzUthG zif)cx`KojCR+vxrW0l-qVF7_y+2vlPNA$`Sm0ovCU9&Gnk@B5im{&+mS4+?{Fxgh@ zZ)h$om{g!8%xG#v1NY_5$BS6xGUqgU+*Ffc%r%^z#u{HOcvaA;bk}-vDQ-(s{bXBX zQ?8phIkpDB*O!Yo0I5NsuC;`cRn2uR9`9t^yh>k=ZOjDQEPuVNaMGl6Z3W{e7Zl*n zc0t*EEdhTHFFU*habQ@ycKB!~%f4abxldM=OmUpR2AZ&#mMyz;NKrZ)~XadHq$D z`4`mr^1aP2;HAPI> z`;>;JDvzCi&d|f|CO`Zm_KZl-KBKz6vc{`4RaLp%%`F%z!a=x!%r;7PI1IkfrnJL4 z98mnKCUi&-`Kv6O$&EKsMby{N4`-^uTcec05wC)=7Y)YctEGU_tkdX1iefc2S7Oj` zMR8oH6qKjC-c#A=Z^o;(7@;END-~-i8>{M(NQ=h}VGHIWdIitrs%)Xi+&Py^H?Gjg z;cD<>6bL)RQEx7V1u>3EKDULJiX-_V(3>U6k1-_J&BbtvH-y3oh#jteZ!IP`wDoyc zV#aHr(w#fs$(znH{;4$7)z{bg8aTMB33=9IRC#?==}H~hEp624g_w{zV=gMS5Zmstzr~v%-ZpGf}oR zm33%cjWh$hDr?*%QCfWU-l`V7HN66vi~yw?bA{5}+~DGaxKfG103nP$G*x>AMGtFP zQRnt3%ly^#=xZQ~cbT^dEsX9uud)nu8ECD~*9=bOO3JZLFsM{1%V;%1JQ?6zniuE| zU!}Pg3lNv55se9{G*;KGa=BaF7$ZFHg11Xuj3;`I5GNrJAM>43r{3 zBNTD;QA*AXJ)NjWt8n?7(U&o#QCJQ(e7sv$!rO51OlMO~4gD`dbMZ_$eDHY)wajN$ zS2G5<1{xR1Wi)b(!+yBwsVX>)Q+OI@%xRplI;W}uCC}`)r*Xm7G<-)9s{2sqY zFseLmcs9MRu}ojWV*{(cX(b-MTy6!A9L04tb-sm_^_VpAj74jr@KOeE-M9D~`Rb-x zU#Wy=DOwcOdA)cu--Gg@1RS1KGJ$ZPo8L5xmh1XdO)KEJdK=ZVLUYp0mZpa2!s*FF zvt8j*)+J^Es+@aBbd59 zx>ZAS8P+f@=*Acq+?7gQ9qL$LC_?UEhVrVcq5*+A68gD5Z*qX;o{p;dNJPs$&q^1T zl}+wCAEpRzBphZ|dok@}28G{f$4VV4jA%1W`t$fY(OpYIYR-zMxyeleS7XykwBm4( zRssz!FIGVy4VZvIYMcBm99C6c$tk=6`%27FL{|#-m4eoJv3MXsO@ptgx|%}z!a`34 zoy$YRIz)JKiZ~+q&G=s^G$f^7sl^j28p=wAe5^!Y(Vs*WKlQO%4CQWKKQ$g7EkAf) z^n0oCDD;@fpAr>+OFd?P6az*idfri5nw47IUOxF_m_;;NPSENidetQ%S|(rnLyI~L zZz<7w#N?Qs68O>!nvL~!jms7O2^ko5jZKk$0KgaPE*Hh&L8$oAIB-YXmN5JP0<{{b z;f_|*A!IF-4^Xruw6A8W!*F1QUZ*Quja0W#Y6!~!Fwu$_0L$uHe6`UGzKlS1MJFnu z%t7SI101ri4}Z$C`sMCMUv$hchbt}T#=#>Rqb69;)1N;Os6kDF)MKbjgC`C}|1q4Kq;$XNtL2NK|FM49a+_a@m<;Nfo1lb`h&|i{MBlRap|N@_V6j zGMxI7H2!}Nc-2GD|IcFW7iqjHs8Q*qUcWxgp>pZakg!ALvDqjWA}>ys=<204_=L)y zh?V^!__qk_5@BFj*id<$2ui9d7m82@FSbb5WkC__h_G~7 z_-v>k#Pl)iB?yf(r!%kV<6OA0-aUc}Z{LjMop z6hL);t-M zJG{`6!670$z0}0_A~!?z|6au`;EiNegv5WgD*c2G?*kGH6wG+)7#Pnmgi4mQ*(V~p zY?DcHvqVH|4=H9ZDfnKLX1`d4UIygmFNY8Qb0bD4Jo@!=%gwu zPOd&pOG+h;Xu(|AmXvyW+R_sZYe{LX(CV+JxT1XxPd2P4<@G`@JxXsyE0n{UQlt4y zn(#o+t<+fgA2b*7a*-O6o|ZanLK7>Z*v9&%XjPww+bUFJm9~lg@N~FeERezP!mN2e ziQvx>R;(fUts0l$)p5FdnZl&XV!W)atIU@{cbHXPBZ7@#*8D$-;4@*?MY}|Bf0#92 z2Hy;`F1k=SvoP$`eCglvFl#}R2(AdT=IahdJ_iY#cL|EoP?6!+MKti}mFFJU9YS_@ zSjVsYPK5sy#d|`8pN``7Fa&T|$c_ri*Ju*_5N7tWDEX|nn6c)Q@!t+~O%$}33Y01% z!z%M-@UbxKvK0J730?gK#qw{x2wopyb%@}m23Vo?$P*xO0q<995wwR{^J4S-A2RfABt3@= zOJDH#A%jsBSYb z!o?y%%*ofvuq*5YhRII^I3CT^J&$}|DXb-hl~%O2NN~Pj!ZR6sI9gAFU17a)8I0r{ z_9DsYq4grs8$~?If(#!CCxA8Q^`fdb3TjlqjJ0-~u=b;%cocF8BZtF|xn%31ufCv* z9++aT-wOk>gwaD~P?iWvLfV#&f_1v>(*}tK;Yo|22E`YXI=(n)u+I8e&|VsZ6j{Rs z(o1*RDumC6v${YAUkbBM8<%CQXTmD;WiS$Jajera*5lz=7s+5G)@daz-BI~>2+(e1 zUsZ9;j<=#*hFb*>wI+iH!mP#XGIV2i2-?e*nKUkA)AS<4QI9+PK!0~J;6$|>GA(V^8c?5seRS#q!eaMN;VHp`uN&Debs)bV8b}Ym{gi_ zexJ#SQxXk$ay6!?#-zkVg7|hrjY|nkgp660Qmn_#{XvXLx=LIYRL)CGgtkRhNgO{M z;&Xu$NR*g(9)gKc$uLT$Pl}qzbPHNI5k`q5aR-FVnx>A#230cS3HPNfr+(Z#HZfCD zV16p3sd>m-KeZ@9_i1FG^ZOuwijp=?F_?88`PF}%GDM5O0g37Y>|v(IMyA5x(Fc;x zql{e03}=VKtZ;TX%og5qa28bc(%^7pYy#mtjuMU{QNbfuM+;YZ|DDqlE@ zQa>k>wWt_5;ru`)mnlQ6R4RExmFTGXiM*Z^r6AnKpk0`TRzsDnSTWV;XE+u<^z;dT zJKcCl!=q8I4G5Q^0v{!~RrTw5ar%PxyBM4z^`E9n&}}6B!hnBrtC8r4A=6@N0D6LC zM-7?DrmqmX9to>o8Zy&O$C1z<2z41UZKhVpiU}PvWR5cZ4B2i%Ul}rU6h?`&r}1H2 ziH{xX0aGg|SMQ`m?*dv#>Mt5HO(t@tnb1py%v94$KmkH88#0HO-jV1PO7sJX{$|L` zGJPu1tK>r1+1Cu21t#jk-1UQo%!#I<()HI3nMI}xBznV;=`dXkw3X6((~wziS_;Hd z|GOcx!c;BMTZYWVCi?d>uKBhhbE#>iMDG|fYfbB<<{?97v*|{O{$a@UndpCXxy|Nc4drbG2!kL?0S6TUFDufV_-9GG?}`CR&bic-WY^Q8m#&*E~h8er(L#teOr- z!L6$4GeDlqC&tVNRZ|xrugXu2nMlQaAtJV+#0WwVCpv}Gx&?J`>lRUt>ku~p9pqNRns~^UJ@q(ji&1*JY~%M*=X7%;g2YClj&Xwe==sSH<=y; zyp2r#f*LTH9+U7_)PTuE=bpSmx={lr?M1*Hq>S$f&fIF!=zx(Nd^AdtobBP18$AeR!Q6+czv994e<4p-T>hCIIT^}(}6d}X&a?{An@im z?M^8l1iUp)qf=HM-v<0(oc3oa9}c`NPJ2$`5x|efX>?M`{mTU25vLuLI1BjMIPLEe zX9Mq!)83Q#EZ}`{+9wi^1n!K}=!-A7y-~og#A)=^7#xoVJ{YI{TjH~U{~o8sV;JZ1 zbAS)UX>{_+aSrhNaaw`Ixxk0xv|@=dmt=kxr&UOt4}2s}YmvAB_*k5Foy3K}$5CDq zj{*K3ja*kNx+*eT7QWr1K(}Y@+6)Dyw#$WNIVtz0gE`t^ht5uPu^z5%AyRwJPA7 zsDCX1J`}HAA>}UM!|~dBiI)O@7O&kYaV7APc2DmjrJ4fPL;PnaG6p8DA+Y_`|5?>B{LxNTT%=6O# zyfHzmmGUOw%?a8y5;p_iouJ(&@fE;Z6SVsz_5weUpgk$E5BR|Z#axByB^4DGmtm%V zNzXvgyn^`}XRf75sT83HAvf32q|^cQHKEI~UQ*bj2pSiGmu{Y9 zS^;{PWRodgD-a!1o2O8`>wvhGsXX525Lne@evI9h&&&O2UOqldF`F^H+=s9w!%SZr z@D~KlR~TOcDKgKA_;w+sLEcP&lDQmdD3SSnqGB!s`xwOW8RiNEe0*hVr)BSDKx?QM?ZtXjFGgM+ zs!3tAX0lKd=UFr;hL_Q#{zA&y#K>yK@*Fr^!>kx7sdTN-^mk~|;H!-xcisc~mC#sn z=VKrmNVRd~z&|A#PYy5=Fbf_8&_pP#Fj}99V-(mX7A|$+*NCT0R#i2Pa5)N9n?}C% zSLRcA3Pt8SylE9!mn|e-1vjXq+k_GMI+(ifCornqUe z3Z=5u;lO+}Wvzu`DTAc3@VjLT@kon@L_|wRUh!^q3f z%b>-rKFqCVB#~qjB>AzSYc#Gyjk1VEm*52)>=(Kl9(M?m|K zQtHomoqWtI;sc1LlIRnH1B)s65k(q!Aq5Xp(^ZDcB)>!r(xon3Oi9O6d5&0!0^@1N ztCV==7GR!uf=Y(6^yK=elt5+@CO7U%BFEW0K}}7jC)VNeogn$vj=Hdkk}2THI1rO3 zQ^1os%Xss_HM|lERa%{9UIY1D@_D?T(o4YHjY94QR)&f~uW4vwRT^!ul2eo#!sFB= zY}aSHkhi}@;aVuYPk4+d5BxctoX&%%(SSw4>anGU@^Nkd!5TP)9$aW2z=)kUXw8W8;A?b>Umd z=!FwePoE=jwhbS#2lHBnVQ>o+3LwMQ#xrE^PLV}*7&m|C?;#uZ4ww9e)XbFJK49a_ zxc5NfETfK*G%?06y}2l({tTfu)F7>n=A|~&z?~i`PxzC>!J4{|-ip!+rTU0F;2n=q zXrO*L;%VTMR3?Q6YN{yb>AalB8hANRMUVWM#AA2@nFj2b@uD4P;6=;(kuJ;Gf!rKN zhP3kxgWp5EPT-tYeAv+KlQebk6JXv1oZH%}{st6cic?Obg55AU3vXY9wx3Py=x7$n80afGAPdJeMD@23;~ zn_dhK;F*M9(&Y~U&yJE$Ky{5q{b>hv{YAjJgmwMwaTL~V=ZC~$oIJhE9EQfmR|7xm z#v6d=k?~)2W7N(UM&W)iehJ~94DTQ(m^tKGl{{}z7mlRDyTnKn6us5K3+@sl@AZ!Z zPbGgYF;cG|@g;B(;Y*D_;|wp;hT+3O*k$B%Rs}F$_blc5nNI-ECAq-;P`mR9U#9EN z0$xmbv5waRR}x;L<2QkM#p&^t;Wlw_k!z#O&|o`-ynma#&m4jra_?)w??Ll>ws?mT)qn&z{iY2Dz2cL4S zUJaP6(UP9S)qts5n}lls)3p#F-=Mt)aENx3lwJ#H)9wK@AYHW;FiUGi&babgz){*C zr1Cnz9PLR!{!|?REYS8z>3YD4+BU?c^{d(jI8}RDO4|X8v{xkz0v2m;NO%LFLwi@k z4nU{&k%Tt_mTO-~coX1!?RyC~0#;}Sv=6>la5LaiEl$E)0Bg1Ij`SwLW~~pTysU1; zgJP?yrAvGp@OoAI6q(@i+kx9vElbMp0KP%h=s|?be*?Tx)s~`WIKB(`R#kgR#=jSM zv#J$H{Vl+Et6F$3cPsE#HR@T;pcq@AJkeTe@{35;S@b}$TB6ysryh{VNskvHiOT3{ zXOl#8=wahG65$at)pWl^c!W$hJtWaZv={%FL~{+;i+=`aE9%jTXSz|Q7l5b-TJcO* z5cSNY7@~adAuuUM7drmNe%nn|pdVl)>9?ISay`(m0+~#Y0}Vr0CYjmv0?^q4SxiTO ziUdkFS zO-nKV0a5A4andu)k0E$7#ks)z9D-XBH0H%U1cJkX*T8um!GXHo%cOU%`EziOAUH_R z{I|rNXdy%50h_5f{3_&qCz*!)WNKw-66jEL$^X|{BC!0Qt4{=$568N8#iM2H|J0l#_>q`;NTw(4OMCxq{71y%eV?EQ1pQjj*!0e% zFJBvt)t9fV4ibySp@Pm4^uN`YFO$aV%N1i8CTP0m3R)qk&W(J=>d7^ve62I0sfXmN zjPj*O`6irvZ!lIr_BDiCW8Oj7E3kYKAvV6^m}hrT8>7~UNmxOb;urDIsl#DB^>ajz z+oX%muV9_3V8y23OToISe7zI$N{3BJPCYPvM^oz??qJ5|-`=5pWPJF%%tcdQ|MmF4 za&B8-K;=4_ug zVe|19Z@4CD&o1rNpJBTX92$a~ejRKo?!~y9akt}s5I237ARRLv!hHnyN!%9nZt6I+ zKQj@x1NUOw^|)#3rUzuGDT^s1xM+z(_#si5^hiwjdLeHT_%X^nu0I1)KbeLF`P*1u zC!;V{;+8L@(_Qv?A(A`zQ9h4 zNAg9!TwQ@M;e6b5(LNL5k3|L2MhxMDNP{lg9U(kh_)dFlgwupRt?UW^S$0G?PWTnd z04~}_BfL!L(@qrOd|{s+tw}Wi-=7qDrAJ-T`4)Mii}n}^-^GVMT8r zmq?1op|(iv?0=#|uLVuUE&D!|JJ~U!q)ogP>us0(mhBr`FbdpOC|l$hxV!IqefShdZQB+1cpq31 zYDj*}wQStP(T8g4zfM|lEPI{xaOXv3hT9kPz5VPtHGkVQ^|7<-&f4>M(g%asZSb+1et+d6<*nnFBwu>z>d!8J+w{Q;8%A9H>N_8w=vVnm z#^Hb0wawXcXoKz2X{UZ%eQomdcMW!#|2Exs`=XQ^wluYWJifd6hm}8+TGtfSwD}gy z{BX_MF-dhteBZcjx2;|~@ZQxI{FsrkzVhJ{&#fN+(-luG?@N8`THLqb{vGZexL?No zA?|N*(+=eT+;jjw4R<+iH|`a>lDid9Y)*{5BB?>hiTq|)C>uKCVi_R2?MLU0j zMJEr$q9sulC@xxF5Q|nF!WJzvh(&8Q!J;J(v1r*SSacdhEP4$=u;`TrV$m~=V9`Q` zShN}xtQ!G|Mf>Bz3EB)J7VVS?En21#ird3quu7VZ9uh;(v9EZTn+T6AbeEILOMTC`Lq7Clo4C+PT&Sag;rv}id@EWSzx z#YIPQ#G=z+5s}u~#G)m*V9|1xShUI&EP5k`SoA0={GydPvFK4oXweQCv8p2G>0y9a z^o$_1=p2JsblN0brH2Dz(KCb4q7^x@XrV4x^teGRdO#8^dXyj*Jz)qIoi!4Rjvxh# z9z%#l&u4;l3XoXzfFM}+3l?oui#*b!9%<1gk8t%{p+$RnA|f5#krq8Z3oY77CKhcm z3tM#lN2~;B$%tY#Mr^u}8ovm~i5XC^Kxl3AdIgipVSx>Nx|TxHo4gfmiY}*4PKz&3 zu{J}FSAtHH%X6tWA@9w;JQmuDn8OvrY4PRR&5w}u7GEB^RAVykO)if*%8`C=_QQu8 zu-}{i@+9G`Gvr@x+W&fn@@*BhMSY+*|Kz^uWK?i(a=A6=KZAX_`KF!0zFg0!SIt$_ zRmnK2inDBlZVvJ@1b0z8txUSRseSOvo|Jr@VTNX&6^OgR+`(=%-Nah}=~EjhxL((% z_QEfzU)EEf+U;uGOGCQ8Xg~NOabaJN&D-|_2)7G8YDfH%deZ~p^j{&t4Z1yQPyCX4 zG5%8eKjYpe^r?OEOX|-Em~Mn+$`^f?_NW_myVTBl=*8rV^yfq802(i>WCExFD$**g4*W>Gq^Ih~+QutQjXkOjei4%Hq zyjOaA)#QBfRidZG&>8sVuFCrS8J_z3%9i~4x@G#8SLPSwjn5k^z334YbDsFR+Pqo} zLJI%3DEclcKx9aF7-2M5@h!0cDDUvMN(nvr4W~SV;9*%B`FhkCEWVXAhKsMx!WT{n zru?2OKzKo46SWLMtYeX(Tzoet02)7iUnT!CUepf%mM*aI>_+N(DC|CB>R;yxKD?)I zBSeU}`d4e|Z2c>>xD$F7b%!X-zy3;S$#1O^kbg;)2+OaXia`DArF5)d$sLdU=$CPl z%0?y3VPh-<*r+BpvW6M1W@j6(GE7(5=-C`!&Qc6_s;R7xG5HZ@x{94;TxHqFSSgEh zvU76T0CP1PWj5B%VsXZSK4#Bneat@W{cT~UC9LljmTsQKQqBKl^UNFB$f=B(jXuj% zW8aOi(`O1^6;|qWH#tN*3axSPn+#$4nI2|?wNcn&Ag3S zT3EI@k6CDRK<^BB9Cr5Nii{aButr)x6*mi05H_#nsE;F!Bu zMnV~je}`#{Sn6|Z7~IjOvJCTLHV{rSvz^(D{%SUu17jkh{Ej6i+{_GM^f51DLqX%; zhUM8zgKINpv3T=6EZNCY!i;2;T}psmV7?b_x3RNthRRgr_z+Y5O!*QHpk&w~Hs%gC zVhu|^55{JZ6MfA$GutIBV;f6b#4?O6mRZJyJ{IqXtH#NlEY(;#Rr)&+{$?15SFpjx zMaUWaG-j-0sxfsVQ!J0M?1b4Y8Oitep?du+ZaPaqKGWcH66M!y$zQyX4KuEo$~0q2 zCrc`2+BBA6^jCnHIF${7KRL5d2F5EYSR(!}h4n+sQr0h@r$2;C6U{sp#rR9ZG06vPJdy9>SlYq8>#tp+?M?GOJ-^3e!rN)$-^WNxbDP zHs}?W^e4om3Nm`pj*M0qtYL|U@hOZsxKjz{zpzZ>@(R}9m=2HN!|?U+ubTWzC;zrE z75&F@5z9(2YKCkT6;@$3CKw7-HUgnTEIq(RSYBa$11#CHn2j*{HnQQyq**M%G7x2B z$m)moYe}QF*U!8To>-2u_=PCFA!cLZXV70^s8m^wAv1*y_OlVl(Rb*M>&%vCSf&N# zY{*VUK~yX*NEi7pzEL-vr73m0JCKp;}_bxpxs)nekh>~P>v2-%t@6sDt(v`YhWFL9Q zz&XsEk6N>!j`Nsm#?trN%HK-V^Z!;~ykd5x~9!oWp^xwh~??ZwWh&j+~ zJiPi5l#FF6qNkgUTaB~8P5_t6D~}C)1aQsNMl2de=%VCn8p&Pz%d%9E!SZ* zor*XZ!`@#_R#J?=6-GXgMldp%EjNd)#2cS6%;K^CiGGA~H(MS@f0%`#VmVs%RCbOT zGXrJJ_}-d|Uh*~8Y|MFt&E)C!HJ?FgB3BxMO!P%BBJ*)(W6CVc2G-xhY?ceT{pZ$L zq6%({D7dK=%w{&er0708yQaDqANrY%uPB{t(4$bD#V~TmqZ#KRKP7yYi8n80nKkTe z$i_@%1!#c0+SqeUwK&m~LuxwfmtdLAY>%=*hgkf}n7+S5r`TwIjIk!B-O7@$L=*6# zm=`ZczupM_bTnSgd_EiaB1@gda;WvMV?(AQ)*@pyT64T{__r(>66P4M7RSd04#(&G^Jk2H}?JW3^gZ7nXew&SdgbfF45XNcE{CtqH4aoL6DJ<n5eR$3C4bg5h^U&X0daO73gP9HsEG9@F>ef9p?LJ zbkH!{#Ty4;QE~+vypknf4v%Ls%rOJZma#1LMK+1Xtr1gMQ71C~3>z{VC7)qFh!w?( zjckae7PEezS!{^Whw01M$H#_ab{&WoIt&hGP6OG9{9nwnCsU_Fa4G6x7aM3yqN!;# z3JJNWVQJIYKudolx{f;VRn=UgVe0vo4SokB#YXD;8b*^L#>cL;bkdy0@=@&A)G-_1 zR4SOs_`tQFA?KeeD82LqCu0~&&Y{5!s z`;{1w;{&u(dX3Kl#>cPhu~=eumScR*+=;Ipc_8BPI`v)k_e{!D@{D%eIEcn+5 z+yY8|UM_H@pbG@QOyFWcCklRnz{5e$Mf_w?O7A=DT~fIo14R+#?gpiN(avWs{x*P~ z4cZ7=2ud5S6mKLb#TyEWbEn+?pj57LpcL;*>~<3V7<2;Yo1j##yFkZ+J`GCo?+48T z-YoEq0yl!9Ipi(@rTi`s@;RWCexbl;3p!NLWKc@S0!rolD+-^|`2m#h*8;x|iZip^ zCj@;^$nO*K5Gd8l8c_UAn}QEYcN8eudy6U^f4>7I{#H=pAHsee;pagKKMpz)__v^B zZ!_p*-~>=IaRka_|6|Z8z;A&L2i*&brl0Eqr6Q#_42dRzlAT@Hm?M0rpff@7mpcL< zIO3f4PZU1kS3n6*0v!*0HYla{IhYjxZ=mGIc2G+HAy7(xGbp9M0*O(2R(w#rAF!v4 zBkJ6bL2CFWtd*eZ|rII^L@cV-z%eh8SDwh*5Likfq!tV+CilC1P z`4)k17j%uF9wDDAaH*h~f+h<2NjORN|0U?#g6;yP^#3UEW`WxTrq_Z=ULo)W0@ItE zWN)azaRMJlW=Wska3cABf$7|x@cjbcB=9PMmkE54z~>2kmcYpZclXil9|I+O9|^hx zleb+>`H-N074%_2|Bb^g8oBL`j$=N(-&_Nyk}nbT8H_80|0*cGVNKX6=(}jlgkKkQqM!wWeu;if@=pZaEhvo_ z#23ezX1Bl@g3@dGB>yA&dp?Hvf1q(7i%HW^kCQ;rHn|*ap3}onCjH%lZWXju(4~SF z32GBm5%jRIvs=)ug0>2}RL~+pZGwW333ERDBTD@v34N*nosX^?z_j9S#o$2~y%$25 zGDBCR!1DaBT z6TLz%&*$D0Sf0ln675G{W)2HzZmAC9rt z9b=E)7mBubUJM=^gTIWyQ)2AVKgLAcyC+6Y?+ZrDKa0WN#$frzi!2~IiN~L5qhLH2 zW1rr4inf1tjGW$QjFu0G!M}~cffzg{22o?{3zAJ4vM2^M`;0Gy12KbmLJ!uH@ps zMyIpoZ!+nq=Z`Y!yq@;GQTdGe875a5ek=yE@J~VE#|T^S2ac~r|KU29OZwNCoJRki)AQCS2R9E`zeRC1XNoTF#o%T~wF8p*5uY@x3<5fbXH(u0F zTt#Ww!!hxbgOn`FOO{fNzp|xD!7ry(; WZt)XvWW$$LI_JXTk_qFeYyBT;gTVO! literal 44176 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 diff --git a/dump1090/view1090.REMOVED.git-id b/dump1090/view1090.REMOVED.git-id index 29d0978..7304f82 100644 --- a/dump1090/view1090.REMOVED.git-id +++ b/dump1090/view1090.REMOVED.git-id @@ -1 +1 @@ -2b92bed76fda7eb7a675c76bdcb6f2ab32153345 \ No newline at end of file +8e54cfa965ac942c81c1742f1abe3a82b9a8412a \ No newline at end of file diff --git a/dump1090/view1090.o b/dump1090/view1090.o index 295f8de338378af6bf565a350aa45e34245a09a0..a9231fc001b09429d43ac3e03493b9f8bdb459f1 100644 GIT binary patch literal 19276 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 F{|BT8g&Y6? literal 28860 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 Date: Mon, 4 Sep 2017 12:54:12 +0000 Subject: [PATCH 02/65] formatting for terminusBold 20x16 Former-commit-id: fc05907e9365a464a5465547403090f0fe0ca7fc --- dump1090/anet.o | Bin 17960 -> 21544 bytes dump1090/dump1090.REMOVED.git-id | 2 +- dump1090/dump1090.o | Bin 37100 -> 0 bytes dump1090/dump1090.o.REMOVED.git-id | 1 + dump1090/interactive.c | 25 +++++++++---------------- dump1090/interactive.o | Bin 23896 -> 27652 bytes dump1090/mode_ac.o | Bin 14044 -> 29924 bytes dump1090/mode_s.o.REMOVED.git-id | 2 +- dump1090/net_io.o | Bin 40816 -> 44180 bytes dump1090/view1090.REMOVED.git-id | 2 +- dump1090/view1090.o | Bin 19276 -> 28868 bytes 11 files changed, 13 insertions(+), 19 deletions(-) delete mode 100644 dump1090/dump1090.o create mode 100644 dump1090/dump1090.o.REMOVED.git-id diff --git a/dump1090/anet.o b/dump1090/anet.o index 78e8fd76107e659002a738be646d7f642ec72bdb..7756edfb56c4489a2be4e6642f61945dc1acf1ae 100644 GIT binary patch literal 21544 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 literal 17960 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 SaAeK5bw~BGt03Rw`Tqet(C&-? diff --git a/dump1090/dump1090.o.REMOVED.git-id b/dump1090/dump1090.o.REMOVED.git-id new file mode 100644 index 0000000..55d3868 --- /dev/null +++ b/dump1090/dump1090.o.REMOVED.git-id @@ -0,0 +1 @@ +f9454b21fbaa395742eefee887a437a2bcf85b60 \ No newline at end of file diff --git a/dump1090/interactive.c b/dump1090/interactive.c index 1ee1d28..06a064d 100644 --- a/dump1090/interactive.c +++ b/dump1090/interactive.c @@ -441,7 +441,7 @@ void interactiveShowData(void) { printf ( // original version "Hex Mode Sqwk Flight Alt Spd Hdg Lat Long Sig Msgs Ti%c\n", progress); // pitft version "\x1B[30;47m\e[1mFlight Alt Spd Lat Long \n", progress); - "\x1B[30;47m\e[1mFlight Alt Spd Dist Dir", progress); + "\x1B[30;47m\e[1mFlight Alt(m) m/s Dst(km) H ", progress); } else { printf ( "Hex Flight Alt V/S GS TT SSR G*456^ Msgs Seen %c\n", progress); @@ -450,7 +450,7 @@ void interactiveShowData(void) { //"---------------------------------------"); printf("\x1B[37;40m"); int numNoDir = 0; - while(a && (count < Modes.interactive_rows)) { + while(a && (count < 10)) { if ((now - a->seen) < Modes.interactive_display_ttl) { int msgs = a->messages; @@ -527,7 +527,7 @@ void interactiveShowData(void) { if(fabsf(dLon) < .01 && fabsf(dLat) > fabsf(dLon)) { cLon = ' '; } else { - if(a->lon < 0) { + if(dLon < 0) { cLon = 'W'; } else { cLon = 'E'; @@ -538,7 +538,7 @@ void interactiveShowData(void) { if(fabsf(dLat) < .01 && fabsf(dLon) > fabsf(dLat)) { cLat = ' '; } else { - if(a->lat < 0) { + if(dLat < 0) { cLat = 'S'; } else { cLat = 'N'; @@ -547,7 +547,8 @@ void interactiveShowData(void) { snprintf(strD, 8,"%7.03f", d); - printf("\n\x1B[%d;31m%-8s \x1B[%d;32m%5s \x1B[%d;33m%3s \x1B[%d;34m%8s \x1B[%d;36m%c%c", + //formatted for terminusBold 10x16 + printf("\n\x1B[%d;31m%-8s \x1B[%d;32m%5s \x1B[%d;33m%3s \x1B[%d;34m%8s \x1B[%d;36m%c%c", count%2, a->flight, count%2, strFl, count%2, strGs, @@ -558,25 +559,17 @@ void interactiveShowData(void) { } else { numNoDir++; } - - //printf("%06X %-4s %-4s %-8s %5s %3s %3s %7s %8s %3d %5d %2d\n", - //a->addr, strMode, strSquawk, a->flight, strFl, strGs, strTt, - //strLat, strLon, signalAverage, msgs, (int)(now - a->seen)); - - // printf("\n\x1B[%d;%dm%-8s %5s %3s %7s %8s",a->addr % 12 > 6, 31 + a->addr % 6, - // a->flight, strFl, strGs, - // strLat, strLon); } } a = a->next; } - while(count < 14) { - printf("\n"); + while(count < 10) { + printf("\n"); count++; } - printf("\x1B[30;47m\e[1m\n%+3d %c \x1B[37;40m",numNoDir,progress); + printf("\x1B[30;47m\e[1m\n%+3d %c \x1B[37;40m",numNoDir,progress); fflush(stdout); } // diff --git a/dump1090/interactive.o b/dump1090/interactive.o index a151a6eac88edb2382ccd1675d1ae207a1e64866..eabfd72a0a2d52f2adc727ed5e06e6aa55c87ac1 100644 GIT binary patch literal 27652 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 literal 23896 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 X81Y3guSEB}7OKmF4*I(0?^ga7_xlt= diff --git a/dump1090/mode_ac.o b/dump1090/mode_ac.o index b5745f4adb45ceea8bda12779e2a3c708cb667a1..cd90dd693d21d001afebabe564e43a084ad8a9df 100644 GIT binary patch literal 29924 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 N^=%E*@?YIB_P;7Fkk|kK diff --git a/dump1090/mode_s.o.REMOVED.git-id b/dump1090/mode_s.o.REMOVED.git-id index d8d6079..98ac780 100644 --- a/dump1090/mode_s.o.REMOVED.git-id +++ b/dump1090/mode_s.o.REMOVED.git-id @@ -1 +1 @@ -bdd60b55bc0624ff84544a794ae21d71eaf0adc8 \ No newline at end of file +d5ebbbdea727d372f6d868a8f114fdb2c4dfe1f5 \ No newline at end of file diff --git a/dump1090/net_io.o b/dump1090/net_io.o index 92db651b18a0a541bc6f2cf06ece0028e86706dd..1e0ff3fe3b78af635b2c1eaab89e5ea6c3bda67a 100644 GIT binary patch literal 44180 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