From 081ecda40974b45e16112bddb81aa9dca1da0aeb Mon Sep 17 00:00:00 2001 From: nathan Date: Sun, 8 Sep 2019 23:23:38 -0500 Subject: [PATCH] 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 zcmc(ocYGYx)%Ry5*_OL(3tKKSYvW#INiLYKm9(;iR|OSYqAe<`0&3Q-Y?(lCXfY7L zA&@wP;s7Bg5b#4FAwa+o^We|}gb+$7A;Ay=ga8jM_&w*`-<_Q~lAg~e@B7C);5+wx z=gzI?o?B){drmk~k`f3w_6Rt~I!Vb=$9d+qq`yGC1x}VT&8aE9=*tI#1P(B~VDH53 zKd0MW;Tt669Tf4rV>m>h_>vKPzSnUM9(u`m_CCPg(u-aTPyb!$e|{hO)*FEg#E|#w z0|)6Sz39=>i{vhe2r-zO@8!%skQQ7sRfWPGCbbLpCbBL$gcG}DHM^ykNM^N7oQ6B_dm7nXw8{;==mIhQ+nQe>E7D7$sZ2GZq}Vx%;{ zkqjkt+Wg}SYAqz{0q@|7M=uRNa;&Kj??g_Ju(=frmbFu5aH0iyPy(7{`ra!{B z1|-2z?3et!IO3BN=`dZ&Mt+;~V7%Lt-iuuCs2QBGaqm*7rKyfH*%=k2liVfZ`IfyDFbXyH`b|Vcx5n<`#x&j^bB>Jn=461|lL7AF0HR9cvQBcn)4N>n zjB{M?%;^6UU}<3CjVIn5rv6qZ^S4zLJd;WnptH1mBYCE;r4Tf< zN=fg@eDqH8nCSQai7Frd-!V45JM*zOC{L#6WrbS5=jtYz3Yz)1#T3>Af1ADVA7FpF;qUOh#<*m@%T;BJ zOXlA>J3$lXJ#L~!SzYlqC-WaGh%KXJ_S1c$O~(=KFkUH0!S%Go2Bc z|NM%y%S84OnypUI@Zug~JBGC$+;zaB8c=PbMh;R_ZH zK=_h{_aOXx9NqsRgs)ln48lP!qLY$M4k>J43)Ojg%52v2fb`-lTuKSdrMrTVQUe^v zB1mZxG8fV)kyb%U7ile|(IOq4GP@x*yU~k@iAbCel7g%SGA`DMzFyAgvJT8A!Pz zJr5~Qq!%IOi}VU4GZB0p(kiK!1CUlr$PXc{5$R({hl}(Xq_rY_1?dQpoHWz!M~ajN z=_rxXAssE!I7r8clmY2jkuo72CsG!q0+D7xDhjX(3PLItX%VEbgv^Ch8ej{u7E)P& zJ5>Rs;{$9_N+FfYeN~Vu0^IrQ(`NUw&8Q5pP1=TQ)d8NnY==}M(sv-$inIe#ok&+g z+91+SNE=1E22#C9yC5})bQ7dg0z75f4Jj(u_CPvKq`M$BigXX8CXw!k)GX3oNG&4m zgA@~KKcrTXo`BRQ(le0SMS31mhe$6%I$fk!AazNuUx(Bq*A77H73n=ln?(8$Qe32u zAtglmEX^6mc8&kJBgs?LK;zgfvi)-@4+bOCc@80?`?2=gLFZ7hr2TR7e)=EXC%Ht4-8gPrJ=x}euGC#1V-h?; zc+xT^8v*-<=&{k-3~AM%xCP>FJIu7BIi;9Wnw$a|MoKrQpg9$o(>BQtZT&g$q*zay^`u*m zY%j3pAfs8!p3AaoB$@aRx|)O^C+>K0Cx|;yTvNPB;-4(;6mc`fJw)88;!YDcOWf(= z&JcH|xU!+)8n)#63aWYH@4CtrfRU+zsMx6t`a7260am_at#o z7WWi!PZc*R?rGvSirXY^v$!qd#>8zEw@uu3aXZ94UEDLo?G(35+-`Au#O)P#lem52 z#>GvD+b`~Bakq#&AnsOi&lL9?;+`e$+2Vdv+;ha;ChoVyy+GUx#r?Lp+r_;|+>6D% zMBML)d#SjWiF>)YJH-92xL1h#J#nuT_bPF}FYXV--6`%5#l2eGABlU7xYvq%ow(PF zyGz_3i+h8(H;Q|cxO>F?FLCb__ZQ;cCGOqg{!-juiF=Q@zZUmiaqkoNesO;z?gQdJ zDDGZy9}@RraepiBK5-ur_rJw`RNVdI{!ZM-#C=@cC&YbH+^58STHI&E{k^!)iu;_n z&x`v9abFPkkK(>4?w`bcN!*vkeMQ_?#eH4eH^hBY+`owXmbiZv_iy69EmkxTkW-2| zrJ7TkIgK!)hYoYKu{v^kA2r?KWV&YZ@Z(*$#xXigdCG|8MMo6{6?$~31#%xS7Q zO*5w~bDC~WGt6nGIn6SsY;&4zPBb>b$WJdFG2Lh615)r5aZ|-j6L*BYW5&tzhrGj# zcQek+rK>XDrSOn7V_Shwp1GmQ%Jca8tib6cCufBt(|LhmE~WS{8JId0OyiY(G7?&N z(4I;5$OAL5qmZ4>W3Jg<$R5qu>@H-Fd7u1dnu0^`qQf3fi&!v0d@pUVD-@lRuamGNh>pXbJolRcCD^~OJo{brXb zJ9|0RirM+d4l-{sVdk*E-T3FSzti{+V}Gyl&tt#YeafEC{sF@ma!qeD{zdHHPV;we z+mY$3#SN1yjhMao4)RLu??OWF1aflwEcQ6H3O(KAt0ne?9xt4UcdxpsMBU&osP(!$55- zdCeU}OI4lfOJzRY;skh~SB?st1J@iwn+FRZIp@)0?f*%*j3QWQWBVa5{Y=7XmOURZ zzQ8rDbafF6fwTv4b+L$9t+YPlV+jYb$5eO%llM@Lmu|+TW%l|_1eOQt0(t5_`>-}J z?iIQ(hwmFhZDWq>ofX!52VMA>LQotj>A_?z+)LaI^au%AvrR&|N&I`lg$Ad@DTdk+ zlXQHRWB>c*cmDUw>68Ff#&D4@9CX=j_c1|_79B!@o9Q44_2x!z!8nYQOaGjdR@UuQ z)4xJQm{nHKv+#oX^ zOnN_ZL(F(T86vyR4UygKdV@>cz;jwtoWP{O{0URWrcRhSVNzi7s0=cZDN~))2}h1S zYHZmQD%(6~?AT-JIz7{XmwN4piA2fv@`*!@THx?0eM%s8!q~BVZ-B(n-_Fw{mvMGGW_&F5M3c5I93f+1%+3|_1OdNF6anl)O94<*s0;l8+pUeaQ zlqrE^@|n{-!Xe4L&`!;Gii7hoO)@;fW;lxirJIuT)#;KOGPE-&G4SK2r(`+KOiIVS zYgRJqwG=qpQ%n+PBTg_T!TC|y%vxrJOi;|x!9RVa-BRY>~&5(*PE}hDZ#O;BvX0G zw5gZSP0q?3hnuf^f+>XKtnvXWvwO$@LQ=q~v)&eKot+x%y$&eN`B$LsdMmkR+^KQn zgJ%iOC*YjovFGpU(j(Odnl?D=eu-EAn@gc@#F?L75W!g(I4+y(b3)9+20adF|c+`bj_;eo%EK` z!1A{4{uNCfiMS&{Iy;(Hv^6&m4sy7?+k`_@K4I`p9Pf(6*4`LmA2tK=ttte)5|!^b z{Ek#kGnXu$XzA$5&uQnvkiR9?N`5M+L~bx;y`#qsAzrEvia8qV>+9@@C(N}(M^`M$ zej3CR?R~MvmgVvG#=cm~a!*{n=8A{#ZFCdINLlGlEbk|$+eF#lO|iF_t8KAFPj4dH z+|$RwDYspXiFR`dQIOKIuZbXe;~j0?jh!YyU!rq)yrs_wE&W}+dAUdAl0*m9M^qAS zCYky?%e@@~vCeo>-rUg=;|jp#cynWSb59Fr1Eeb!k2ki(ntBG3tS{Ex65}KhhF&!@ zLRVvNOJkyu1gZYM{^kUyW%7~?-__F}_as48-GkUDyVN8UlIo0%y-{TH9TF@`U-0DC zE$Nqb+;?q%L;B_Y5AI6elK#i^7wJE8Q^&TZ_6LtSs%`TH9jOC39Ubkd8|%|jQeU74 zDS^~m&q=RO-Fh9#uZX-cJ+b~iI_^KIjNUj41h`^qib54dmBryGpTiNUtg5nldeO78 zx;#`HEvqOF*XNbj6gtr;y@A)(Eg{^ys>{}u))rQWiq?l~ooGM3iWh6iccQHwow4p7 zx&_J+?dng&2BL8%-rln%LK@(7_B6JX&?|frU3s{sCbTYGSXmz}s*F@tM+@s}Ybz_F zg_YIC;c9=18!97p<>9(2q3dFaFxR3#NTjH?I^r~iyBnK2W5p$rp0>7*?lw}!#zeFw z*45L}PfyijExAr_dt*EnjdizE>&Ga!tfyPIB$(Z&l#gV{fXZG zM3f#?(!WH^pKz$IxU8}yR8vcpw=q;*?7zCcDq2Hvg-u4vN!>z45@I7&a^=QoX<2b` zxWa!=UB&u}%8d$AM3HcbRD0NoQkC{4_*IMEV$wmUr==y@+}p?R4VeBCiEWN`O03>? z4OOozTtx?!I@Z0pqmN!K@To&tMQymcB2-&eSrLk?cG?;{OaNUiEAt($wY)V{ZN^;q z^vix zBXo|!b=CREr|3u|)KFPh8_mn*|MH#2&22RuZ4POEqQ5WZ*uIc(n(E@Qz7n@i+&q_u zi_1ba;Yhfs*4fh0-O{tg>Fw=en@lPmjkb2_nhI4{hZ;&qHGOSYRZXo|Q&b&>HtBY! zHlv=|N6pq6ZEiQka`Ql%Xw`PMhO|?@s z`l_8Yskkr_Dz6Gx*Mz7{zKi8#W1Ys1zUIEhR+>QYwG;ZOge%&6x?(H3Y2=Idw=}M3 z>qxAK_ja^+QcUVv{aQMl*1p&#%2(pd?#3=QTB4@Dv`X?Mes8mrriNCpUTrS8jZw1F zpUD!V%*pGk)pez4C5Nl)s(+Ro;lEBbM3qw%uBa96%^=&OJjx-rNGVM;*kC7z51x{s zgQJ;B>LL-3io02ku)X2h@J3Fh=comHJ8DH`Mc8Skc@2#QDyN0TWf2-^FwU4E!1M*q zsXuU0WqB28TeU;8nZ~|0|3x!ixxK1d<`7n+yqOu?JVl{MQC%cdTUl*qcS99y&1#xA z_3~I+8tZ6lPf*xItgn$e%jQ^=rb#?8@=ooXmd33#kW)a)F8xo{>{{@~UNeaJ)QPIO zG7^bY7Ogim=$RdasAgppY3}Ta$K3JUZ4GYlNL`KGS0wek(U`SplqXEW(V#W!%c`Qa zp_=uDp=y5(QuUUH{D?YcbGsdq+|(*bxg?yo?Wwgw(rYZN}b-SK6+6rsX|5>IQBtNm4@p>#o?l|@=(N~*+wkX+|!Slj+@t_P*sgoX@55l z)3KHy6$rgvw8D+Qp2n??ST~G@8$lIKGs5neV&+!~?-V886gSqitE02CBhe+p8ygGi zNUb#eV(VJ7HJ*rd)zTE3hqvC&#_m{U)9L;KRn(PpMvEe0-7sYO2OD^*%2KYcWKG#o zQF=FKCuDPFI#yf~t)(?jw5X@AkL){jL(=7{9#Y|Wv@b@J7*b*r6>FVmI%X`5w_nzC zzl=uDAO-UzZmLl_I#1u)V~sRfq7F|Z3bzSs{+d-(BhhGE9<3Vas`ND)_Y<9Jb{7d% ztWyS*QNF*r7%8*LNLf}!%D6I8_LY$`v5b_JWpsooKu=#sTQpAJ$v8A2q$zl^>M)A% z+YAC_2!lbRPV7+2lhuF%dU`ljD$f#qormT)en4$bBj1K_buG=fBHV#_DrH95-h_$N zRa^?}4e5)SBSOdV@j;!lik1tmO?9I#s;jOJR}?kW)D_lMl&MTs*OZo()H*G(rha3h zjq*S{^Ub7fP`N6LYN;3dGDDdxuZz@{RYi;yfdMP4ph1A4gQxMqw zWNF!!$^s~AbkuiGO+!s}_ymc^rczl~6Q;>!k&dW36sdKvK=+J$)P>1rw9+DzI)Gjd zl!q(oBy#WAU=|t?S==V=fn5Q*884x5gYKn{u~N?fOY&5owo`MIh&o}oY+Z$8=H9-6 zx+T_09Wa_mn5CMVHYr>9gt}0qCRDR3H&^;qypaa>CR(}rD_wNSX>7sV5lMz<;O3>} zy3*n*Gcoc;U07BTs&2plLnj)20Kq1@DMeU2FQKw?XL@Ez`=$ z+s$gqm!zn9`JnZI;EHg)vK!O_$+54NF4xg=v8aeTEscJ(zBFriH$k=z;qvM*8Nvt| zWxME;Ng3^4MR_XA+|DN48_5L7kl5QErM*DfLK%<+d|P9ezm}^))GY*|i8s_m)`u#R zD^W?NpH;U<*pk53J0YB*Cv*((3NO5N4)rG_pwZ1Irg4!{2P@h76@WvafFsZ|!O z#2?i|Rw$skD59 z|K5#$v0g-PKOy6_n$``zT0e16C|>EfQ)hL1y?epUB2Nctj#z}bpJx)mFG@O1X2YYo zJw{Vdwkt8&pNlrOnH>esjD%OK{>)LY68lyaq5;ni>-5b}?Ieqf>#JMJzN{o<^uub+ z;o+6GnWDUHc4kkvGUs$lE*X4lKWGD_g~l|xm$oyD*@nbv;YwL=H;X=<9NkL$e%*E} z(03V=3NA}>J}kSLve_$|*%C(@r%#1w z#=5zK_WMJg%?@v|+4`8RaZ+{e=~mNSOGm{jatCV~s4-_TW3F$9$9qeOxrMZoauSti z4?;}g2F={dL&k2yc-7UGMapU$c+-YEqf8Z=8fAheev^$T?>9)f&FV|0iHS3#E%5~R zZK2Pm%q}C`&yr%9KMB=ofLa(l(&fnj~DhC20uD-Ggm_oh>H6A z;mE`&Qf%MaQ`fR=p-S$mN$BVBXyEg-#ot&+5 zBZ`;Yxuvy!&3fKtXQeGN3oxVCyc!s^=kGRSxSpRONSl+br)PW)sW(4j^5>790I9hx z5o!-oE2s_aj?yz^dM3D;DxkH$v(t>J5{<4|(mF}eXN7&^Pjau&HC7(myH=iR$eurz zu43A0omAE`K=zLxEt6*P@<0|&vK=V3!5ewr=O1;XVididBMYTR^{Xdmv<%lyJN?+#ptO_M>C0yea-F1&|4bI z*Q^RIZwoH3%nvSarFv^VV|j01Pl7fTd-|5g6ZC+S9w@+|4_-W%c8kyvTQf$1&d4r3W&!3&58KjSW0kpmMj<0|N=*?H2q+ls~0m276UdN>-JW zh$<=(RaPQq6mm6;h+4xCQEN~ls%43&rX@mcOVx-;Z%4PXbQECldZf^;@Z{iSU#6fN z)Vh?28A@OUYf9~NR<}4|@>S6TeR`s|#b2%F2}EaOQ>@do-^J}^`l8v#t!Inv*>CZ5 zX!@oWz24XUJOWdCw6&6FPAkocr{@G$d#nRLgmpJ>yh=d&!7mC#qV(;XKi4ILo3yxW zLm52>9a7WmJ0HmnON_R(M(U+0Cg0>=BMS27g(j>#UB}9(zn5O?p}|3nDDSG6*%HU& zp8?m>vW4a#zN+CSr_EwByfk*w;{bXa%<1m$s^W(vCO2-&QD7RFleb%O>u{9JB>7w<<0cIO$%=nHFn7u$EKT?fu`7=p_(VG{@h~|eVB#PdOX~e z4fJ?#jHVxED`v=v0LAW`h?E03NOx$hIzxYh2N4AFB)o(xf2cp&CX zeuygYL()!uMU9@9$tId^FMf4M?G4DdSRLj*=g6!FuYky!+dS`5O-ako>Tn6|kE^{Q zc^c?G*zz{8`wEoNYo(9&xwCtR(UK^?;vnPv=2#!UPQRGV3ngu=TV-teJTzECV_X z_5HnA;@Q!bpE|i!%&%IRX7;XXZj{lfme=l* zszmxK>6is^O^jA*ZIp%18h$?M%N`}iLy_6sGcSvovBRq#vZa^D4{Ln)mWCs=fM{%^ zjRLmN$sKpuF*D8Xi-tbzme+ptLo0ejR_TwL%<2Zy3ea(S!JuMY#Eh}j>HMM1Ab=6h z^K{B6I~y*Vvi5OSJ9%rzyk9CNptpoxm*hPk@91scFr@xB=;Z<5%Xw-l<-4XvVBfWs z{_Oj%t&(e=)*jqheBsrk%XdvpzkJu!M9g>X2=}3o(;LEzQ~oSdjfd-t=#8sEm|r?c zK7sT$KaZ8N6|t$mgZ6^VvUTuNr;QsoI=+=2UaK5D)uZ>!us>(@-8J>Rl}W?2``VXe z(`Q2^C(+Fbeo=MEj$18nI1cU%Tnw5g(0pVAZ7kB=n3mY7PY0$xW{-G_7(zlg z2s1;6*^;1TQ!{BN%?iu{hqjOSk8CDl@h!CJqUst`iQ39_>u3q$9iH7G#(zh0PU5U9 zDmpT_sIH0hyWcGDmgn`0l=scNwK=(~a`F}%&TmE2k!em&;LK_#Fpv?LIc`+?4tj5# zzIT&>PU6yqZM_SiXP$6XJ@`+yhtO>$AF$ICg#EQK;O>L zF2ZMCxV~068r_p(+bTO>An!{7L(a|I zZ!+=`MIHM;kbSIE8(yB4}jBQ>;&6z`YzGK7m%M1=2`U5hPR&*^LID&U8EDI ze|*@_J1y@t*f|bo%iAH_FW5MK`dZ$N|8y1JrrQI~;proBH~eN5-llt&;x=7tUu=Fj zK0dB8Cn+!6LYwY2;5Pg?$TujSfP9 z+?)SQa2@|lPk4@J9!E;Y9K~(?i#*($|CPhU&-RQDTR+Q;=oBb!<6r0D-uSDBiNC=U zp7U?}PgHRmf2ZO{BR}6zJOchL#f!l&QoI2Ca>c8_uTs1e{Ce;-l7sZm>ch>R@I1?~ z{BBS9IUfF?htKu!eI6e4@W;WqU3l(emVyZ2F1e?NHem=%|E;}EbEo4FD#p0UqwCr$?91rJo zUz}jTQHtlXQKX~LoZNITz*pKl-{iyQ=N1ffRW2!wRYR`AmZowDIb>qf(IWuPE`D1l&ekg)jXM^Bcb@NxrSRiY~#Nl z`f!;F-(Z3}KT`bri_C@HivJ#eNW|Jz8~+^S^I;YK+tAOa6@LWsD~ivS&#N8h9mPLD zdwr_-NR&4fdSUZ(D-VWrSi5KWc!bYZ;mzOGq(2Fv_)LU9T=D17j>U@GeqOEk2e1zf zim%{FB^@!vJF!IHr1%Q7``L=$GS|d&zv3CF&xaJJzda(ylZwy9fb=KDvykp5ihqs% zYqwTxJ^umW$0B{p7lBVzymPV1PoCm`hn+uG@jB>dk>XXzUxngL7(h-`{7mpx#m_=M zw<^911K0VAH=67_I~3oC@#q@G$D+UQR{Su8zf18v*s;BeKgShI#}kT|!T!9ccn9q8 zTZ(T)|NUI???X>Uz|PrrTpW~Sof(Qh2Kz8y@&Cg3vQqIeNVh<7n{GsLn{K1x<1mje^opc?f#+SBM?st z?1WAC1mttP;tQdNS&H9{@#QeZ?PNJu@h{N6hbul8`gXM9KZe~aRovEFt>O!pnf5wO z@dL=`fZ~&3KhIbE64-$qiocEgU!%Cq&u+yZ!#MSr;&(!?UQoOm`Tt1q0LHI>D}Dgn z{4Q8>o;Di&dLr7>w(kXK_XUdo59TfTioXK=X;Qp>sj25~#h-`Xo~ih>g(m!kiocF| z(iMs?hCW=U_z2Y7&lE2~J^xbi3+9`2A6EQ&wC_`je~NfsQv50C;olU$7x8?g_+Kzz z`daa|3r&8;z+T#RITn1X;^q%o(w`ku{37HtNAV+Je~wiA52)u7#p&nopRV{a=)-2k3otI5-ziJ#XE!z=ZdT!~e*RAJ^UzQKp!o01gCFM&#h0U>{zLIw zmYDK>uDI2Q5xCE`%LcT|B*m?sn?J^C*6()A;S^3);V(h|I$iO9q5p1H{C4R7xr*EM z$z_V)iT-}I;zvRcf2#OS%oFZX{6&O+Nbwxh!&8cHUu^30WyK#`WcUHa=VAWviQ=-r zq+2qekGB3lM7pyT??<}J6u%7maHQhvQU9fiFNHnap!hk^&pyR}iE(tB;y0mOmnl9D z>+x$8-;MJBOz|-C`Jv+Hpg(@Ccm#I9&MWycCz*==I0N?E@?A?zyDU=t66ntw#g9gQ ziWLvQo>VKo0`tGq6z@lUo~8Ic#DB5k3()R675@bFd6(jAp$`u${sHRi8O0BxKL4!v zb7+_M6kmw?`9kqr)I&P*W$XD0X}bLjaJ#jk{&T&wsdGA!GEB*`HfzBzM%MY)Z2}U=OUh46mLMe?oj+y*wwogUkle~wUm))JHN;}qY8aU`sG4(7M(6+adAe1hV)&o%LHRQzJ} z(^C}x4D*alihqdp{}#oI(OzdOz7q3<^AtY??RAmjXJdT4T=C^7*HwydT58JmBgMbO zxcg(p*I}M~x8k>9oV`!+>rl`86i2l=Pb&UT*r^v3e;hZwruau#R~}G&IrRIVif5u+ zUnqV8?0G8evDN=Sp}oc_ZlAj!qWC$e=h=$qW4*di@lhBTauq)d=^ml@V%V8N#UF${ zU$6MfuqU;Ozl-NSrzn0W^ruzvR@8Hk;`TYpfZ`9KzkEya#c0Qi6`zc9eNXXgk^gHH z&p7`q!@%e+zbFui}L$@9z}PfSy0AxP8v?vf{U*f4!ynbc`eaP`niL z`A-%9EBetv#s303laA--R&R5Ire9A|{9)+*48V;nz2@ue7FHYxrA=C4~6&w>3pTk%5l>+=*ZLOd5M z{vGtk?<#&J;@_$G85r-bSKR&#%FT-Z3HI&hivJbuc$ea1(2wp@{9M?jeTv@zyY!^u zzeIUoQ2Z72m)8`(ANu;0;@?MmrN9nZy}bnC(iOiNoPNSW4jcX!@Jz+;0iU7xqu@cs zZFv?b{#S%wrufI;`HH7PUaRJeitm7&Q2ctxXDWU>CY6OhIZeh_yX`>D$YNq$;bVQ7lS{nxV4Y_6>mcLrxdq#?RmxDMY{4T6( zURV5F*ww!&Zr920DSj>HQ6DM36XVNgil2aS;cLaiL8%@m4eew5bsxs-F^aD-!5usP z+wg@LPp7KzhhkngOYyhB=PJGp^N>Y~Pr-PUqqu!8vP$v4W86Gaaq|<7j#Hp`57td3 zia!p!9Z|d*<8QU%A0vFd;%OLXPgOhyaxJp8-2?wc@v+U+hx+dFap0ivI%Z$J-Ro$9R3G;;9IKkK$)y zf8zngZ%04cr?}l0cuet+(NCXIJRR}BptzlXzoPhb?l^S3sdy9g>VV=)Fz&yvcm(sA zj}@;&{ePi&C+5!%`iJemX9OiX&Pc`21|O&R<=~SQ|1o%$;=cf&t@tD0^A!Ih_!7n6 z0nb(ZOYk*{H-I0l`1eqsg^Jtfly)6p>*pER?FtqCO|*Nh;&rI!6BR!n{pd8suL5sX zycqM$PQ~lM`xO5g@eC+F5%&L^iU+~ZS9}xr#fqN`zC-cvfq!3d{zX7Ou2KAM@Ea6= z67{)T@p~4Tcy3qxHR%6civJPg;Ju2!jCA)ZUWjq$zZDN)+<8LrwOCg^tN53&KQAi2 z2jk116`zTAd`t1q5&yf2?>5!oe5iOm_6s6PeBhUg+kSh$;?{mW ztoRL(_bdJ+_Pw7{d^+sy^NR07d0$feEZDKv6~7MS^xqV}73=i(6kmh(viq-NsMQ{hiR|NmO?S(wkH!T#BJa=^zZz6|>k{F9n|*zn~DKUMK4_$ zd=u(FNAVWSdsivG5aaKWihllJ@+o~f@>6}Rux zv?$&bFyT*Ed?MB#48ihqo8{7%I`!gzX*;+e1~4=8>C+H0TUrK3&#Kc@KO20PCv zUI+OF#ea={{fgp`LT}$xybyYLK=C(_&-WF-)z1GF-v~YbLh&f{Ie_-G{Wk^moUV8p z;-9E^73}a-#eai!T(;tW$2c-i@$*wng)UWm0>&5lJyi-~^H~giK0<~69_Bv@Tj!b!pDX?^j9&*8zX*H^&Ne?Q z(7&cD{xSOJp^ATsbQdVzi+0HyhObflXQ+qJFuX+Z*D(H`p!heSw;L3{3VPlI&dmf> zlZvzN2ibb4LA#&r36HKN;V)G2M-l!CPxvLKNyPn;3V%KF`BP7L3^@{hj|y+w&%SSE z^LZ`ol6~LG@=IXfo>%d-A^hu#Z^69lJ;m!`XFgN>O2nUL_g^X3Z2HeaAu<#{6_q_p z@jg3`Qv7$&pH+%~iFzwg{0_|DB8s1c{M0M{8;ln%ipQn)Y2Q-uU!Z=@Qv6id!|jT{ zh<u@FeCZLzufqK5S;c2#oO(_1^HE;=o~dn@k?1d-YzJR_@bZz}#FM@Yv9ihl+EmE!4$e>B>SgE7hk zpQ?Be{4mAmgWJFNVB@hrR(~wQ+xDF{mUHPi#VQ^{9p@w!eip*VJRD04x#e^ZXFER! z_B`R?96pK!&IY&nyb<-YQ-!|+;qBjDu;G7=@OP_t_Jcp`;plP_)2klNRR%Nfe4;qI ziIakT5u5H3+0W zvnjEC^>Gj9@L8z0*FD@D|GOT};SWdngC6dUe>B#$wthAs{A>^RhF|329RGC)zglst zCxwdt7U3HdxBAcqZuNgF*4JAUza4hze8tyeT-!bjzg+Pi=#zb(VAHkyY8Cz)P}1v$ z;XhIQOXTyGVfY@!7eJx!8iwDe_z$rjd~g_U|K5o$*AC1N9#i2he^zn(-QWwu@INaa z!6f3%VfZ_Wzle2;{SMpa({j7-VtF$<#%C%X%bg%8B^@^WSw?iyg2toySjBI|`pT}` zYV=0PJC+@{gGNaC;H5}-TL_N^5yVP+&ek^<04K@Q#|hE^!2d7!SizH4;^~N zwIuRA@ZN#w_utSF(&y6(rZ+~(( z=dN2|1K_;lWaF{l?enyc(}7u&zg@^77J$RNFp{I&+o%@Ond9&tJnVCv|F`$&(Y+jJ zKK=6^HvJ>Lko-1%doBRe_wPpj%hdh0{PzA@Pn_PM|HS>vgI=0U-_lC*3|0TTn@otk zrRL1_&;8A&5A)!hM$G1gyzVjkFyp;JwSx}J^9{}T&b{-^{V$u7>*}!GbY-agx8G`R zvH9fuv(3=?KaZG>lkfZyD;6EO=H$9M>^JGkQ0Z?&`u2WKpXZr6{T~q1aT0PKNBU_> zF?HB0DC|(_?-`=}Ja^RT-$;z(wD}~j98Y7P;T+71Ew}00^X+tDsQW86m^;+%ZdvX9 zzry`CetSL>_gmSX?R{2$f;`NWnmOBWf0Yf0vn{{HkCJDo`rAK5`|&G$_I|5ZL#54e zKZEq!IdVFt(m&q%*7x%oLp3oG$60%loScoSz)GaQ2|V=upCSJ*m}p#A-~WFAh;fGy 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 zcmb__34B!5_5Yhp5{4usECIq27$87E5|R)$0m&qpEHYWl0s+xsl1!43$>Pj}%>@*t zP(($o#cBmx7pm6cQj0rUwV>8os}@@qT&ifTwN`Pd%I}E<1}g*hwhD~izr!Sj5o#^uH~*qS3~2DZ|n0< zR&4z!uVQB=K5ebo89y}}5*0g2v$FFK9Y-+#WaW-0DOI{N0fCC0L+G|^3Ep;mn190c zz{!&*i%7n?GB()dZS+Nu9*jh11 z)i~|aSM4CM^~t<5&vLDHo#i_Fw@~iRtM@}Tcm9#moomOJ?hHGBSDKaT1nB9~tl`gtM)5hbLPY4+in0BGR;-Oxu2}-0>Pj{9>^N3&N=aVDuJhtot*qGk<%G1$1JD}wIM=~7Yu21Zha+L-Y9Ac? z_T)*h#7XF7DD-Pr+K(SE-{sj+{rBxL|AFW49$W#HdC(06#NJ6Od*XxB!E4*nCYBn; z*0;gPzXWS&lTPNUK9Go+$e@_YKlCY>^r=tTq@PAj`aut7j{0lq&ShEHGb30HX?Otb z_b3t`S;{*Dj})G!Xapb`c+0$!UjjaSlS!-%Jp1N+`cp|pwIubvVT z=OD%&pAhJZsBHG5W$-A@F$e|XY!14`DK4Ht^d}`9KeY%ufb%3Bhm3kxDR?7NSuv|BVaJ_#?ge&&w}|2``1V~QHVE{{tt>f zRQelC4^`=JF`c2(-(lLR(kC&UoeacCFl@-=DaJ<30>#7;Q>2)9Vk#7qKuoP-5{YS2 zjKg*d)NqYrl5BSX)1jCY8&JZ;NyrFS!crUJDqUnsyC|LLI0`}zsGKnf$uP{5_yeqiN^XxO zcSMte#$v@%5+Or5{2OjK7VEr&#vx+%V#lBdK$sdmba36}@RS-oxB-)#Zp5?$8WVs! zIsD+|n510UgV&`1rgCk-k~zH*2TZ)eHzBUfHu!wRQxv|1OsLY^B7mox(xX)R2iHJR z8O8|5;2UzH1>J~BxS+jMkdf{fe4PgbM&gsf*T<6kuzq?L05!KnqH1n4so5V@^Rug? zYHp6H`9(ddp*H6Y{_$~OMqz!7QK*jFb_c?0qz=9l(`uv+{w3;ms`lK4X^2GN8vHAi z$u?3D`Vx}lHa2DBq;cq%>DfsoIWXx^tCHM%!4@i67DLN-qcZZcB_K*lrn8a?J0R(K zNy|b}B~{VpB~{1JniZg0DY;lHnaxUSD*#EsN#&>dkxhAE@?MO2$QhIOVP~r3O;{t9 zyfr3pS4`knC;$xxwHbkEa?E+rr?N;%+6OcnP)9n37G4AjsWXPoLrG4Pf_NxtH9Q`KG9*8ASmqHeKWyUJXfet= z%-H}*5pSt4Y>3tFg-M*xwp+o|Ls~3 zPlq;+hdX)C`H&b>1`<#vwfA89?|u)frc!_SbLeVLA3<0R?(}C)Km*jkO@9{kk5}@~ zVcMzEzsIz4`t;{9ovrXcpbhg>`UOlcQ0YG!ptDG&U&M5UO8*J{rdFk2LOo3?{W7Lk ztMn@*D-y*O22{WEh_yc)?vF!AH(#O89`sf zNPjB_WcFkPySq5OPszNEdH1XIJFkPS4k!y_lDahw?2hIpGZ&@5R|*Lw{yru-eH_yc zg@1r~)!dT)A(~3fE$M&9>Nu6mN7zN#8J*#FBmEzzL*7|X%sY^ed}g`3{*cnK_9~G~#G;oNm}I1I`gQ0sY)YV>yE# z#o3lXE+=z#8|uhrE}kUwm>Wb~A#)Dm7BDxMxW#c3TK((5uWcourHG#;)3XZZQ~=~* zF3na6lC{hYwc%*2wW~@GqkK*F38C(=kv^Qb)xZUS8$sL}`-EnEmQGwNaQJK_aUHB> z6mdc3MpKm5!(0YE+rZoydbWkRvGi;^b5448C3BPL*&gO56L$l1Q;6FK_4KVb(zA%W znV(H1Za;I=h`W=y>BJqdPw4W)7|AB?K7KZXxP#2iB<^A6P9g3PbF+whlDQn>4l|ca z+;hy$Chi61@`!thxqRY|GFL#{Ys}3d?ih20WS8U2&826bFgK65&zPG}+?UKPAnqIH z77}N~tA0O~xOnCk5$9lTF>xu(Eg^0wbEgrP&fHSsGMFnOZai}(Hk^W-%#{+C&77Mg z^O&o!;S92Xxk?)jsv_o2x8aOZ!CV#Pt7Wd*hJ(K;enJn<88tSXleX})Iva*A+nK8; z?lR^Yh`W-xM&hnvZaHy#m|H>I4a_wWw~x7%#NEu?SvHKA_A}?DX9t*DL)?AL`G`Bn zTr+VGGuJ}gA?8|%dy+Xnafg{}Bknoo+KGFCxenr9VlF`3QRdDe?ltB*sn*As>!xSN znd>3$Bj(N}?i1$1#C^tGggBU#Q*d6xf6=h>ZN{n~+;2e~pTqgW|EPM-{#eY9?WRMQxOhBWfoaPc(sO zBGExa9YhBcO(L2c)#{Fe2#7F?*68!9vVNaaj{j0>RL5Bt{!coh`2tV;Px+`$++t%g z+9`h2blW$eV@k*vHN&}O1AH%85*q-{#GG3pdb#!c}Vqh?XkZe(H3Q8_j&oVsE3 zsu2+KVrJ-62PC;iGG^H!7Bt!Jf3QF0N+CLgXe!Y(qC<%eBRZVu2%_mkM-m-HbTrWn zqGO1TB|47ic%qp^ClH-T)Jb#_(aA)o5QXzvxTX@FMszySY@#!W&LnyY(OE=uh~^TV zO*D^aKG6cAbBGoaolA5c(fLFd5M4<0RHBQBE+)E!=xIck5-lR?B3eweglH*IH_PN8;CX%T~2fb(I%oRiLN4gCehVI&mwv@ zQ7_RoM14e?iM9}JCF&>IMzo!12hjl0bBL}b8YJ3Dw2Npr(H^4b5)Baz6O9nZsheHh;?*rd-4fMpkh(e4ZLqo}savwT zrKsBwbxT#ZG<6%QZo|}VxVnu{w{&$IscxgxZM3>&sM{EI8>?>P)NQ=FWvbf*bu;4h zBtNENu62^PQN!bi+KI*!O;C%)*iA(sPm2XD9%HxETKI9x*Jyqk+HSmU6Y#N6Akl$Q zrFs-+eWXBpe_%Xr=VD4AxPXmvX5yC_yp7CsWWc(mwv?HJ5msBu%%txit@gH=De+_U z-Zpaxrk%9C%uK~}wn`7hwAzAZ4#TuMHpm=-6(~|N>6k86>5-VOQ0Y;a_Neq|OxLP( z2BsTSdK{+J(L&~UOsk`X%*;xNvD9`q(}{SilAna>4wasa>7Yta!E}#GXJJ|$Ib=@7 zv^sLgoQ{^>qGYl$y&cwf?CnH{n`k3Y>cq?$k3o{`pLt3Wv^r*Lz#%M7%bY!BthR4n z?6@W~KXzP`Sr9v}$()1YY~Mnx6Sr+Hrnzl&EXHl4V=->q0^Bk5&@o6ReHgrfjzLtK z+p~BM=-*DK0GUfLT@kOC(~xmE6tlDhn8V46DZ;pOdzxZgbkxF3F;;31Go|&AXJ49; zf)+z%6!i{LJnAEUy^(^oL|Nt&9W%jj%7*2L$80zvJG1gJKvY+pj*2D5H*KGHY<7<>XRoyDX)oV4e?kg*H>Q;*{tF+e;Qvs^vsGhK{jXDloo3 zFrhy%u|IH7f1sm3aBzQMQh#7_e_%>~;1DY~Hso(LCZ<}!>0l+p23r?(=@0sBH()H1 z9qI0YhiFN>X7~)715Hj$SND3uHW<4dubD_}Nm}$2Vw3*}HshO3)lt9}>`IPz7X0SOheK;ky8r%_76O-^z)*080D5V){0v_QU_Nh~33l#Jp%rAT@AH z7O){~^Xp)v{yj$SYq5LDVsoSAK*~~1-=-Aa|G$=T@V}H{ahPaZ@+Ua|$F|({U&^7^ zT+mb)7M>2;!Dr&a@o4BgFhJZo0Gbkp9XoW%dMwVdsy~?n zO2)pMOcCeU*PqbKTIdmMN1WqD7K(NnRvW8K?q^R*wXuK^tI)?FlBUFLc~*E@U-&D4 zRw_6)N-XABnUDhSR}>lZ48G#=fPzkka5AFB2+o&q!oXRA_yon{aOTBoK4y+vf^(rA zHwO#6-Z1db0T0P8NG^ipLih*CWSAgNH5NH;OvD$aT8+gB1M z}enZ z!4%$*A2i>+z?ddjJKVZ zj8@c@n3N4o9S_A%j+!w6?K8!s2%cuKl|V0?>rft0Kh10wR6jk}wsef@xaniChl?_P zTs#K#WhX=%6$iaOBi2S_XT}sEdrFLj&%cswjiXUTPBOU9a9H7TV~?@W*)d(Po@Cnc zN1#|!@=EfD`~)L^1S&1SCv~7pKbf=RVjF182i1i?yx3;MW$Z2nb#pb0WzGY}P%`t) zZL1vNOfIB`fthu0!GHlK>b9qXGGoy^&}$fra}9Kyu2l873%q@a6*7#|VnB4jfX8y$ zW;E*L8&PQa-#8f!u8ifTyp)8d)Ac&vZAN|HT=o1gddugOo^@?Ttxg`}M>b=1Uq!2< z8aSa9tzkaS$lEJrwlZ)l-|a^D1w-qeZ&N6Nf8|&$fp$~)&JRe+Ya0Vv9n@Va14yf~ zu_}Oc(xm+psoeOSk$kR~%{WUZ!w`t#HQKnq_@eNOoX>I``aQXEz#DsCV1Z#==754q zPmF%WNnMi7I9n%g<9duXF4TqUm-Hr3q08B3u|fwBj1{L+m8@AS7-2Y^d#|=#ZKE5f zwbr}2N&N~*&0*Hu#rCkHW^Ei@9DxJnY%u41kD2eyd7)?xxK8?BS$hIynRkesV0@Vm zAerkv&h<3k6OB)$2=P)b&Y0I{fJhm;vAejBkS^#uE-(p32VehHHqMwcpv)gwU%Ua) z{9es{%P7oCI;jg*g1T&d*L}T*JL~(ZCuRGqo|e&r4ocm>d9UVlDKI*91@wIkn?-xe z_f41uH>qGkw=j_2l_|)swRQRZq*@6sz9B&3iTXhgkJ=QWp%>13_Iaeb-O*@ch2& zN!k9Yr)55fRqw9Ndo`z*3Fup$)CEKJKu}jp-|=KZc|V_Y@B_ViYdL-2%83JfKhF2N zd9KxR`u+@$$@lsG8Q=B5)N=Zs$;~>I@AzgZUTgTSxEQ^Gar)K)z)v%OYykNX;Bm&K z&}5tKKdJC_4Y(j1{IkvO4Tok2x>|z0t^U~?7R>X`E6fQ7x_UR{w0HH+ZVp7k28jd% z&9mEETKbC2*SVD(tFkbCGojwuk&Qim);?eb!W)G|eW|Aa&V&QuNNx)nBphiCbQk1y zU}GTN>TiQIG?bJp7^)uVj!IAx>;am+{!oZCQSL~f)9;Od9CT`=BjoqB=7c+ZaG;iB z($%A$m=MecnNTBCr7M!t3#3aG*V_g4Y*kO&{czG2@wRk_P#kL8>5FuzN30?N$^~W3 z075bxXz%g`l|U#G%n7%K6w}(<*^{5QFb_Dmz#d*IxCQt`#rFg@_=DjXzb??~M+5NV zaEq_2rMnfY!APe+9QL*Qo4Yr}u#ms2)sIE8OeBJq1*X&2)9Q=(fFbjTdRrn`7F<2P zP;ZbQbar=juk{7ggT>9gfnX#j(8W8@!MyaqDet~n%fg?XHN&+kE-O8->VPBvv}H4^ zkJ!I59J%(dFO00RZ?j!&zj||Amd(Dd?bNMD>`52f*DY>8@lWiO?`>0x}>Jm?Zvy>V|cwj_`XM%(G%)!4}sOG|Dr;5mE{!;#dWTd zW$p&U+uPL}_O})o-nKx{-_;Fy+55bmy%GNgI4B5rbg%b-i;bey_i)102Z@^+K0l;8oSAt!#388dlc2y|vhm()@V_yt?M? z?v3>HM!fL$8~ls-tp&RpODk*2T=flQHFYaob*0v)%WA##pv$c)QU#vtDzQp5Rxhir zSy62TA)CitM&@)IUNBWCg750~l!Egb-L0+OmYxv4c-m7RfHu--^Z3{KgU}v-*SbIm z-b1zYU}bfKyRO>RP+3#$^2{~beE}sP8$74LKzroR1B0kJ#j2;Sys;AcH0Wzry&ub8 zSzYRG$_I08kfx+3g``J_FA&Pz4UKix#zucI2xs?RZ+BZ8_e<2tT(z~H$`WdaQ4d|) zE1VGQR$k|JL1PVXWsSG2(&P5_1VPFh>~2|0O#+YT>?sbeRTZLc_PAEoG&Xqi^YFg{ z!?&&-%?fTB=?(b}?YI%6xiRbyl|>sLtyPt~w9-}Y_P9$LjP-%8R;YbXPbbdM-63d4 zTcTpd%9L@%DfdDmTV~(9+%2>CU;3=gWFn4ZOsbqsP&;h1P5iS(H(5{fcHZ0ukZ4QNIvE@%5LDK7P~>Gmlk_m zRkiNAdKXmO@~{dfFvAxJwS;_a5D$30G@S>!yl`0A)e{0|Z}YZvtTkqLba(n^cfrCI z?rrtWZVyCehkF98ss_=X1~)OPh?YMjBWo;%ixp=J2-p0zs=1 z4-S27rkWag%v9G@yNwnIIACtI$}cM}t@OZ5%@eiCrCirlS6*xtE~%-i1^1{kAk6TE z+N}@OgdZIQb+ovHZ?u9R)<>WV+l$Nl)@<(FxuP3NT%M9fkE@}k&d^_By{8f)@-|%mEj~Zy;J8@^3U+eH)3vTEqWf!06=Z>rr#H#V=rN z*LXahnv!MK24eqs8tWlH1}D~MV3{hH6{v7(KNic)2~+tEzvXdt4^#_R(75ZgQ2nODd~e9s^cZzpJIY7rtw0X={nAww_wr z+lA|sztstKR-?)63Q$y&(Gm>!yI^oy6x70!>W)snDr$(Bm*a4ASj|bDfnYEY>7*GS z2P3$0Td*5e$8e;6V>sgPY=FoVXZ)T(7m%Q@%U{!cj>Ru$-JuZ7o-k&>0c*R#<-*>OA69g5 zI;BcPB5H(}bO&KYk=@mV!^!Ji3oB2bXEZ)BhUxJ8AclZ(3Ntr$7JBNuLK^k$`8e=l za<|yuVZY)D!6|Y?icG2^H~3 zu;6_LUM+;T(J3rikCMi^I(K!+%KFCQ#_GxjYY)`bS5%fY7_I*1UNs|H{Hs8PE7mMf zotlyc7?zgG09w`PX{fCAth7ELcXyS$Dn-CiOu>9L1m!S$`!@uHYk)qOY$|KiAZgHX zQnil#`bP6G;gr|aG|I)90+QM~_i{BlD9nJ>wbvhp*`N)hEe{OiK5eOlIn0XEj0Wa` zU|BhYB~Sgz`a1U+)*N*%PlLgGN7D)begy-uEzJ8th^;rl#@d>-%3a+E<;2F3-abUT zwG3ijoE9+Nx8^O&7vlhz>JNgydLt3B{DRHhXEeGz^{)EDygYK(un$(KX4uVG zi=e(Ue62Ee0S(2K)vmggJm12tJM1s<1%t}^?cLq27)pvA4~;J`j19Dk#jG$XR@79v zaSAJjxB{&xGgHiH$pk?ztiLc3g(Ee+5$IwOHmKba#3nx2J(?%*x(4CZ9B^B-lS5VY z2{Z|=b~lLuhU3CrRp*8&0C%@K(5LQz^9wJ=MTqM)GTOf|Drh?I>F~m75bSX`&?crtj4q!A|eT~jTH-~ zi1f>>s#LfZHD`tOsR}crPfxc#6|s|WiYlwHnAd6yZ*+qi)h{Oos|GRA2oGws3NN>^ zE39mjl@)XGD(h2>I3N}&sW6(=jfAcL7JM8af%3cwZf{aX4{|+TcSqA$p)iLnv*%m z#u>3JXy7c58!j)p^Nv>CDFbf1o=2v9T}I&1&t02p+!b3TKHBy1|!hy%50qH&_h`In}afboF*t zcb5kG#%8dsg`JOz7NF&L`0WpQ)mb-G6HbvR&ZQ-%k8+s*U8S&A!`1+g8?cvAfm&8E zZy3J13USD~02~&&cvFW`==#=@jfh%F`@~6A zt|r_|qSsNrW*@D{lve7zxZk2`s$i9t|Hvk9YdC^VOx5Y5mJd_ag6UQ>wfQJ1zhI79 zP-H){?^xo_Intr@K_#C1QXRtBpFB)k{Vb|<=- z$+f(p?)Az((b=T5vc47$9O_q8Ho%041GpJ{#fvdcpL1xK)!cP(8b?Oz^o7h9^0F$;7%_)#>(rqb%bi#F;2Gi+&J5Mm#1 zFMbf=r)}7r0v_SY&ZfN!IvUSN=t5R!!yN?#A`v*NSPMrHp|x}-0cRpKqNCf&4W=z7 zR0!OsghwAXltx9L!@Q{B-A#BjNWBCT5}d3X;AnXKYpn_#%Zl&?5HKY;0(UeVq`-$j za1y@`+S=9|3@ZOnsx1=^%ti3w03B(&*1DG0+06FVxbp1U_HQnOEq{X?Nz-6gYF*z-}#T zbKtX}2pnW|hjL(Xhrvvv4(G+V=#)J9EHN_V5vlX)Bw60B2?`a z>Udoo-dZN%D%u`KXYxLibXkEk8XTlsG?W!cqZLS_!H>*f3HSj+EZ~3%&7y~njQE_` z@&MNfJZXZZ3$|nUsL!0;fV&m1w*w9vtx9=0l=?)Qpajt3{0}v6Ixgmcoo)X|k zOx+=0mz-YIxoFVW><^lb1<=~&*|`Z%mhk-9gCVJD$7~wm@G}WK4OsdLmrE!g_P6=! zHb>oXhyys+G+p55EPW>nXjEzC@=EwvqhH6-pPa^yT)b)(gqXVr!Y#~X-7@I4y0-^D zU56>2W<=cDs_4T~d+a7Sl2U7dFBl0#;N1(1&1&&jRcSYO5v+@9OChzu132_*fX|Ej zZbJBTA&M~ZMS`$_^D%@ERI_#PDRe7t%6*-*AmMb2+XQNvxs&?thWMy%fY4iiVnN4r z;T}IM^J;6{?*a|lo8Wo$GXQKLoFYd*HLs7_(G*_5CkY%Knm~?1z~Uy58*2r@Rq)jh zSRLtTLfRBRIv1NfTD9ujEAT*y;*OS}-`CaKL%T0^79KX%cfhA_*5L>nm^yb^og0p~ zEv3-s2XyLffx#`JpZ|+7sJh?V&`{>3MHkj|{3soF8*B=F@Dw`=*8xhX{@h;Q`n8tm zsWlLWBm9kYLe||C+(-vqq)H#fbo${#A@PxDy}PPXnI}55R|HxiG^N;vh$RZ~w)BR; ztAf3qYEHK-$aCk-)o<~@M1nH_8pAZG=mRd^^{Qf|wVL1%Ok(Pz9-JhbVQGavqBS(S zkm0#>)QWhrs79MPkf+mri`r87R2n`;Y2(kSg01x!oMRN|^|h$D*wYOSK*Xh@LuJN;XC~Girk0+mDJJOc4u2rCuDBLMXp6%EmzGI(hR&j!pZ8!kpT zY++RN`LNIOdWncTEYE~hEYCzNVtJ;b5>qGj^>mB8h)^ugM66KEY1c<)+KvlBLVhi9hyz3(P!c@OwtB&5sDZtfzIh-ni7%%d?x9<&byr53x*3*2- zhlDZ|rZagpORJ4EY#ds^m{TNBGt*Tg-Sl$r;KE7b`S zAX%L1C{4CsVN30(NbT{bcDPd4fS&KWph$R;^Is?Xld5!^h?;5r|<;}3$Gcw`bk60M(=j@UHT}m6ZYtrlr*C5c4LSYV9u_7 z)uPWcyZS-UesKMrW$Pn*wAUp*$_g-NSHHMvd8RDT*Pg28iG3`sYSPzk>RVQW)USY= zN>IK>Kcitn4Pz2&?f41nJ~0Dk`f_#=S#SO4b+kbiLi{OADqTLa+l z4S;_#0R9EzPPo&>F7q8Q=6=uS#|hAZh-?4U_Y}r;zv}z=0pzm>zzYY!%NciaJ&O3Q zgZx}iNuB{@4wCsu79v@I1PAxe0u`-$%RM#4E|0gStgPPMfbV9( z+o|fvTpd*Em&PnFwuz&z*faGy6Q5zI4^b$rjJ`h$%dPosKKywNwbP3p7E@>#d!LQp z_*AdL>-THveJO~>qX)_={)_PtTt=Un51T{!eJ1>Lj4t>tEM52py%YWwa!2a^M|Lv& z`-Xo0|K!O6NaH1O`bs(AsAmfN)AB`-#tZQ*_@~$Gas=T*9P6Ov_19cc|5OvMzkjOr z6u~pR+SM(pKgj$#6Yj(`DunA%b?YPlBKR9#s2^hvU7t@(_(&7}HRGsunhD20d4d<- zM!`R==M)o;Yl_C_4}jy}P{B*;*<`};d&pYPHH^#p++&i@0(tz07yc4HUMP=ilh%Vj zz>gQ+P__vE;Wd>*8N}g>^HKQ{6Ar(S6UD0-NBw5|1WoeeO!5~GAb+z--rO%wm~iwd zUH|6>(DRW=KGP&0hZTfN)^i-=*j^k9TK{Ado&`Am!z-6@yqWDemvPiH1O90}i%obI z;P?-(D#r0<*3-Z^>cO8=(R$7_;aPy=KfHpBf1^#J0n@o5X;P?-(os8qn ztmi7mQ4hv2TF-SRJPUCAhu40_@n+U@j|s;gywQ4iS)#}key1RMrEn?I*hhGwJpD!+aq#;CeAjv=Oi;jLfjc-f#yAQu zE#HBI6|P!!i{hvAg1SQBCwO8$Tj1y6qzD(rU3h8zgK==cb&k44@#D;|7x?Y0=X`9 zPr*qAt`F5MTA%S;?g@db-=Bo}j^}gTuE%jQgDX|wUvNFg3j9WPv}pqW7b=9SK;UcH z50?sjA(!hBcqZ##De!&lZ*2lsztRa``xE#uw&xasKZlbdT)PB*Bm2Wo1YV)U4gD(x z+HQ-cs0aF+?Ha#gvcex1dU(TRJTLI$?4N%X_+`u=7r6eBfzJh=z;=t{{@3;Ka(mMR zzL_^@+F!JM8_UlS@|}#&6L^I25`pjG`qT=1Dce(j`(2lNAI}fHLjJcr?k*DeQJnnX z+9mL0?)U2i{xa9|sKB3K{&j&j;$jQe2Lj)QK@D7=3;Z+Q2oK}+SGTK-C*bh{-^}%# zF7SB93k3ew6jiQ{H?;mV_S;oLegw;V1#ahhpCj;3*&o&kJc;Kw9k=Lmr*S=hB;?;o zQ1#p=aJ?SfDexIAe^B6)c)UL;@GU%_yddz6JfFNK@Vf`A`WzSdZtj=Q1b#oaOUKc= zz1fqLo{?O>#@}Q=nI!OSJU`D9`1Z+4k4xay?B_KC|G=r_R|{O1+aYjW?gaw>knONt z;D@-q*9d&=6jkn>0{@Z&lY;`E#OuYA0^f&*g6jo=r?J1iCh)BsZ+sQrKU# z{d?K}M+^J`uIFTdb2W|A1iqc;pECrm^{*DV*5590t$(Y)xA6RMqrjca|3cu?IS#o` z;6B##n7~hGe|tvYQ`tT*3w$2?;W2^F;BohNf$M$X34wR;d}!l9R`<(W>~ARoKgjFW z1c7g0eulvR#`P=|_$FRomI^$V+v^edW4eC@p3n2!SpwJg2?+e$Y03|K1^!E}&n|&~ z%>8wpz~}RLzeV78ay{=BxUSD50w2Ti;hO^A!~XMkf!{Dq)qfD%N%vPR>%reA!%O3N zJWpl{{B`z|nF3$H>x)a^L)bo50{;~j1lI)uKQdL}I|TkXm-{1utKR@OjGF|0C;Qtk z1wNJMnFj=JW4k>i@Y~tX|0wWPPF2s>1-_X3_XB~u+0LH}+{1oo#r2}#k|fo3j7APvrpjVJP&jV{2?9}8wEa#=dnu# zzKi`~x4_jeI~&HY1-_Fv%8v_N`{%m?&*63O6M@g+b>tg?zt8>W;P&bMn!xo;7r6EZ zr@&Krew!t5?dR=`qj?u8S0lPn$Un#n&!qxi#N&6jz;9>&|Ea*Q<$nByz_;;w{cC|g z&;I#@!2ibf{DZ(3vtPX?@b}n1KM?r09EY3`cq8L>onQz?XAPT^7jZwH6!EJ@N?Neiv)fj`%iAN8smioN%MS^SQrn7PvmwxLx2W+^z!x zf05&a`vtz6y_$+~+#pAI+;9s!cFA#Vl z*W)ySk7T@5;8~2HF7P>w*9yFt@#O+PgYne@*Z$Wm@NSmx5IFuJOT4-SzKijQz;9rD zlfds_e2c&zWPF>zk1&3jz^~wOt@i=CAKzg4JwpB;jNd45{1ZTU-7N5A=5H7HSmqB1 zd)seoWw3G5(&wZ({r-fgfP} zQ-MFm_?H5Io^c&V=>B@0@p#@hXnZ;2Ndj-@@jg`G&+_LoqXhmlj`zk3d=AeilLa2+ zcqLolck%p?EAU->epM*&2|RzEDsZ0Oj3R;W;&r@C;K@#MPs1bd-!fh&@Za+}Oq0NW z#QWK^1&)6Z9mlWC?r?+kd9OujjZr zPvH0RJTOn-Pcgn&;D2VkSl}NpULo-RFkUV2Av_)%1U`}RRRYgve2u_M7;h8!O3cH1EEAM(6?p}?DXpLL1A&tp6PP~gw8pI<5P*BQT7;LF$#ZxHxu#(yU8 zGM?x63w#CRcL}_M@%se+JmU`v{7uI7=kVIkKVkf7A#Y>*KPT|vjK3)G61L}2iSzvb zhQQO<4(|&5T3!b~6!-!z_Y;9%!MuLIPq%9;m-~&7ziz5p7vi{|wfqA-UpWNc%i}#& z;Q3ttbb*)fIm1|iU#^NZoC4p>`=Dt8Z{_)LmcTFJatj1LiT8aA1ipmv(*(Yf@lt{J zGJd+ipWuB*t-x<#d40aF?fE$4tA+gQj5iDXE5~1>o8w z@La~X2;9Z^Hi4_Zjtl!%fw!~#RRZ6{_#T1l&s}a5_%At5yIJ6ecz(NG;Hp)IaX{cp zoa)K_0{8GZdRX9Ju>U_H@O#*A^?Re(9NeNLaUAlzkiUiJ+m{6XDzA5c5%`Si{8WL@V7^G;KVtbZf#1fsN8k@I zUMKKcp0An&-pTeqTi}P-uUZA};(j_u;J5QS-Xrj5dEQH;2+L!Iu1+Z`B>wxaQ#yRp1|w%aDmg8v_M~mz}Is<^}bx| ze@VyxLOzN8e5Sx3W`E8X_~Yyk3k1HB^)D6pVV;M}1fIb2VU@sdXZ;NVce0){1%3|u zL$koY;rSsT@ZYgL_2;hIKFy4;7xMbN??Qo(=6YT#@cXzvmkIm;*Z*pP$MLxSiNOEO z^T164FW_}&zre@x`2Cf@|Hb}rzrZhI{tzJ;m z_P0?2FXDK6GUGUocneCFJ4MLf$a~pO=9%PAG086#@@sjYvdknu(RAxj_rqj!ltKOQy53T;-!f2Jb_md zY8XoezM1h-6OQ{bFZ)Ba2}k{hS-#$cqdc?5*#iG3>j?;4pWj7HIEM&S!UZNA^>1SP z|GlxSfJkEOVG|8hLJ^$Zt!cot4m=UgrOgPHx zb>S%!j`FG8Y0sE&l)uCY1g=*F-pK3e`vSk5=a&-#zhJV`lfeF>=a~|om-Ks2+E2D} zebR;ew>&RR5qK**dx5~W^ZstJ3CH&8@7cOcIJWl$uP@6?ILeQiAx7WnOqKghVYgZ8UqCLHUj=d6F4aIEJV_LC%D2ejS3VErQm zK844{c!8HQK8bN%pKYwa!i1wJZ%>UCCLHUd|0K58q#x^kCH%unzjv(bc`cW_-XxFq ze1h>U0)LP3OGUXaa6Rud;V8;xF!Z^FZr3rEe?{n@%kjXQ0{1a~T;P{7uGe9$Kau@2 z-3gU|3vsSG@e`eNi~f$vQ|zD11g^(phrrKZ{g(;6hw-}weg)&N2wZ<3`zwLZGSoG6 zlDg}5>DYR@z*n*SViT@ykB?TFaBQmn-Ml@Fqd(yMslRvnsK8I>{(4#9dwHFDRp3Xt zy>AL!%fBn|I9`vA4}kwu;QITv{~iGUTHrTx=YKZ!e4F6#Xo&)2a$#HD+}h@3^f%S1W>l<|~`4w}<@@j{~qA9(D$YP4t^* zh_ib~Rh-~_QGgRDYrb&aLY@Dw`Ef6YI?a1PV2v-i{7J}|E?s|Jk0N;1U;Z&XP%P2qvrKJFhKrV&acO{d&-Hx` z=hxp)*0^rB=GQ|4>r$ivz8}Jh!F9Y`-O+z=KGE&gcG(V?)QLH|rXz*lZWE3nWv>Sr ziDAC$W+F9=mw3HbTwmF1;X!}(-+#Btv7a+y{c+1A>wgDe{gvOz4w=XK^-ap&3J>}# zzxE!LL+8ix@zqCJ{)2!?otX2dT>c?sOqZ1XJv@^bil4=YNc#7HvG~4~E=Q(mMBR1y`u;A!{pG*mEG4hwBCSQ|)AxUHe*IkE z4|9Ia>$}dUdHg*!#4KwZ@H&5w7Ua8bzlOhsM1S_%(~tddF4Fn6UHdB=buTy@sbTEn qag1RXhQcyG#tCAG0RsEX7P=YBM1uuOzem_#{sUb96p=x&#{U8B#R`G| literal 48216 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%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 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 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