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 "parula.h"
@ -32,7 +33,11 @@ void drawPlaneHeading(double dx, double dy, double heading, int signal, char *fl
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 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_Color color = { parula[signal][0], parula[signal][1], parula[signal][2], 255};
drawString(flight, center.x + 10, center.y + 10, game.font, color);
if(flight) {
SDL_Color color = { 200, 200, 200 , 255};
drawString(flight, center.x + 10, center.y + 10, game.font, color);
}
}
void drawPlane(double dx, double dy, int signal)
@ -96,7 +102,11 @@ void drawPlane(double dx, double dy, int signal)
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;
@ -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 );
}
void drawTrail(double *oldDx, double *oldDy, int idx) {
int currentIdx, prevIdx;
void drawTrail(double *oldDx, double *oldDy, time_t * oldSeen, int idx) {
int currentIdx, prevIdx;
SDL_Point current, prev;
SDL_Point current, prev;
for(int i=1; i < 32; i++) {
currentIdx = (idx - (i - 1)) % 32;
prevIdx = (idx - (i - 2)) % 32;
time_t now = time(NULL);
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;
}
//SDL_SetRenderDrawColor(game.renderer, (i<<3)-1, (i<<3)-1, (i<<3)-1, SDL_ALPHA_OPAQUE);
SDL_SetRenderDrawColor(game.renderer, 0,60,60, SDL_ALPHA_OPAQUE);
if(oldDx[prevIdx] == 0 || oldDy[prevIdx] == 0) {
continue;
}
current = screenCoords(oldDx[currentIdx], oldDy[currentIdx]);
prev = screenCoords(oldDx[prevIdx], oldDy[prevIdx]);
@ -131,12 +146,23 @@ void drawTrail(double *oldDx, double *oldDy, int idx) {
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_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_RenderFillRect(game.renderer, &spot);
// SDL_Rect spot = {.x = current.x-1, .y = current.y-1, .w = 2, .h = 2};
// SDL_RenderFillRect(game.renderer, &spot);
}
}

View file

@ -164,6 +164,10 @@
#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
@ -224,7 +228,8 @@ struct aircraft {
uint64_t even_cprtime;
double lat, lon; // Coordinated obtained from CPR encoded data
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
int bFlags; // Flags related to valid fields in this structure
struct aircraft *next; // Next aircraft in our linked list

View file

@ -32,12 +32,12 @@
#include "structs.h"
Game game;
extern void drawPlaneHeading(double , double , double, int, char *);
extern void drawPlane(double , double, int);
extern void drawTrail(double *, double *, int);
extern void drawTrail(double *, double *, time_t *, int);
extern void drawGrid();
//
// ============================= 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->dy = 6371.0 * dLat * M_PI / 180.0f;
a->oldDx[a->oldIdx] = a->dx;
a->oldDy[a->oldIdx] = a->dy;
if(time(NULL) - a->oldSeen[a->oldIdx] > MODES_INTERACTIVE_TRAIL_TTL_STEP) {
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(strLon, 9,"%8.03f", a->dy);
if(MODES_ACFLAGS_HEADING_VALID) {
drawPlaneHeading(a->dx, a->dy,a->track, signalAverage, a->flight);
drawTrail(a->oldDx, a->oldDy, a->oldSeen, a->oldIdx);
int colorIdx;
if((int)(now - a->seen) > MODES_INTERACTIVE_DISPLAY_ACTIVE) {
colorIdx = -1;
} 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) {

View file

@ -1 +1 @@
1efd85596b2ba325841ccd3511d70639b9feaec8
a6a9a37e655d982e0f80b7465ae153997cf598a3