From 01b67626e5fecef2d01bd145d0ac3f82463973bc Mon Sep 17 00:00:00 2001 From: Matthias Wirth Date: Sat, 1 May 2021 09:12:42 +0200 Subject: [PATCH] make globe data loading more consistent --- html/early.js | 63 ----------------------- html/script.js | 133 ++++++++++++++++++++++++++++++++++--------------- 2 files changed, 92 insertions(+), 104 deletions(-) diff --git a/html/early.js b/html/early.js index d5d1c6e..4093838 100644 --- a/html/early.js +++ b/html/early.js @@ -489,66 +489,3 @@ Toggle.prototype.hideCheckbox = function () { if (this.checkbox) jQuery(this.checkbox).parent().hide(); } - -// Set the name of the hidden property and the change event for visibility -let hidden, visibilityChange; -if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support - hidden = "hidden"; - visibilityChange = "visibilitychange"; -} else if (typeof document.msHidden !== "undefined") { - hidden = "msHidden"; - visibilityChange = "msvisibilitychange"; -} else if (typeof document.webkitHidden !== "undefined") { - hidden = "webkitHidden"; - visibilityChange = "webkitvisibilitychange"; -} -let tabHidden = false; - -function handleVisibilityChange() { - const prevHidden = tabHidden; - if (document[hidden]) - tabHidden = true; - else - tabHidden = false; - - // tab is no longer hidden - if (!tabHidden && prevHidden) { - refreshHighlighted(); - refreshSelected(); - active(); - checkMovement(); - triggerRefresh = 1; - checkRefresh(); - - if (showTrace) - return; - if (!globeIndex) - return; - if (heatmap) - return; - - reaper(); - - let count = 0; - if (multiSelect && !SelectedAllPlanes) { - for (let i = 0; i < PlanesOrdered.length; ++i) { - let plane = PlanesOrdered[i]; - if (plane.selected) { - getTrace(plane, plane.icao, {}); - if (count++ > 20) - break; - } - } - } else if (SelectedPlane) { - getTrace(SelectedPlane, SelectedPlane.icao, {}); - } - } -} - -// Warn if the browser doesn't support addEventListener or the Page Visibility API -if (typeof document.addEventListener === "undefined" || hidden === undefined) { - console.log("hidden tab handler requires a browser that supports the Page Visibility API."); -} else { - // Handle page visibility change - document.addEventListener(visibilityChange, handleVisibilityChange, false); -} diff --git a/html/script.js b/html/script.js index a9d81c4..d8ef670 100644 --- a/html/script.js +++ b/html/script.js @@ -5,6 +5,7 @@ "use strict"; // Define our global variables +let tabHidden = false; let webgl = false; let webglFeatures = new ol.source.Vector(); let webglLayer; @@ -36,6 +37,8 @@ let noPan = false; let loadFinished = false; let mapResizeTimeout; let pointerMoveTimeout; +let checkMoveTimer; +let everySecondTimer; let iconSize = 1; let debugTracks = false; let debugAll = false; @@ -64,7 +67,6 @@ let globeIndexDist = {}; let globeIndexSpecialLookup = {}; let globeTilesViewCount = 0; let globeSimLoad = 6; -let globeUseBigMil = false; let globeTableLimitBase = 80; let globeTableLimit = 80; let fetchCounter = 0; @@ -259,24 +261,17 @@ function processReceiverUpdate(data, init) { processAircraft(data.aircraft[j], init, uat); } -let nextFetch = 0; -function fetchSoon() { - clearTimeout(refreshId); - refreshId = setTimeout(fetchData, refreshInt()); - nextFetch = new Date().getTime() + refreshInt(); -} - function fetchData(options) { options = options || {}; if (heatmap || replay || showTrace || pTracks) return; - fetchSoon(); - //console.log("fetch"); let currentTime = new Date().getTime(); + if (!options.force && (currentTime - lastFetch < refreshInt() || pendingFetches > 0)) { return; } lastFetch = currentTime; + //console.log(currentTime/1000); FetchPending = []; if (FetchPendingUAT != null) { @@ -327,11 +322,9 @@ function fetchData(options) { return (globeIndexNow[x] - globeIndexNow[y]); }); - if (binCraft && onlyMilitary && indexes.length > 12) { + if (binCraft && onlyMilitary && ZoomLvl < 5.5) { ac_url.push('data/globeMil_42777.binCraft'); - globeUseBigMil = true; } else { - globeUseBigMil = false; indexes = indexes.slice(0, globeSimLoad); @@ -348,13 +341,6 @@ function fetchData(options) { pendingFetches = ac_url.length; fetchCounter += pendingFetches; - if (globeIndex) { - fetchSoon(); - } else { - jQuery("#lastLeg_cb").parent().hide(); - } - - for (let i in ac_url) { //console.log(ac_url[i]); let req; @@ -404,9 +390,6 @@ function fetchData(options) { } if (pendingFetches <= 1) { - if (globeIndex) - clearTimeout(refreshId); - triggerRefresh++; if (firstFetch) { firstFetch = false; @@ -429,9 +412,6 @@ function fetchData(options) { checkRefresh(); } checkMovement(); - - if (globeIndex) - fetchSoon(); } pendingFetches--; @@ -461,8 +441,6 @@ function fetchData(options) { StaleReceiverCount++; } pendingFetches--; - if (globeIndex) - fetchSoon(); }); } } @@ -1293,6 +1271,7 @@ function startPage() { console.log("Completing init"); if (!globeIndex) { + jQuery("#lastLeg_cb").parent().hide(); jQuery('#show_trace').hide(); } if (globeIndex) { @@ -1320,8 +1299,6 @@ function startPage() { jQuery('#pf_info_contianer').removeClass('hidden'); window.setInterval(fetchPfData, RefreshInterval*10.314); } - setInterval(everySecond, 850); - pathName = window.location.pathname; processURLParams(); @@ -1334,8 +1311,11 @@ function startPage() { changeZoom("init"); changeCenter("init"); - setInterval(checkMovement, 50); + clearInterval(checkMoveTimer); + checkMoveTimer = setInterval(checkMovement, 50); + clearInterval(everySecondTimer); + everySecondTimer = setInterval(everySecond, 850); loadFinished = true; @@ -1357,7 +1337,7 @@ function startPage() { drawHeatmap(); } - handleVisibilityChange(); + initVisibilityChange(); if (pTracks) setTimeout(TAR.planeMan.refresh, 10000); @@ -3410,7 +3390,6 @@ function expandSidebar(e) { jQuery("#shrink_sidebar_button").show(); jQuery("#sidebar_container").width("100%"); TAR.planeMan.redraw(); - clearTimeout(refreshId); fetchData(); updateMapSize(); adjustInfoBlock(); @@ -3424,7 +3403,6 @@ function showMap() { jQuery("#splitter").show(); jQuery("#shrink_sidebar_button").hide(); TAR.planeMan.redraw(); - clearTimeout(refreshId); fetchData(); updateMapSize(); } @@ -3630,6 +3608,9 @@ function toggleMilitary() { buttonActive('#U', onlyMilitary); refreshFilter(); + active(); + if (onlyMilitary) + fetchData({force: true}); } function togglePersistence() { @@ -4286,6 +4267,8 @@ function checkMovement() { if (elapsed > 500 || (!onMobile && elapsed > 45)) { checkRefresh(); } + + fetchData(); } let lastRefresh = 0; @@ -4866,8 +4849,9 @@ function refreshInt() { if (tabHidden) return 24 * 3600 * 1000; // hidden tab, don't refresh to avoid freeze when the tab is switched to again. - if (globeUseBigMil) - refresh = 10000; + if (binCraft && onlyMilitary && OLMap.getView().getZoom() < 5.5) { + refresh = 8000; + } let inactive = getInactive(); @@ -5847,7 +5831,6 @@ function initReplay(data) { replay.pointsU = pointsU; replay.pointsU8 = pointsU8; - clearTimeout(refreshId); reaper(true); refreshFilter(); @@ -6004,10 +5987,6 @@ function getInactive() { function active() { let now = new Date().getTime(); - // avoid long periods of not fetching data for active users or returning users - if (now - lastActive > 90 * 1000 || nextFetch - lastFetch > 1.5 * refreshInt()) { - fetchData({force: true}); - } lastActive = now; } @@ -6133,4 +6112,76 @@ function isDarkModeEnabled() { return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches } +function handleVisibilityChange() { + const prevHidden = tabHidden; + if (document[hideName]) + tabHidden = true; + else + tabHidden = false; + + if (tabHidden) { + clearInterval(checkMoveTimer); + clearInterval(everySecondTimer); + } + + // tab is no longer hidden + if (!tabHidden && prevHidden) { + checkMoveTimer = setInterval(checkMovement, 50); + everySecondTimer = setInterval(everySecond, 850); + refreshHighlighted(); + refreshSelected(); + active(); + checkMovement(); + triggerRefresh = 1; + checkRefresh(); + + if (showTrace) + return; + if (!globeIndex) + return; + if (heatmap) + return; + + reaper(); + + let count = 0; + if (multiSelect && !SelectedAllPlanes) { + for (let i = 0; i < PlanesOrdered.length; ++i) { + let plane = PlanesOrdered[i]; + if (plane.selected) { + getTrace(plane, plane.icao, {}); + if (count++ > 20) + break; + } + } + } else if (SelectedPlane) { + getTrace(SelectedPlane, SelectedPlane.icao, {}); + } + } +} + +let hideName; +function initVisibilityChange() { + // Set the name of the hidden property and the change event for visibility + let visibilityChange; + if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support + hideName = "hidden"; + visibilityChange = "visibilitychange"; + } else if (typeof document.msHidden !== "undefined") { + hideName = "msHidden"; + visibilityChange = "msvisibilitychange"; + } else if (typeof document.webkitHidden !== "undefined") { + hideName = "webkitHidden"; + visibilityChange = "webkitvisibilitychange"; + } + // Warn if the browser doesn't support addEventListener or the Page Visibility API + if (typeof document.addEventListener === "undefined" || hideName === undefined) { + console.log("hidden tab handler requires a browser that supports the Page Visibility API."); + } else { + // Handle page visibility change + document.addEventListener(visibilityChange, handleVisibilityChange, false); + } + handleVisibilityChange(); +} + initialize();