Merge branch 'master' into faurl

This commit is contained in:
Jeff Lawson 2014-10-29 23:00:38 -05:00
commit cd09210cb9
13 changed files with 236 additions and 39 deletions

Binary file not shown.

View file

@ -76,6 +76,7 @@ void modesInitConfig(void) {
Modes.net_input_raw_port = MODES_NET_INPUT_RAW_PORT; Modes.net_input_raw_port = MODES_NET_INPUT_RAW_PORT;
Modes.net_output_beast_port = MODES_NET_OUTPUT_BEAST_PORT; Modes.net_output_beast_port = MODES_NET_OUTPUT_BEAST_PORT;
Modes.net_input_beast_port = MODES_NET_INPUT_BEAST_PORT; Modes.net_input_beast_port = MODES_NET_INPUT_BEAST_PORT;
Modes.net_bind_address = MODES_NET_BIND_ADDRESS;
Modes.net_http_port = MODES_NET_HTTP_PORT; Modes.net_http_port = MODES_NET_HTTP_PORT;
Modes.interactive_rows = getTermRows(); Modes.interactive_rows = getTermRows();
Modes.interactive_delete_ttl = MODES_INTERACTIVE_DELETE_TTL; Modes.interactive_delete_ttl = MODES_INTERACTIVE_DELETE_TTL;
@ -409,6 +410,7 @@ void showHelp(void) {
"--modeac Enable decoding of SSR Modes 3/A & 3/C\n" "--modeac Enable decoding of SSR Modes 3/A & 3/C\n"
"--net-beast TCP raw output in Beast binary format\n" "--net-beast TCP raw output in Beast binary format\n"
"--net-only Enable just networking, no RTL device or file used\n" "--net-only Enable just networking, no RTL device or file used\n"
"--net-bind-address <ip> IP address to bind to (default: 127.0.0.1; 0.0.0.0 for public)\n"
"--net-http-port <port> HTTP server port (default: 8080)\n" "--net-http-port <port> HTTP server port (default: 8080)\n"
"--net-ri-port <port> TCP raw input listen port (default: 30001)\n" "--net-ri-port <port> TCP raw input listen port (default: 30001)\n"
"--net-ro-port <port> TCP raw output listen port (default: 30002)\n" "--net-ro-port <port> TCP raw output listen port (default: 30002)\n"
@ -716,6 +718,8 @@ int main(int argc, char **argv) {
Modes.net_output_beast_port = atoi(argv[++j]); Modes.net_output_beast_port = atoi(argv[++j]);
} else if (!strcmp(argv[j],"--net-bi-port") && more) { } else if (!strcmp(argv[j],"--net-bi-port") && more) {
Modes.net_input_beast_port = atoi(argv[++j]); Modes.net_input_beast_port = atoi(argv[++j]);
} else if (!strcmp(argv[j],"--net-bind-address") && more) {
Modes.net_bind_address = argv[++j];
} else if (!strcmp(argv[j],"--net-http-port") && more) { } else if (!strcmp(argv[j],"--net-http-port") && more) {
Modes.net_http_port = atoi(argv[++j]); Modes.net_http_port = atoi(argv[++j]);
} else if (!strcmp(argv[j],"--net-sbs-port") && more) { } else if (!strcmp(argv[j],"--net-sbs-port") && more) {

View file

@ -131,6 +131,10 @@ SOURCE=.\winstubs.h
# Begin Group "Resource Files" # Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# Begin Source File
SOURCE=.\Dump1090.rc
# End Source File
# End Group # End Group
# Begin Group "Library Files" # Begin Group "Library Files"

View file

@ -37,7 +37,7 @@
// MinorVer changes when additional features are added, but not for bug fixes (range 00-99) // MinorVer changes when additional features are added, but not for bug fixes (range 00-99)
// DayDate & Year changes for all changes, including for bug fixes. It represent the release date of the update // DayDate & Year changes for all changes, including for bug fixes. It represent the release date of the update
// //
#define MODES_DUMP1090_VERSION "1.09.0608.14" #define MODES_DUMP1090_VERSION "1.10.2910.14"
// ============================= Include files ========================== // ============================= Include files ==========================
@ -173,6 +173,7 @@
#define MODES_NET_OUTPUT_SBS_PORT 30003 #define MODES_NET_OUTPUT_SBS_PORT 30003
#define MODES_NET_INPUT_BEAST_PORT 30004 #define MODES_NET_INPUT_BEAST_PORT 30004
#define MODES_NET_OUTPUT_BEAST_PORT 30005 #define MODES_NET_OUTPUT_BEAST_PORT 30005
#define MODES_NET_BIND_ADDRESS "0.0.0.0"
#define MODES_NET_HTTP_PORT 8080 #define MODES_NET_HTTP_PORT 8080
#define MODES_CLIENT_BUF_SIZE 1024 #define MODES_CLIENT_BUF_SIZE 1024
#define MODES_NET_SNDBUF_SIZE (1024*64) #define MODES_NET_SNDBUF_SIZE (1024*64)
@ -305,6 +306,7 @@ struct { // Internal state
int net_input_raw_port; // Raw input TCP port int net_input_raw_port; // Raw input TCP port
int net_output_beast_port; // Beast output TCP port int net_output_beast_port; // Beast output TCP port
int net_input_beast_port; // Beast input TCP port int net_input_beast_port; // Beast input TCP port
char *net_bind_address; // Bind address
int net_http_port; // HTTP port int net_http_port; // HTTP port
int net_sndbuf_size; // TCP output buffer size (64Kb * 2^n) int net_sndbuf_size; // TCP output buffer size (64Kb * 2^n)
int quiet; // Suppress stdout int quiet; // Suppress stdout

115
dump1090.rc Normal file
View file

@ -0,0 +1,115 @@
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS
#include "ntverp.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
#ifndef _MAC
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,10,2910,14
PRODUCTVERSION 1,10,2910,14
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x3L
FILESUBTYPE 0x7L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", "Dump1090 for Win32 \0"
VALUE "CompanyName", "\0"
VALUE "FileDescription", "Mode A/C/S decoder for RTL Dongles\0"
VALUE "FileVersion", "1, 10, 2910, 14\0"
VALUE "InternalName", "DUMP1090.EXE\0"
VALUE "LegalCopyright", "Copyright (C) 2012 by Salvatore Sanfilippo <antirez@gmail.com>\r\nCopyright (C) 2014 by Malcolm Robb <support@attavionics.com>\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "DUMP1090.EXE\0"
VALUE "PrivateBuild", "\0"
VALUE "ProductName", "DUMP1090\0"
VALUE "ProductVersion", "1, 10, 2910, 14\0"
VALUE "SpecialBuild", "\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
#endif // !_MAC
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include ""windows.h""\r\n"
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include ""ntverp.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View file

@ -85,7 +85,7 @@ void modesInitNet(void) {
for (j = 0; j < MODES_NET_SERVICES_NUM; j++) { for (j = 0; j < MODES_NET_SERVICES_NUM; j++) {
services[j].enabled = (services[j].port != 0); services[j].enabled = (services[j].port != 0);
if (services[j].enabled) { if (services[j].enabled) {
int s = anetTcpServer(Modes.aneterr, services[j].port, NULL); int s = anetTcpServer(Modes.aneterr, services[j].port, Modes.net_bind_address);
if (s == -1) { if (s == -1) {
fprintf(stderr, "Error opening the listening port %d (%s): %s\n", fprintf(stderr, "Error opening the listening port %d (%s): %s\n",
services[j].port, services[j].descr, Modes.aneterr); services[j].port, services[j].descr, Modes.aneterr);
@ -161,7 +161,14 @@ void modesFreeClient(struct client *c) {
} }
} }
// It's now safe to remove this client free(c);
}
//
//=========================================================================
//
// Close the client connection and mark it as closed
//
void modesCloseClient(struct client *c) {
close(c->fd); close(c->fd);
if (c->service == Modes.sbsos) { if (c->service == Modes.sbsos) {
if (Modes.stat_sbs_connections) Modes.stat_sbs_connections--; if (Modes.stat_sbs_connections) Modes.stat_sbs_connections--;
@ -174,7 +181,7 @@ void modesFreeClient(struct client *c) {
if (Modes.debug & MODES_DEBUG_NET) if (Modes.debug & MODES_DEBUG_NET)
printf("Closing client %d\n", c->fd); printf("Closing client %d\n", c->fd);
free(c); c->fd = -1;
} }
// //
//========================================================================= //=========================================================================
@ -188,6 +195,7 @@ void modesSendAllClients(int service, void *msg, int len) {
// Read next before servicing client incase the service routine deletes the client! // Read next before servicing client incase the service routine deletes the client!
struct client *next = c->next; struct client *next = c->next;
if (c->fd != -1) {
if (c->service == service) { if (c->service == service) {
#ifndef _WIN32 #ifndef _WIN32
int nwritten = write(c->fd, msg, len); int nwritten = write(c->fd, msg, len);
@ -195,9 +203,12 @@ void modesSendAllClients(int service, void *msg, int len) {
int nwritten = send(c->fd, msg, len, 0 ); int nwritten = send(c->fd, msg, len, 0 );
#endif #endif
if (nwritten != len) { if (nwritten != len) {
modesFreeClient(c); modesCloseClient(c);
} }
} }
} else {
modesFreeClient(c);
}
c = next; c = next;
} }
} }
@ -702,6 +713,7 @@ int handleHTTPRequest(struct client *c, char *p) {
char hdr[512]; char hdr[512];
int clen, hdrlen; int clen, hdrlen;
int httpver, keepalive; int httpver, keepalive;
int statuscode = 500;
char *url, *content; char *url, *content;
char ctype[48]; char ctype[48];
char getFile[1024]; char getFile[1024];
@ -714,11 +726,12 @@ int handleHTTPRequest(struct client *c, char *p) {
httpver = (strstr(p, "HTTP/1.1") != NULL) ? 11 : 10; httpver = (strstr(p, "HTTP/1.1") != NULL) ? 11 : 10;
if (httpver == 10) { if (httpver == 10) {
// HTTP 1.0 defaults to close, unless otherwise specified. // HTTP 1.0 defaults to close, unless otherwise specified.
keepalive = strstr(p, "Connection: keep-alive") != NULL; //keepalive = strstr(p, "Connection: keep-alive") != NULL;
} else if (httpver == 11) { } else if (httpver == 11) {
// HTTP 1.1 defaults to keep-alive, unless close is specified. // HTTP 1.1 defaults to keep-alive, unless close is specified.
keepalive = strstr(p, "Connection: close") == NULL; //keepalive = strstr(p, "Connection: close") == NULL;
} }
keepalive = 0;
// Identify he URL. // Identify he URL.
p = strchr(p,' '); p = strchr(p,' ');
@ -743,22 +756,35 @@ int handleHTTPRequest(struct client *c, char *p) {
// "/" -> Our google map application. // "/" -> Our google map application.
// "/data.json" -> Our ajax request to update planes. // "/data.json" -> Our ajax request to update planes.
if (strstr(url, "/data.json")) { if (strstr(url, "/data.json")) {
statuscode = 200;
content = aircraftsToJson(&clen); content = aircraftsToJson(&clen);
//snprintf(ctype, sizeof ctype, MODES_CONTENT_TYPE_JSON); //snprintf(ctype, sizeof ctype, MODES_CONTENT_TYPE_JSON);
} else { } else {
struct stat sbuf; struct stat sbuf;
int fd = -1; int fd = -1;
char *rp, *hrp;
rp = realpath(getFile, NULL);
hrp = realpath(HTMLPATH, NULL);
hrp = (hrp ? hrp : HTMLPATH);
clen = -1;
content = strdup("Server error occured");
if (rp && (!strncmp(hrp, rp, strlen(hrp)))) {
if (stat(getFile, &sbuf) != -1 && (fd = open(getFile, O_RDONLY)) != -1) { if (stat(getFile, &sbuf) != -1 && (fd = open(getFile, O_RDONLY)) != -1) {
content = (char *) malloc(sbuf.st_size); content = (char *) realloc(content, sbuf.st_size);
if (read(fd, content, sbuf.st_size) == -1) { if (read(fd, content, sbuf.st_size) != -1) {
snprintf(content, sbuf.st_size, "Error reading from file: %s", strerror(errno));
}
clen = sbuf.st_size; clen = sbuf.st_size;
statuscode = 200;
}
}
} else { } else {
char buf[128]; errno = ENOENT;
clen = snprintf(buf,sizeof(buf),"Error opening HTML file: %s", strerror(errno)); }
content = strdup(buf);
if (clen < 0) {
content = realloc(content, 128);
clen = snprintf(content, 128,"Error opening HTML file: %s", strerror(errno));
statuscode = 404;
} }
if (fd != -1) { if (fd != -1) {
@ -782,7 +808,7 @@ int handleHTTPRequest(struct client *c, char *p) {
// Create the header and send the reply // Create the header and send the reply
hdrlen = snprintf(hdr, sizeof(hdr), hdrlen = snprintf(hdr, sizeof(hdr),
"HTTP/1.1 200 OK\r\n" "HTTP/1.1 %d \r\n"
"Server: Dump1090\r\n" "Server: Dump1090\r\n"
"Content-Type: %s\r\n" "Content-Type: %s\r\n"
"Connection: %s\r\n" "Connection: %s\r\n"
@ -790,6 +816,7 @@ int handleHTTPRequest(struct client *c, char *p) {
"Cache-Control: no-cache, must-revalidate\r\n" "Cache-Control: no-cache, must-revalidate\r\n"
"Expires: Sat, 26 Jul 1997 05:00:00 GMT\r\n" "Expires: Sat, 26 Jul 1997 05:00:00 GMT\r\n"
"\r\n", "\r\n",
statuscode,
ctype, ctype,
keepalive ? "keep-alive" : "close", keepalive ? "keep-alive" : "close",
clen); clen);
@ -852,6 +879,10 @@ void modesReadFromClient(struct client *c, char *sep,
nread = recv(c->fd, c->buf+c->buflen, left, 0); nread = recv(c->fd, c->buf+c->buflen, left, 0);
if (nread < 0) {errno = WSAGetLastError();} if (nread < 0) {errno = WSAGetLastError();}
#endif #endif
if (nread == 0) {
modesCloseClient(c);
return;
}
// If we didn't get all the data we asked for, then return once we've processed what we did get. // If we didn't get all the data we asked for, then return once we've processed what we did get.
if (nread != left) { if (nread != left) {
@ -862,7 +893,7 @@ void modesReadFromClient(struct client *c, char *sep,
#else #else
if ( (nread < 0) && (errno != EWOULDBLOCK)) { // Error, or end of file if ( (nread < 0) && (errno != EWOULDBLOCK)) { // Error, or end of file
#endif #endif
modesFreeClient(c); modesCloseClient(c);
return; return;
} }
if (nread <= 0) { if (nread <= 0) {
@ -910,7 +941,7 @@ void modesReadFromClient(struct client *c, char *sep,
} }
// Have a 0x1a followed by 1, 2 or 3 - pass message less 0x1a to handler. // Have a 0x1a followed by 1, 2 or 3 - pass message less 0x1a to handler.
if (handler(c, s)) { if (handler(c, s)) {
modesFreeClient(c); modesCloseClient(c);
return; return;
} }
fullmsg = 1; fullmsg = 1;
@ -926,7 +957,7 @@ void modesReadFromClient(struct client *c, char *sep,
while ((e = strstr(s, sep)) != NULL) { // end of first message if found while ((e = strstr(s, sep)) != NULL) { // end of first message if found
*e = '\0'; // The handler expects null terminated strings *e = '\0'; // The handler expects null terminated strings
if (handler(c, s)) { // Pass message to handler. if (handler(c, s)) { // Pass message to handler.
modesFreeClient(c); // Handler returns 1 on error to signal we . modesCloseClient(c); // Handler returns 1 on error to signal we .
return; // should close the client connection return; // should close the client connection
} }
s = e + strlen(sep); // Move to start of next message s = e + strlen(sep); // Move to start of next message
@ -956,6 +987,7 @@ void modesReadFromClients(void) {
// Read next before servicing client incase the service routine deletes the client! // Read next before servicing client incase the service routine deletes the client!
struct client *next = c->next; struct client *next = c->next;
if (c->fd >= 0) {
if (c->service == Modes.ris) { if (c->service == Modes.ris) {
modesReadFromClient(c,"\n",decodeHexMessage); modesReadFromClient(c,"\n",decodeHexMessage);
} else if (c->service == Modes.bis) { } else if (c->service == Modes.bis) {
@ -963,6 +995,9 @@ void modesReadFromClients(void) {
} else if (c->service == Modes.https) { } else if (c->service == Modes.https) {
modesReadFromClient(c,"\r\n\r\n",handleHTTPRequest); modesReadFromClient(c,"\r\n\r\n",handleHTTPRequest);
} }
} else {
modesFreeClient(c);
}
c = next; c = next;
} }
} }

View file

@ -20,6 +20,7 @@ CONST_ZOOMLVL = 5;
// The default marker color // The default marker color
MarkerColor = "rgb(127, 127, 127)"; MarkerColor = "rgb(127, 127, 127)";
SelectedColor = "rgb(225, 225, 225)"; SelectedColor = "rgb(225, 225, 225)";
StaleColor = "rgb(190, 190, 190)";
// -- Site Settings --------------------------------------- // -- Site Settings ---------------------------------------
SiteShow = false; // true or false SiteShow = false; // true or false

View file

@ -1,10 +1,11 @@
<html> <html>
<head> <head>
<meta charset="utf-8"/>
<link rel="stylesheet" type="text/css" href="style.css" /> <link rel="stylesheet" type="text/css" href="style.css" />
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" /> <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script> <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false&libraries=geometry"></script> <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false&amp;libraries=geometry"></script>
<script type="text/javascript" src="config.js"></script> <script type="text/javascript" src="config.js"></script>
<script type="text/javascript" src="planeObject.js"></script> <script type="text/javascript" src="planeObject.js"></script>
<script type="text/javascript" src="options.js"></script> <script type="text/javascript" src="options.js"></script>
@ -13,6 +14,7 @@
<script type="text/javascript" src="coolclock/excanvas.js"></script> <script type="text/javascript" src="coolclock/excanvas.js"></script>
<script type="text/javascript" src="coolclock/coolclock.js"></script> <script type="text/javascript" src="coolclock/coolclock.js"></script>
<script type="text/javascript" src="coolclock/moreskins.js"></script> <script type="text/javascript" src="coolclock/moreskins.js"></script>
<title>DUMP1090</title>
</head> </head>
<body onload="initialize()"> <body onload="initialize()">
<div id="dialog-modal" title="Basic modal dialog" style="display:none;"> <div id="dialog-modal" title="Basic modal dialog" style="display:none;">

View file

@ -53,11 +53,17 @@ var planeObject = {
// Should create an icon for us to use on the map... // Should create an icon for us to use on the map...
funcGetIcon : function() { funcGetIcon : function() {
this.markerColor = MarkerColor;
// If this marker is selected we should make it lighter than the rest. // If this marker is selected we should make it lighter than the rest.
if (this.is_selected == true) { if (this.is_selected == true) {
this.markerColor = SelectedColor; this.markerColor = SelectedColor;
} }
// If we have not seen a recent update, change color
if (this.seen > 15) {
this.markerColor = StaleColor;
}
// Plane marker // Plane marker
var baseSvg = { var baseSvg = {
planeData : "M 1.9565564,41.694305 C 1.7174505,40.497708 1.6419973,38.448747 " + planeData : "M 1.9565564,41.694305 C 1.7174505,40.497708 1.6419973,38.448747 " +

View file

@ -267,6 +267,7 @@ function refreshSelected() {
} else if (selected && selected.squawk == 7700) { // General Emergency } else if (selected && selected.squawk == 7700) { // General Emergency
html += '&nbsp;<span class="squawk7700">&nbsp;Squawking: General Emergency&nbsp;</span>'; html += '&nbsp;<span class="squawk7700">&nbsp;Squawking: General Emergency&nbsp;</span>';
} else if (selected && selected.flight != '') { } else if (selected && selected.flight != '') {
html += '&nbsp;<a href="http://fr24.com/'+selected.flight+'" target="_blank">[FR24]</a>';
html += '&nbsp;<a href="http://www.flightstats.com/go/FlightStatus/flightStatusByFlight.do?'; html += '&nbsp;<a href="http://www.flightstats.com/go/FlightStatus/flightStatusByFlight.do?';
html += 'flightNumber='+selected.flight+'" target="_blank">[FlightStats]</a>'; html += 'flightNumber='+selected.flight+'" target="_blank">[FlightStats]</a>';
html += '&nbsp;<a href="http://flightaware.com/live/flight/'+selected.flight+'" target="_blank">[FlightAware]</a>'; html += '&nbsp;<a href="http://flightaware.com/live/flight/'+selected.flight+'" target="_blank">[FlightAware]</a>';
@ -331,12 +332,12 @@ function refreshSelected() {
dist /= 1852; dist /= 1852;
} }
dist = (Math.round((dist)*10)/10).toFixed(1); dist = (Math.round((dist)*10)/10).toFixed(1);
html += '<tr><td colspan="' + columns + '">Distance from Site: ' + dist + html += '<tr><td colspan="' + columns + '" align="center">Distance from Site: ' + dist +
(Metric ? ' km' : ' NM') + '</td></tr>'; (Metric ? ' km' : ' NM') + '</td></tr>';
} // End of SiteShow } // End of SiteShow
} else { } else {
if (SiteShow) { if (SiteShow) {
html += '<tr><td colspan="' + columns + '">Distance from Site: n/a ' + html += '<tr><td colspan="' + columns + '" align="center">Distance from Site: n/a ' +
(Metric ? ' km' : ' NM') + '</td></tr>'; (Metric ? ' km' : ' NM') + '</td></tr>';
} else { } else {
html += 'n/a</td></tr>'; html += 'n/a</td></tr>';
@ -404,11 +405,16 @@ function refreshTableInfo() {
'align="right">Altitude</td>'; 'align="right">Altitude</td>';
html += '<td onclick="setASC_DESC(\'4\');sortTable(\'tableinfo\',\'4\');" ' + html += '<td onclick="setASC_DESC(\'4\');sortTable(\'tableinfo\',\'4\');" ' +
'align="right">Speed</td>'; 'align="right">Speed</td>';
// Add distance column header to table if site coordinates are provided
if (SiteShow && (typeof SiteLat !== 'undefined' || typeof SiteLon !== 'undefined')) {
html += '<td onclick="setASC_DESC(\'5\');sortTable(\'tableinfo\',\'5\');" ' + html += '<td onclick="setASC_DESC(\'5\');sortTable(\'tableinfo\',\'5\');" ' +
'align="right">Distance</td>';
}
html += '<td onclick="setASC_DESC(\'5\');sortTable(\'tableinfo\',\'6\');" ' +
'align="right">Track</td>'; 'align="right">Track</td>';
html += '<td onclick="setASC_DESC(\'6\');sortTable(\'tableinfo\',\'6\');" ' + html += '<td onclick="setASC_DESC(\'6\');sortTable(\'tableinfo\',\'7\');" ' +
'align="right">Msgs</td>'; 'align="right">Msgs</td>';
html += '<td onclick="setASC_DESC(\'7\');sortTable(\'tableinfo\',\'7\');" ' + html += '<td onclick="setASC_DESC(\'7\');sortTable(\'tableinfo\',\'8\');" ' +
'align="right">Seen</td></thead><tbody>'; 'align="right">Seen</td></thead><tbody>';
for (var tablep in Planes) { for (var tablep in Planes) {
var tableplane = Planes[tablep] var tableplane = Planes[tablep]
@ -452,6 +458,25 @@ function refreshTableInfo() {
html += '<td align="right">' + tableplane.altitude + '</td>'; html += '<td align="right">' + tableplane.altitude + '</td>';
html += '<td align="right">' + tableplane.speed + '</td>'; html += '<td align="right">' + tableplane.speed + '</td>';
} }
// Add distance column to table if site coordinates are provided
if (SiteShow && (typeof SiteLat !== 'undefined' || typeof SiteLon !== 'undefined')) {
html += '<td align="right">';
if (tableplane.vPosition) {
var siteLatLon = new google.maps.LatLng(SiteLat, SiteLon);
var planeLatLon = new google.maps.LatLng(tableplane.latitude, tableplane.longitude);
var dist = google.maps.geometry.spherical.computeDistanceBetween (siteLatLon, planeLatLon);
if (Metric) {
dist /= 1000;
} else {
dist /= 1852;
}
dist = (Math.round((dist)*10)/10).toFixed(1);
html += dist;
} else {
html += '0';
}
html += '</td>';
}
html += '<td align="right">'; html += '<td align="right">';
if (tableplane.vTrack) { if (tableplane.vTrack) {
@ -504,6 +529,8 @@ function sortTable(szTableID,iCol) {
if (typeof iCol==='undefined'){ if (typeof iCol==='undefined'){
if(iSortCol!=-1){ if(iSortCol!=-1){
var iCol=iSortCol; var iCol=iSortCol;
} else if (SiteShow && (typeof SiteLat !== 'undefined' || typeof SiteLon !== 'undefined')) {
var iCol=5;
} else { } else {
var iCol=iDefaultSortCol; var iCol=iDefaultSortCol;
} }

View file

@ -1,6 +1,6 @@
html, body { html, body {
margin: 0; padding: 0; background-color: #ffffff; font-family: Tahoma, Sans-Serif; margin: 0; padding: 0; background-color: #ffffff; font-family: Tahoma, Sans-Serif;
font-size: 10pt; overflow: auto; font-size: 10pt; overflow: auto; height: 100%;
} }
div#map_container { float: left; width: 100%; height: 100%; } div#map_container { float: left; width: 100%; height: 100%; }
div#map_canvas { height: 100%; margin-right: 420px; } div#map_canvas { height: 100%; margin-right: 420px; }

View file

@ -75,6 +75,7 @@ _inline uint64_t strtoll(const char *p, void *e, UINT32 base) {return _atoi64(p)
_inline int inet_aton(const char * cp, DWORD * ulAddr) { *ulAddr = inet_addr(cp); return 0;} _inline int inet_aton(const char * cp, DWORD * ulAddr) { *ulAddr = inet_addr(cp); return 0;}
#define snprintf _snprintf #define snprintf _snprintf
#define vsnprintf _vsnprintf #define vsnprintf _vsnprintf
#define realpath(N,R) _fullpath((R),(N),_MAX_PATH)
_inline void cls() { _inline void cls() {
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);