/* * 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 += "
" + 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; }