223 lines
5.6 KiB
JavaScript
223 lines
5.6 KiB
JavaScript
|
var planeObject = {
|
||
|
oldlat : null,
|
||
|
oldlon : null,
|
||
|
oldalt : null,
|
||
|
|
||
|
// Basic location information
|
||
|
altitude : null,
|
||
|
speed : null,
|
||
|
track : null,
|
||
|
latitude : null,
|
||
|
longitude : null,
|
||
|
|
||
|
// Info about the plane
|
||
|
flight : null,
|
||
|
squawk : null,
|
||
|
icao : null,
|
||
|
is_selected : false,
|
||
|
|
||
|
// Data packet numbers
|
||
|
messages : null,
|
||
|
seen : null,
|
||
|
|
||
|
// Vaild...
|
||
|
vPosition : false,
|
||
|
vTrack : false,
|
||
|
|
||
|
// GMap Details
|
||
|
marker : null,
|
||
|
markerColor : MarkerColor,
|
||
|
lines : [],
|
||
|
trackdata : new Array(),
|
||
|
trackline : new Array(),
|
||
|
|
||
|
// When was this last updated?
|
||
|
updated : null,
|
||
|
reapable : false,
|
||
|
|
||
|
// Appends data to the running track so we can get a visual tail on the plane
|
||
|
// Only useful for a long running browser session.
|
||
|
funcAddToTrack : function(){
|
||
|
// TODO: Write this function out
|
||
|
this.trackdata.push([this.latitude, this.longitude, this.altitude, this.track, this.speed]);
|
||
|
this.trackline.push(new google.maps.LatLng(this.latitude, this.longitude));
|
||
|
},
|
||
|
|
||
|
// This is to remove the line from the screen if we deselect the plane
|
||
|
funcClearLine : function() {
|
||
|
console.log("Clearing line for: " + this.icao);
|
||
|
if (this.line) {
|
||
|
this.line.setMap(null);
|
||
|
this.line = null;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// Should create an icon for us to use on the map...
|
||
|
funcGetIcon : function() {
|
||
|
// If this marker is selected we should make it lighter than the rest.
|
||
|
if (this.is_selected == true) {
|
||
|
this.markerColor = SelectedColor;
|
||
|
}
|
||
|
|
||
|
// If the squawk code is one of the international emergency codes,
|
||
|
// match the info window alert color.
|
||
|
if (this.squawk == 7500) {
|
||
|
this.markerColor = "rgb(255, 85, 85)";
|
||
|
}
|
||
|
if (this.squawk == 7600) {
|
||
|
this.markerColor = "rgb(0, 255, 255)";
|
||
|
}
|
||
|
if (this.squawk == 7700) {
|
||
|
this.markerColor = "rgb(255, 255, 0)";
|
||
|
}
|
||
|
|
||
|
// If we have not overwritten color by now, an extension still could but
|
||
|
// just keep on trucking. :)
|
||
|
|
||
|
return {
|
||
|
strokeWeight: (this.is_selected ? 2 : 1),
|
||
|
path: google.maps.SymbolPath.FORWARD_CLOSED_ARROW,
|
||
|
scale: 5,
|
||
|
fillColor: this.markerColor,
|
||
|
fillOpacity: 0.9,
|
||
|
rotation: this.track
|
||
|
};
|
||
|
},
|
||
|
|
||
|
// TODO: Trigger actions of a selecting a plane
|
||
|
funcSelectPlane : function(selectedPlane){
|
||
|
selectPlaneByHex(this.icao);
|
||
|
},
|
||
|
|
||
|
// Update our data
|
||
|
funcUpdateData : function(data){
|
||
|
// So we can find out if we moved
|
||
|
var oldlat = this.latitude;
|
||
|
var oldlon = this.longitude;
|
||
|
var oldalt = this.altitude;
|
||
|
|
||
|
// Update all of our data
|
||
|
this.updated = new Date().getTime();
|
||
|
this.altitude = data.altitude;
|
||
|
this.speed = data.speed;
|
||
|
this.track = data.track;
|
||
|
this.latitude = data.lat;
|
||
|
this.longitude = data.lon;
|
||
|
this.flight = data.flight;
|
||
|
this.squawk = data.squawk;
|
||
|
this.icao = data.hex;
|
||
|
this.messages = data.messages;
|
||
|
this.seen = data.seen;
|
||
|
|
||
|
// If no packet in over 58 seconds, consider the plane reapable
|
||
|
// This way we can hold it, but not show it just in case the plane comes back
|
||
|
if (this.seen > 58) {
|
||
|
this.reapable = true;
|
||
|
if (this.marker) {
|
||
|
this.marker.setMap(null);
|
||
|
this.marker = null;
|
||
|
}
|
||
|
if (this.line) {
|
||
|
this.line.setMap(null);
|
||
|
this.line = null;
|
||
|
}
|
||
|
if (SelectedPlane == this.icao) {
|
||
|
if (this.is_selected) {
|
||
|
this.is_selected = false;
|
||
|
}
|
||
|
SelectedPlane = null;
|
||
|
}
|
||
|
} else {
|
||
|
if (this.reapable == true) {
|
||
|
console.log(this.icao + ' has come back into range before the reaper!');
|
||
|
}
|
||
|
this.reapable = false;
|
||
|
}
|
||
|
|
||
|
// Is the position valid?
|
||
|
if ((data.validposition == 1) && (this.reapable == false)) {
|
||
|
this.vPosition = true;
|
||
|
|
||
|
// Detech if the plane has moved
|
||
|
changeLat = false;
|
||
|
changeLon = false;
|
||
|
changeAlt = false;
|
||
|
if (oldlat != this.latitude) {
|
||
|
changeLat = true;
|
||
|
}
|
||
|
if (oldlon != this.longitude) {
|
||
|
changeLon = true;
|
||
|
}
|
||
|
if (oldalt != this.altitude) {
|
||
|
changeAlt = true;
|
||
|
}
|
||
|
// Right now we only care about lat/long, if alt is updated only, oh well
|
||
|
if ((changeLat == true) || (changeLon == true)) {
|
||
|
this.funcAddToTrack();
|
||
|
if (this.is_selected) {
|
||
|
this.line = this.funcUpdateLines();
|
||
|
}
|
||
|
}
|
||
|
this.marker = this.funcUpdateMarker();
|
||
|
PlanesOnMap++;
|
||
|
} else {
|
||
|
this.vPosition = false;
|
||
|
}
|
||
|
|
||
|
// Do we have a valid track for the plane?
|
||
|
if (data.validtrack == 1)
|
||
|
this.vTrack = true;
|
||
|
else
|
||
|
this.vTrack = false;
|
||
|
},
|
||
|
|
||
|
// Update our marker on the map
|
||
|
funcUpdateMarker: function() {
|
||
|
if (this.marker) {
|
||
|
this.marker.setPosition(new google.maps.LatLng(this.latitude, this.longitude));
|
||
|
this.marker.setIcon(this.funcGetIcon());
|
||
|
} else {
|
||
|
this.marker = new google.maps.Marker({
|
||
|
position: new google.maps.LatLng(this.latitude, this.longitude),
|
||
|
map: GoogleMap,
|
||
|
icon: this.funcGetIcon(),
|
||
|
visable: true,
|
||
|
});
|
||
|
|
||
|
// This is so we can match icao address
|
||
|
this.marker.icao = this.icao;
|
||
|
|
||
|
// Trap clicks for this marker.
|
||
|
google.maps.event.addListener(this.marker, 'click', this.funcSelectPlane);
|
||
|
}
|
||
|
|
||
|
// Setting the marker title
|
||
|
if (this.flight.length == 0) {
|
||
|
this.marker.setTitle(this.hex);
|
||
|
} else {
|
||
|
this.marker.setTitle(this.flight+' ('+this.icao+')');
|
||
|
}
|
||
|
return this.marker;
|
||
|
},
|
||
|
|
||
|
// Update our planes tail line,
|
||
|
// TODO: Make this multi colored based on options
|
||
|
// altitude (default) or speed
|
||
|
funcUpdateLines: function() {
|
||
|
if (this.line) {
|
||
|
var path = this.line.getPath();
|
||
|
path.push(new google.maps.LatLng(this.latitude, this.longitude));
|
||
|
} else {
|
||
|
console.log("Starting new line");
|
||
|
this.line = new google.maps.Polyline({
|
||
|
strokeColor: '#000000',
|
||
|
strokeOpacity: 1.0,
|
||
|
strokeWeight: 3,
|
||
|
map: GoogleMap,
|
||
|
path: this.trackline,
|
||
|
});
|
||
|
}
|
||
|
return this.line;
|
||
|
},
|
||
|
};
|