diff --git a/public_html/planeObject.js b/public_html/planeObject.js
index 39e3c4d..cb428ef 100644
--- a/public_html/planeObject.js
+++ b/public_html/planeObject.js
@@ -44,6 +44,7 @@ function PlaneObject(icao) {
this.version = null;
this.prev_position = null;
+ this.prev_position_time = null;
this.position = null;
this.position_from_mlat = false
this.sitedist = null;
@@ -135,29 +136,32 @@ PlaneObject.prototype.isFiltered = function() {
// Appends data to the running track so we can get a visual tail on the plane
// Only useful for a long running browser session.
-PlaneObject.prototype.updateTrack = function(estimate_time) {
+PlaneObject.prototype.updateTrack = function(receiver_timestamp, last_timestamp) {
if (!this.position)
return false;
- if (this.position == this.prev_position)
+ if (this.prev_position && this.position[0] == this.prev_position[0] && this.position[1] == this.prev_position[1])
return false;
var projHere = ol.proj.fromLonLat(this.position);
var projPrev;
+ var prev_time;
if (this.prev_position === null) {
projPrev = projHere;
+ prev_time = this.last_position_time;
} else {
projPrev = ol.proj.fromLonLat(this.prev_position);
+ prev_time = this.prev_position_time;
}
this.prev_position = this.position;
+ this.prev_position_time = this.last_position_time;
if (this.track_linesegs.length == 0) {
// Brand new track
//console.log(this.icao + " new track");
var newseg = { fixed: new ol.geom.LineString([projHere]),
feature: null,
- head_update: this.last_position_time,
- tail_update: this.last_position_time,
+ update_time: this.last_position_time,
estimated: false,
ground: (this.altitude === "ground"),
altitude: this.altitude
@@ -168,9 +172,20 @@ PlaneObject.prototype.updateTrack = function(estimate_time) {
}
var lastseg = this.track_linesegs[this.track_linesegs.length - 1];
- var elapsed = (this.last_position_time - lastseg.head_update);
-
- var est_track = (elapsed > estimate_time);
+
+ // Determine if track data are intermittent/stale
+ // Time difference between two position updates should not be much
+ // greater than the difference between data inputs
+ // MLAT data are given some more leeway
+
+ var time_difference = (this.last_position_time - prev_time) - (receiver_timestamp - last_timestamp);
+ var stale_timeout = (this.position_from_mlat ? 30 : 5);
+ var est_track = (time_difference > stale_timeout);
+
+ // Also check if the position was already stale when it was exported by dump1090
+ // Makes stale check more accurate for history points spaced 30 seconds apart
+ est_track = est_track || ((receiver_timestamp - this.last_position_time) > stale_timeout);
+
var ground_track = (this.altitude === "ground");
if (est_track) {
@@ -179,16 +194,16 @@ PlaneObject.prototype.updateTrack = function(estimate_time) {
// >5s gap in data, create a new estimated segment
//console.log(this.icao + " switching to estimated");
lastseg.fixed.appendCoordinate(projPrev);
- this.track_linesegs.push({ fixed: new ol.geom.LineString([projPrev, projHere]),
+ this.track_linesegs.push({ fixed: new ol.geom.LineString([projPrev]),
feature: null,
- head_update: this.last_position_time,
+ update_time: prev_time,
altitude: 0,
estimated: true });
this.history_size += 2;
} else {
// Keep appending to the existing dashed line; keep every point
lastseg.fixed.appendCoordinate(projPrev);
- lastseg.head_update = this.last_position_time;
+ lastseg.update_time = prev_time;
this.history_size++;
}
@@ -198,16 +213,16 @@ PlaneObject.prototype.updateTrack = function(estimate_time) {
if (lastseg.estimated) {
// We are back to good data (we got two points close in time), switch back to
// solid lines.
+ lastseg.fixed.appendCoordinate(projPrev);
lastseg = { fixed: new ol.geom.LineString([projPrev]),
feature: null,
- head_update: this.last_position_time,
- tail_update: this.last_position_time,
+ update_time: prev_time,
estimated: false,
ground: (this.altitude === "ground"),
altitude: this.altitude };
this.track_linesegs.push(lastseg);
- this.history_size ++;
- // continue
+ this.history_size += 2;
+ return true;
}
if ( (lastseg.ground && this.altitude !== "ground") ||
@@ -218,29 +233,27 @@ PlaneObject.prototype.updateTrack = function(estimate_time) {
// FIXME needs reimplementing post-google
lastseg.fixed.appendCoordinate(projPrev);
- this.track_linesegs.push({ fixed: new ol.geom.LineString([projPrev, projHere]),
+ this.track_linesegs.push({ fixed: new ol.geom.LineString([projPrev]),
feature: null,
- head_update: this.last_position_time,
- tail_update: this.last_position_time,
+ update_time: prev_time,
estimated: false,
altitude: this.altitude,
ground: (this.altitude === "ground") });
- this.history_size += 3;
+ this.history_size += 2;
return true;
}
// Add more data to the existing track.
// We only retain some historical points, at 5+ second intervals,
// plus the most recent point
- if (this.last_position_time - lastseg.tail_update >= 5) {
+ if (prev_time - lastseg.update_time >= 5) {
// enough time has elapsed; retain the last point and add a new one
//console.log(this.icao + " retain last point");
- lastseg.fixed.appendCoordinate(projHere);
- lastseg.tail_update = lastseg.head_update;
+ lastseg.fixed.appendCoordinate(projPrev);
+ lastseg.update_time = prev_time;
this.history_size ++;
}
- lastseg.head_update = this.last_position_time;
return true;
};
@@ -555,7 +568,7 @@ PlaneObject.prototype.updateTick = function(receiver_timestamp, last_timestamp)
} else {
if (this.position !== null && (this.selected || this.seen_pos < 60)) {
this.visible = true;
- if (this.updateTrack(receiver_timestamp - last_timestamp + (this.position_from_mlat ? 30 : 5))) {
+ if (this.updateTrack(receiver_timestamp, last_timestamp)) {
this.updateLines();
this.updateMarker(true);
} else {
@@ -657,7 +670,11 @@ PlaneObject.prototype.updateLines = function() {
var lastfixed = lastseg.fixed.getCoordinateAt(1.0);
var geom = new ol.geom.LineString([lastfixed, ol.proj.fromLonLat(this.position)]);
this.elastic_feature = new ol.Feature(geom);
- this.elastic_feature.setStyle(this.altitudeLines(lastseg.altitude));
+ if (lastseg.estimated) {
+ this.elastic_feature.setStyle(estimateStyle);
+ } else {
+ this.elastic_feature.setStyle(this.altitudeLines(lastseg.altitude));
+ }
if (oldElastic < 0) {
PlaneTrailFeatures.push(this.elastic_feature);
diff --git a/public_html/script.js b/public_html/script.js
index a5ad800..773fd1f 100644
--- a/public_html/script.js
+++ b/public_html/script.js
@@ -444,7 +444,7 @@ function end_load_history() {
console.log("Updating tracks at: " + now);
for (var i = 0; i < PlanesOrdered.length; ++i) {
var plane = PlanesOrdered[i];
- plane.updateTrack((now - last) + 1);
+ plane.updateTrack(now, last);
}
last = now;