viz1090/list.c

158 lines
5.6 KiB
C
Raw Normal View History

#include "dump1090.h"
#include "structs.h"
#include "parula.h"
#include "monokai.h"
#include "SDL2/SDL2_gfxPrimitives.h"
void drawList(int top) {
struct aircraft *a = Modes.aircrafts;
time_t now = time(NULL);
int count = 0;
char progress;
char spinner[4] = "|/-\\";
progress = spinner[time(NULL)%4];
drawStringBG(" Flight Alt(m) km/h D(km) H S ", 0, top, appData.mapBoldFont, black, (SDL_Color){255,255,255,64});
top = top + appData.mapFontHeight;
int numNoDir = 0;
while(a) {
if(top > appData.screen_height) {
return;
}
if ((now - a->seen) < Modes.interactive_display_ttl)
{
int msgs = a->messages;
int flags = a->modeACflags;
if ( (((flags & (MODEAC_MSG_FLAG )) == 0 ) )
|| (((flags & (MODEAC_MSG_MODES_HIT | MODEAC_MSG_MODEA_ONLY)) == MODEAC_MSG_MODEA_ONLY) && (msgs > 4 ) )
|| (((flags & (MODEAC_MSG_MODES_HIT | MODEAC_MSG_MODEC_OLD )) == 0 ) && (msgs > 127) )
) {
int altitude = a->altitude, speed = a->speed;
char strSquawk[5] = " ";
char strFl[6] = " ";
char strTt[5] = " ";
char strGs[5] = " ";
// Convert units to metric if --metric was specified
//if (Modes.metric) {
altitude = (int) (altitude / 3.2828);
speed = (int) (speed * 1.852);
//}
if (a->bFlags & MODES_ACFLAGS_SQUAWK_VALID) {
snprintf(strSquawk,5,"%04x", a->modeA);}
if (a->bFlags & MODES_ACFLAGS_SPEED_VALID) {
snprintf (strGs, 5,"%3d", speed);}
if (a->bFlags & MODES_ACFLAGS_HEADING_VALID) {
snprintf (strTt, 5,"%03d", a->track);}
if (msgs > 99999) {
msgs = 99999;}
// Dump1090 display mode
char strMode[5] = " ";
// char strLat[8] = " ";
// char strLon[9] = " ";
char strD[5] = " ";
char strDir[3] = " ";
char cLat = ' ';
char cLon = ' ';
char strS[3] = " ";
double d;
unsigned char * pSig = a->signalLevel;
unsigned int signalAverage = (pSig[0] + pSig[1] + pSig[2] + pSig[3] +
pSig[4] + pSig[5] + pSig[6] + pSig[7] + 3) >> 3;
if (a->bFlags & MODES_ACFLAGS_AOG) {
snprintf(strFl, 6," grnd");
} else if (a->bFlags & MODES_ACFLAGS_ALTITUDE_VALID) {
snprintf(strFl, 6, "%5d", altitude);
}
if ((flags & MODEAC_MSG_FLAG) == 0) {
strMode[0] = 'S';
} else if (flags & MODEAC_MSG_MODEA_ONLY) {
strMode[0] = 'A';
}
if (flags & MODEAC_MSG_MODEA_HIT) {strMode[2] = 'a';}
if (flags & MODEAC_MSG_MODEC_HIT) {strMode[3] = 'c';}
snprintf(strS, 3,"%3d", (int)((float)signalAverage/25.0f));
if (a->bFlags & MODES_ACFLAGS_LATLON_VALID) {
if(fabs(a->lon) < .01 && fabs(a->lat) > fabs(a->lon)) {
cLon = ' ';
} else {
if(a->lon < 0) {
cLon = 'W';
} else {
cLon = 'E';
}
}
if(fabs(a->lat) < .01 && fabs(a->lon) > fabs(a->lat)) {
cLat = ' ';
} else {
if(a->lat < 0) {
cLat = 'S';
} else {
cLat = 'N';
}
}
snprintf(strDir,3,"%c%c",cLat,cLon);
//distance is borked during refactor
//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, appData.listFont, (SDL_Color){96,96,96,255});
} else {
drawString(a->flight, 10, top, appData.listFont, pink);
drawString(strFl, 90, top, appData.listFont, orange);
drawString(strGs, 160, top, appData.listFont, green);
drawString(strD, 210, top, appData.listFont, blue);
drawString(strDir, 270, top, appData.listFont, yellow);
// 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,
// strFl,
// strGs,
// strD,
// cLat, cLon,
// (int)((float)signalAverage/25.0f));
}
top = top + appData.mapFontHeight;
count++;
} else {
numNoDir++;
}
}
}
a = a->next;
}
}