cusf-standalone-predictor/predict/js/pred.js

283 wiersze
9.5 KiB
JavaScript

/*
* CUSF Landing Prediction Version 2
* Jon Sowman 2010
* jon@hexoc.com
* http://www.hexoc.com
*
* http://github.com/jonsowman/cusf-standalone-predictor
*
*/
$(document).ready(function() {
// do nothing
});
function predSub() {
appendDebug(null, 1); // clear debug window
appendDebug("Sending data to server...");
// initialise progress bar
$("#prediction_progress").progressbar({ value: 0 });
$("#prediction_status").html("Sending data to server...");
$("#status_message").fadeIn(250);
}
function populateFormByUUID(pred_uuid) {
$.get("ajax.php", { "action":"getModelByUUID", "uuid":pred_uuid }, function(data) {
if ( !data.valid ) {
appendDebug("Populating form by UUID failed");
appendDebug("The server said the model it made was invalid");
} else {
// we're good to go, populate the form
alert(data);
}
}, 'json');
}
function handlePred(pred_uuid) {
$("#prediction_status").html("Searching for wind data...");
$("#input_form").hide("slide", { direction: "down" }, 500);
$("#scenario_info").hide("slide", { direction: "up" }, 500);
$("#map_canvas").fadeTo(1000, 0.2);
// ajax to poll for progress
ajaxEventHandle = setInterval("getJSONProgress('"+pred_uuid+"')", 2000);
//getCSV(pred_uuid);
}
function getCSV(pred_uuid) {
$.get("ajax.php", { "action":"getCSV", "uuid":pred_uuid }, function(data) {
appendDebug("Got JSON response from server for flight path, parsing...");
if (parseCSV(data) ) {
appendDebug("Parsing function returned successfully.");
appendDebug("Done, AJAX functions quitting.");
} else {
appendDebug("The parsing function failed.");
}
}, 'json');
}
function getJSONProgress(pred_uuid) {
$.ajax({
url:"preds/"+pred_uuid+"/progress.json",
dataType:'json',
timeout: 500,
// complete: function(data, httpstatus) {
// appendDebug(httpstatus);
// },
success: processProgress
});
}
function processProgress(progress) {
if ( progress['error'] ) {
clearInterval(ajaxEventHandle);
appendDebug("There was an error in running the prediction: "+progress['error']);
} else {
// get the progress of the wind data
if ( progress['gfs_complete'] == true ) {
if ( progress['pred_complete'] == true ) { // pred has finished
$("#prediction_status").html("Prediction finished.");
$("#status_message").fadeOut(500);
// now clear the status window
$("#prediction_status").html("");
$("#prediction_progress").progressbar("options", "value", 0);
$("#prediction_percent").html("");
// bring the input form back up
$("#input_form").show("slide", { direction: "down" }, 500);
$("#scenario_info").show("slide", { direction: "up" }, 500);
toggleWindow("scenario_template", "showHideDebug", "Show Debug",
"Hide Debug", "hide");
// un-fade the map canvas
$("#map_canvas").fadeTo(1500, 1);
appendDebug("Server says: the predictor finished running.");
appendDebug("Attemping to retrieve flight path from server");
// stop polling for JSON
clearInterval(ajaxEventHandle);
// parse the data
getCSV(current_uuid);
} else if ( progress['pred_running'] != true ) {
$("#prediction_status").html("Waiting for predictor to run...");
appendDebug("Server says: predictor not yet running...");
} else if ( progress['pred_running'] == true ) {
$("#prediction_status").html("Predictor running...");
appendDebug("Server says: predictor currently running");
}
} else {
$("#prediction_status").html("Downloading wind data");
$("#prediction_progress").progressbar("option", "value",
progress['gfs_percent']);
$("#prediction_percent").html(progress['gfs_percent'] +
"% - Estimated time remaining: " + progress['gfs_timeremaining']);
appendDebug("Server says: downloaded " +
progress['gfs_percent'] + "% of GFS files");
}
}
return true;
}
function parseCSV(lines) {
if(lines.length <= 0) {
appendDebug("The server returned an empty CSV file");
return false;
}
var path = [];
var max_height = -10; //just any -ve number
var max_point = null;
var launch_pt;
var land_pt;
$.each(lines, function(idx, line) {
entry = line.split(',');
if(entry.length >= 4) { // check valid entry length
var point = new google.maps.LatLng( parseFloat(entry[1]), parseFloat(entry[2]) );
if ( idx == 0 ) { // get the launch lat/long for marker
var launch_lat = entry[1];
var launch_lon = entry[2];
launch_pt = point;
}
// set on every iteration, last valid entry
// gives landing position
var land_lat = entry[1];
var land_lon = entry[2];
land_pt = point;
if(parseFloat(entry[3]) > max_height) {
max_height = parseFloat(entry[3]);
max_point = point;
}
path.push(point);
}
});
appendDebug("Flight data parsed, creating map plot...");
clearMapItems();
// make some nice icons
var launch_icon = new google.maps.MarkerImage(launch_img,
new google.maps.Size(16,16),
new google.maps.Point(0, 0),
new google.maps.Point(8, 8)
);
var land_icon = new google.maps.MarkerImage(land_img,
new google.maps.Size(16,16),
new google.maps.Point(0, 0),
new google.maps.Point(8, 8)
);
var launch_marker = new google.maps.Marker({
position: launch_pt,
map: map,
icon: launch_icon,
title: 'Balloon launch'
});
var land_marker = new google.maps.Marker({
position: land_pt,
map:map,
icon: land_icon,
title: 'Predicted Landing'
});
var path_polyline = new google.maps.Polyline({
path:path,
map: map,
strokeColor: '#000000',
strokeWeight: 3,
strokeOpacity: 0.75
});
var pop_marker = new google.maps.Marker({
position: max_point,
map: map,
icon: burst_img,
title: 'Balloon burst (max. altitude: ' + max_height + 'm)',
});
// now add the launch/land markers to map
map_items.push(launch_marker);
map_items.push(land_marker);
map_items.push(pop_marker);
map_items.push(path_polyline);
return true;
}
function clearMapItems() {
if(map_items.length > 0) {
appendDebug("Clearing previous map trace");
for(i in map_items) {
map_items[i].setMap(null);
}
}
map_items = [];
}
function appendDebug(appendage, clear) {
if ( clear == null ){
var curr = $("#debuginfo").html();
curr += "<br>" + appendage;
$("#debuginfo").html(curr);
} else {
$("#debuginfo").html("");
}
// keep the debug window scrolled to bottom
$("#scenario_template").animate({scrollTop: $('#scenario_template')[0].scrollHeight});
}
function toggleWindow(window_name, linker, onhide, onshow, force) {
if ( force == null ) {
if( $("#"+window_name).css('display') != "none" ){
$("#"+window_name+"").hide("slide", { direction: "down" }, 500);
$("#"+linker).html(onhide);
} else {
$("#"+window_name).show("slide", { direction: "down" }, 500);
$("#"+linker).html(onshow);
}
} else if ( force == "hide" ) {
$("#"+window_name+"").hide("slide", { direction: "down" }, 500);
$("#"+linker).html(onhide);
} else if ( force == "show") {
$("#"+window_name).show("slide", { direction: "down" }, 500);
$("#"+linker).html(onshow);
} else {
appendDebug("toggleWindow force parameter unrecognised");
}
}
// launch site dropdown switcher
function UpdateLaunchSite(id) {
txtLat = document.getElementById("lat");
txtLon = document.getElementById("lon");
switch (id) {
case 0: // Churchill
txtLat.value = "52.2135";
txtLon.value = "0.0964";
break;
case 1: // EARS
txtLat.value = "52.2511";
txtLon.value = "-0.0927";
break;
case 2: // Glenrothes (SpeedEvil)
txtLat.value = "56.13";
txtLon.value = "-3.06";
break;
case 3: // Bujaraloz, Monegros (gerard)
txtLat.value = "41.495773";
txtLon.value = "-0.157968";
break;
case 4: // Adelaide (Juxta)
txtLat.value = "-34.9499";
txtLon.value = "138.5194";
}
}
function SetSiteOther() {
optOther = document.getElementById("other");
//cmbSite = document.getElementById("site");
//cmbSite.selectedIndex = 1;
optOther.selected = true;
}