From 372835d74385741c690d00d0525bbe0f83e13ace Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 14 Sep 2017 09:39:56 -0500 Subject: [PATCH] trails working Former-commit-id: 30b8c2d7f05182336425a4a919d483b063f45eb1 Former-commit-id: 0bfef69f78d44c524f5023d8dfbed9c9ed555bd9 --- sdl1090/draw.c | 60 +++++++++++++++++++++++---------- sdl1090/dump1090.h | 7 +++- sdl1090/interactive.c | 31 +++++++++++------ sdl1090/view1090.REMOVED.git-id | 2 +- 4 files changed, 71 insertions(+), 29 deletions(-) diff --git a/sdl1090/draw.c b/sdl1090/draw.c index 48c2588..26c6113 100644 --- a/sdl1090/draw.c +++ b/sdl1090/draw.c @@ -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); } } diff --git a/sdl1090/dump1090.h b/sdl1090/dump1090.h index 9bb5496..d4cff6d 100644 --- a/sdl1090/dump1090.h +++ b/sdl1090/dump1090.h @@ -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 diff --git a/sdl1090/interactive.c b/sdl1090/interactive.c index 129d297..5c91358 100644 --- a/sdl1090/interactive.c +++ b/sdl1090/interactive.c @@ -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) { diff --git a/sdl1090/view1090.REMOVED.git-id b/sdl1090/view1090.REMOVED.git-id index 5db50a0..060d7c5 100644 --- a/sdl1090/view1090.REMOVED.git-id +++ b/sdl1090/view1090.REMOVED.git-id @@ -1 +1 @@ -1efd85596b2ba325841ccd3511d70639b9feaec8 \ No newline at end of file +a6a9a37e655d982e0f80b7465ae153997cf598a3 \ No newline at end of file