From eebf8a083f9be6a6a531378a12c069ab3c8aaff0 Mon Sep 17 00:00:00 2001 From: Matthias Wirth Date: Mon, 3 May 2021 08:20:37 +0200 Subject: [PATCH] improve timer handling --- html/early.js | 54 ++++++++++++++ html/planeObject.js | 12 --- html/script.js | 175 ++++++++++++++++++++++++-------------------- 3 files changed, 151 insertions(+), 90 deletions(-) diff --git a/html/early.js b/html/early.js index 4093838..4205daa 100644 --- a/html/early.js +++ b/html/early.js @@ -489,3 +489,57 @@ Toggle.prototype.hideCheckbox = function () { if (this.checkbox) jQuery(this.checkbox).parent().hide(); } + +// From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys +if (!Object.keys) { + Object.keys = (function() { + 'use strict'; + var hasOwnProperty = Object.prototype.hasOwnProperty, + hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'), + dontEnums = [ + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' + ], + dontEnumsLength = dontEnums.length; + + return function(obj) { + if (typeof obj !== 'function' && (typeof obj !== 'object' || obj === null)) { + throw new TypeError('Object.keys called on non-object'); + } + + var result = [], prop, i; + + for (prop in obj) { + if (hasOwnProperty.call(obj, prop)) { + result.push(prop); + } + } + + if (hasDontEnumBug) { + for (i = 0; i < dontEnumsLength; i++) { + if (hasOwnProperty.call(obj, dontEnums[i])) { + result.push(dontEnums[i]); + } + } + } + return result; + }; + }()); +} + +if (!Object.entries) { + Object.entries = function( obj ){ + var ownProps = Object.keys( obj ), + i = ownProps.length, + resArray = new Array(i); // preallocate the Array + while (i--) + resArray[i] = [ownProps[i], obj[ownProps[i]]]; + + return resArray; + }; +} diff --git a/html/planeObject.js b/html/planeObject.js index 002bcce..5facb15 100644 --- a/html/planeObject.js +++ b/html/planeObject.js @@ -2358,18 +2358,6 @@ PlaneObject.prototype.cross180 = function(on_ground, is_leg) { PlaneObject.prototype.dataChanged = function() { this.refreshTR = true; - if (tabHidden) - return; - - if (this.selected) { - this.checkVisible(); - refreshSelected(); - } - - if (this == HighlightedPlane) { - this.checkVisible(); - refreshHighlighted(); - } } PlaneObject.prototype.isNonIcao = function() { diff --git a/html/script.js b/html/script.js index 7657d86..ec7ca8c 100644 --- a/html/script.js +++ b/html/script.js @@ -37,8 +37,6 @@ let noPan = false; let loadFinished = false; let mapResizeTimeout; let pointerMoveTimeout; -let checkMoveTimer; -let everySecondTimer; let iconSize = 1; let debugTracks = false; let debugAll = false; @@ -693,11 +691,6 @@ function initPage() { }, 30000); } - if ((adsbexchange || dynGlobeRate) && !uuid) { - setInterval(globeRateUpdate, 180000); - globeRateUpdate(); - } - if (localStorage['enableLabels'] == 'true'){ toggleLabels(); } @@ -834,18 +827,12 @@ function initPage() { jQuery('#groundvehicle_filter').on('click', function() { filterGroundVehicles(true); - refreshSelected(); - refreshHighlighted(); - TAR.planeMan.refresh(); - mapRefresh(); + refresh(); }); jQuery('#blockedmlat_filter').on('click', function() { filterBlockedMLAT(true); - refreshSelected(); - refreshHighlighted(); - TAR.planeMan.refresh(); - mapRefresh(); + refresh(); }); jQuery('#grouptype_checkbox').on('click', function() { @@ -1270,6 +1257,35 @@ function parseHistory() { historyLoaded.resolve(); } +let timers = {}; +function clearIntervalTimers() { + const entries = Object.entries(timers); + for (let i in entries) { + clearInterval(entries[i][1]); + } +} + +function setIntervalTimers() { + timers.checkMove = setInterval(checkMovement, 50); + timers.everySecond = setInterval(everySecond, 850); + timers.reaper = setInterval(reaper, 20000); + if (tempTrails) { + window.setInterval(trailReaper, 10000); + trailReaper(now); + } + if (enable_pf_data && !ptracks && !globeIndex) { + jQuery('#pf_info_contianer').removeClass('hidden'); + window.setInterval(fetchPfData, RefreshInterval*10.314); + fetchPfData(); + } + if ((adsbexchange || dynGlobeRate) && !uuid) { + timers.globeRateUpdate = setInterval(globeRateUpdate, 180000); + globeRateUpdate(); + } + +} + + function startPage() { console.log("Completing init"); @@ -1292,16 +1308,6 @@ function startPage() { jQuery('.ol-attribution').show(); } - // Setup our timer to poll from the server. - window.setInterval(reaper, 20000); - if (tempTrails) { - window.setInterval(trailReaper, 10000); - trailReaper(now); - } - if (enable_pf_data) { - jQuery('#pf_info_contianer').removeClass('hidden'); - window.setInterval(fetchPfData, RefreshInterval*10.314); - } pathName = window.location.pathname; processURLParams(); @@ -1311,11 +1317,8 @@ function startPage() { changeZoom("init"); changeCenter("init"); - clearInterval(checkMoveTimer); - checkMoveTimer = setInterval(checkMovement, 50); - - clearInterval(everySecondTimer); - everySecondTimer = setInterval(everySecond, 850); + clearIntervalTimers(); + setIntervalTimers(); loadFinished = true; @@ -2233,7 +2236,6 @@ let selReg = null; // Refresh the detail window about the plane function refreshSelected() { - buttonActive('#F', FollowSelected); if (!SelectedPlane) { @@ -2242,6 +2244,7 @@ function refreshSelected() { } const selected = SelectedPlane; + selected.checkVisible(); selected.checkForDB(); refreshPhoto(selected); @@ -2593,6 +2596,8 @@ function refreshHighlighted() { return; } + highlighted.checkVisible(); + jQuery('#highlighted_infoblock').show(); let infoBox = jQuery('#highlighted_infoblock'); @@ -4074,7 +4079,8 @@ function toggleLayer(element, layer) { } function fetchPfData() { - if (fetchingPf || pTracks || tabHidden) + console.trace(); + if (fetchingPf) return; fetchingPf = true; for (let i in pf_data) { @@ -4186,10 +4192,10 @@ function setGlobalScale(scale, init) { checkScale(); setLineWidth(); if (!init) { - refreshFeatures(); - refreshSelected(); - refreshHighlighted(); - remakeTrails(); + refreshFeatures(); + refreshSelected(); + refreshHighlighted(); + remakeTrails(); } } @@ -4268,36 +4274,55 @@ function checkMovement() { fetchData(); } +function getZoom() { + return OLMap.getView().getZoom(); +} + +function getCenter() { + return ol.proj.toLonLat(OLMap.getView().getCenter()); +} + let lastRefresh = 0; -let refreshZoom, refreshLat, refreshLon; +let refreshZoom, refreshCenter; function checkRefresh() { - const center = ol.proj.toLonLat(OLMap.getView().getCenter()); - const zoom = OLMap.getView().getZoom(); if (showTrace) return; - - if (triggerRefresh || zoom != refreshZoom || center[0] != refreshLon || center[1] != refreshLat) { - + if (triggerRefresh) { + refresh(); + return; + } + const center = getCenter(); + const zoom = getZoom(); + if (zoom != refreshZoom || !refreshCenter || center[0] != refreshCenter[0] || center[1] != refreshCenter[1]) { const ts = new Date().getTime(); const elapsed = Math.abs(ts - lastRefresh); let num = Math.min(1500, Math.max(250, TrackedAircraftPositions / 300 * 250)); - if (elapsed < num) { - return; + if (elapsed > num) { + refresh(); } - lastRefresh = ts; - - refreshZoom = zoom; - refreshLat = center[1]; - refreshLon = center[0]; - - //console.time("refreshTable"); - TAR.planeMan.refresh(); - //console.timeEnd("refreshTable"); - mapRefresh(); - - triggerRefresh = 0; } } +function refresh() { + lastRefresh = new Date().getTime(); + + refreshZoom = getZoom(); + refreshCenter = getCenter(); + + //console.time("refreshTable"); + TAR.planeMan.refresh(); + //console.timeEnd("refreshTable"); + mapRefresh(); + + triggerRefresh = 0; + + if (SelectedPlane) { + refreshSelected(); + } + if (HighlightedPlane) { + refreshHighlighted(); + } +} + function mapRefresh(redraw) { if (!mapIsVisible || heatmap) return; @@ -5339,13 +5364,9 @@ function checkFollow() { } function everySecond() { - decrementTraceRate(); - updateIconCache(); -} - -function decrementTraceRate() { if (traceRate > 0) traceRate = traceRate * 0.985 - 1; + updateIconCache(); } function getTrace(newPlane, hex, options) { @@ -6104,32 +6125,30 @@ function handleVisibilityChange() { tabHidden = false; if (tabHidden) { - clearInterval(checkMoveTimer); - clearInterval(everySecondTimer); - if (!globeIndex) - checkMoveTimer = setInterval(fetchData, Math.max(RefreshInterval, 5000)); + clearIntervalTimers(); + if (!globeIndex) { + timers.checkMove = setInterval(fetchData, Math.max(RefreshInterval, 5000)); + timers.reaper = setInterval(reaper, 60000); + } } // tab is no longer hidden if (!tabHidden && prevHidden) { - clearInterval(checkMoveTimer); - clearInterval(everySecondTimer); - checkMoveTimer = setInterval(checkMovement, 50); - everySecondTimer = setInterval(everySecond, 850); - refreshHighlighted(); - refreshSelected(); + + clearIntervalTimers(); + setIntervalTimers(); + active(); - checkMovement(); - triggerRefresh = 1; - checkRefresh(); + reaper(); + + refresh(); + fetchData(); if (showTrace) return; if (heatmap) return; - reaper(); - if (!globeIndex) return; @@ -6173,12 +6192,12 @@ function initVisibilityChange() { handleVisibilityChange(); } // for debugging visibilitychange: -function hidePage() { +function testHide() { Object.defineProperty(window.document,'hidden',{get:function(){return true;},configurable:true}); Object.defineProperty(window.document,'visibilityState',{get:function(){return 'hidden';},configurable:true}); window.document.dispatchEvent(new Event('visibilitychange')); } -function unhidePage() { +function testUnhide() { Object.defineProperty(window.document,'hidden',{get:function(){return false;},configurable:true}); Object.defineProperty(window.document,'visibilityState',{get:function(){return 'visible';},configurable:true}); window.document.dispatchEvent(new Event('visibilitychange'));