trails working

Former-commit-id: 30b8c2d7f05182336425a4a919d483b063f45eb1
Former-commit-id: 0bfef69f78d44c524f5023d8dfbed9c9ed555bd9
This commit is contained in:
Nathan 2017-09-14 09:39:56 -05:00
parent fc035a8c93
commit 372835d743
4 changed files with 71 additions and 29 deletions

View file

@ -1,3 +1,4 @@
#include "dump1090.h"
#include "draw.h" #include "draw.h"
#include "parula.h" #include "parula.h"
@ -32,7 +33,11 @@ void drawPlaneHeading(double dx, double dy, double heading, int signal, char *fl
signal = 127; signal = 127;
} }
SDL_SetRenderDrawColor(game.renderer, parula[signal][0], parula[signal][1], parula[signal][2], SDL_ALPHA_OPAQUE); if(signal < 0) {
SDL_SetRenderDrawColor(game.renderer, 96, 96, 96, SDL_ALPHA_OPAQUE);
} else {
SDL_SetRenderDrawColor(game.renderer, parula[signal][0], parula[signal][1], parula[signal][2], SDL_ALPHA_OPAQUE);
}
double body = 8.0; double body = 8.0;
double wing = 6.0; double wing = 6.0;
@ -78,9 +83,10 @@ void drawPlaneHeading(double dx, double dy, double heading, int signal, char *fl
SDL_RenderDrawLine(game.renderer, x1, y1, x2, y2); SDL_RenderDrawLine(game.renderer, x1, y1, x2, y2);
SDL_Color color = { parula[signal][0], parula[signal][1], parula[signal][2], 255}; if(flight) {
SDL_Color color = { 200, 200, 200 , 255};
drawString(flight, center.x + 10, center.y + 10, game.font, color); drawString(flight, center.x + 10, center.y + 10, game.font, color);
}
} }
void drawPlane(double dx, double dy, int signal) void drawPlane(double dx, double dy, int signal)
@ -96,7 +102,11 @@ void drawPlane(double dx, double dy, int signal)
signal = 127; signal = 127;
} }
SDL_SetRenderDrawColor(game.renderer, parula[signal][0], parula[signal][1], parula[signal][2], SDL_ALPHA_OPAQUE); if(signal < 0) {
SDL_SetRenderDrawColor(game.renderer, 96, 96, 96, SDL_ALPHA_OPAQUE);
} else {
SDL_SetRenderDrawColor(game.renderer, parula[signal][0], parula[signal][1], parula[signal][2], SDL_ALPHA_OPAQUE);
}
int length = 3.0; int length = 3.0;
@ -104,21 +114,26 @@ void drawPlane(double dx, double dy, int signal)
SDL_RenderDrawLine(game.renderer, center.x , center.y-length , center.x , center.y+length ); SDL_RenderDrawLine(game.renderer, center.x , center.y-length , center.x , center.y+length );
} }
void drawTrail(double *oldDx, double *oldDy, int idx) { void drawTrail(double *oldDx, double *oldDy, time_t * oldSeen, int idx) {
int currentIdx, prevIdx; int currentIdx, prevIdx;
SDL_Point current, prev; SDL_Point current, prev;
for(int i=1; i < 32; i++) { time_t now = time(NULL);
currentIdx = (idx - (i - 1)) % 32;
prevIdx = (idx - (i - 2)) % 32;
if(oldDx[currentIdx] == 0 && oldDy[currentIdx] == 0) { 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; continue;
} }
//SDL_SetRenderDrawColor(game.renderer, (i<<3)-1, (i<<3)-1, (i<<3)-1, SDL_ALPHA_OPAQUE); if(oldDx[prevIdx] == 0 || oldDy[prevIdx] == 0) {
SDL_SetRenderDrawColor(game.renderer, 0,60,60, SDL_ALPHA_OPAQUE); continue;
}
current = screenCoords(oldDx[currentIdx], oldDy[currentIdx]); current = screenCoords(oldDx[currentIdx], oldDy[currentIdx]);
prev = screenCoords(oldDx[prevIdx], oldDy[prevIdx]); prev = screenCoords(oldDx[prevIdx], oldDy[prevIdx]);
@ -131,12 +146,23 @@ void drawTrail(double *oldDx, double *oldDy, int idx) {
continue; continue;
} }
double age = 1.0 - (double)(now - oldSeen[currentIdx]) / MODES_INTERACTIVE_TRAIL_TTL;
if(age < 0) {
age = 0;
}
uint8_t colorVal = (uint8_t)floor(127.0 * age);
SDL_SetRenderDrawColor(game.renderer, colorVal, colorVal, colorVal, SDL_ALPHA_OPAQUE);
SDL_RenderDrawLine(game.renderer, prev.x, prev.y, current.x, current.y); SDL_RenderDrawLine(game.renderer, prev.x, prev.y, current.x, current.y);
SDL_SetRenderDrawColor(game.renderer, 255,0,0, SDL_ALPHA_OPAQUE); // SDL_SetRenderDrawColor(game.renderer, 255,0,0, SDL_ALPHA_OPAQUE);
SDL_Rect spot = {.x = current.x-1, .y = current.y-1, .w = 2, .h = 2}; // SDL_Rect spot = {.x = current.x-1, .y = current.y-1, .w = 2, .h = 2};
SDL_RenderFillRect(game.renderer, &spot); // SDL_RenderFillRect(game.renderer, &spot);
} }
} }

View file

@ -164,6 +164,10 @@
#define MODES_INTERACTIVE_ROWS 22 // Rows on screen #define MODES_INTERACTIVE_ROWS 22 // Rows on screen
#define MODES_INTERACTIVE_DELETE_TTL 300 // Delete from the list after 300 seconds #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_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 #define MODES_NET_HEARTBEAT_RATE 900 // Each block is approx 65mS - default is > 1 min
@ -224,7 +228,8 @@ struct aircraft {
uint64_t even_cprtime; uint64_t even_cprtime;
double lat, lon; // Coordinated obtained from CPR encoded data double lat, lon; // Coordinated obtained from CPR encoded data
double dx, dy; // distance in km double dx, dy; // distance in km
double oldDx[32], oldDy[32]; // position history double oldDx[MODES_INTERACTIVE_TRAIL_LENGTH], oldDy[MODES_INTERACTIVE_TRAIL_LENGTH]; // position history
time_t oldSeen[MODES_INTERACTIVE_TRAIL_LENGTH];// position time
uint8_t oldIdx; // index for ring buffer uint8_t oldIdx; // index for ring buffer
int bFlags; // Flags related to valid fields in this structure int bFlags; // Flags related to valid fields in this structure
struct aircraft *next; // Next aircraft in our linked list struct aircraft *next; // Next aircraft in our linked list

View file

@ -32,12 +32,12 @@
#include "structs.h" #include "structs.h"
Game game; Game game;
extern void drawPlaneHeading(double , double , double, int, char *); extern void drawPlaneHeading(double , double , double, int, char *);
extern void drawPlane(double , double, int); extern void drawPlane(double , double, int);
extern void drawTrail(double *, double *, int); extern void drawTrail(double *, double *, time_t *, int);
extern void drawGrid(); extern void drawGrid();
// //
// ============================= Utility functions ========================== // ============================= Utility functions ==========================
// //
@ -393,10 +393,14 @@ struct aircraft *interactiveReceiveData(struct modesMessage *mm) {
a->dx = 6371.0 * dLon * M_PI / 180.0f * cos(((a->lat+41.9809263)/2.0f) * M_PI / 180.0f); a->dx = 6371.0 * dLon * M_PI / 180.0f * cos(((a->lat+41.9809263)/2.0f) * M_PI / 180.0f);
a->dy = 6371.0 * dLat * M_PI / 180.0f; a->dy = 6371.0 * dLat * M_PI / 180.0f;
a->oldDx[a->oldIdx] = a->dx; if(time(NULL) - a->oldSeen[a->oldIdx] > MODES_INTERACTIVE_TRAIL_TTL_STEP) {
a->oldDy[a->oldIdx] = a->dy; a->oldIdx = (a->oldIdx+1) % 32;
a->oldIdx = (a->oldIdx+1) % 32; a->oldDx[a->oldIdx] = a->dx;
a->oldDy[a->oldIdx] = a->dy;
a->oldSeen[a->oldIdx] = a->seen;
}
} }
} }
@ -536,14 +540,21 @@ void interactiveShowData(void) {
snprintf(strLat, 8,"%7.03f", a->dx); snprintf(strLat, 8,"%7.03f", a->dx);
snprintf(strLon, 9,"%8.03f", a->dy); snprintf(strLon, 9,"%8.03f", a->dy);
drawTrail(a->oldDx, a->oldDy, a->oldSeen, a->oldIdx);
if(MODES_ACFLAGS_HEADING_VALID) { int colorIdx;
drawPlaneHeading(a->dx, a->dy,a->track, signalAverage, a->flight); if((int)(now - a->seen) > MODES_INTERACTIVE_DISPLAY_ACTIVE) {
colorIdx = -1;
} else { } else {
drawPlane(a->dx, a->dy, signalAverage); colorIdx = signalAverage;
}
if(MODES_ACFLAGS_HEADING_VALID) {
drawPlaneHeading(a->dx, a->dy,a->track, colorIdx, a->flight);
} else {
drawPlane(a->dx, a->dy, colorIdx);
} }
drawTrail(a->oldDx, a->oldDy, a->oldIdx);
} }
if (a->bFlags & MODES_ACFLAGS_AOG) { if (a->bFlags & MODES_ACFLAGS_AOG) {

View file

@ -1 +1 @@
1efd85596b2ba325841ccd3511d70639b9feaec8 a6a9a37e655d982e0f80b7465ae153997cf598a3