diff --git a/package.nw/gt_roster.html b/package.nw/gt_roster.html index 4d1e4b4f..6d8ef7d7 100644 --- a/package.nw/gt_roster.html +++ b/package.nw/gt_roster.html @@ -172,7 +172,7 @@
-
+
diff --git a/package.nw/lib/pota.js b/package.nw/lib/pota.js index ef4d11a1..d520aa1b 100644 --- a/package.nw/lib/pota.js +++ b/package.nw/lib/pota.js @@ -12,20 +12,24 @@ var g_pota = { callSpots: {}, parkSpots: {}, spotsTimeout: null, - mapParks: {} + mapParks: {}, + rbnReportTimes: {}, + rbnFrequency: 600000 }; var g_spotTemplate = { activator: "", frequency: 0, mode: "", + band: "", reference: "", spotTime: 0, spotter: "", comments: "", source: "GT", count: 1, - rbn: false + activatorGrid: "", + spotterGrid: "" }; var g_parkTemplate = { @@ -70,6 +74,7 @@ function togglePota() g_layerSources.pota.clear(); g_pota.mapParks = {}; } + goProcessRoster(); } function redrawParks() @@ -92,10 +97,9 @@ function makeParkFeatures() if (park in g_pota.parks) { let parkObj = Object.assign({}, g_parkTemplate); - - for (const i in g_pota.parkSpots[park]) + for (const call in g_pota.parkSpots[park]) { - let report = g_pota.parkSpots[park][i]; + let report = g_pota.parkSpots[park][call]; if (parkObj.feature == null && validateMapBandAndMode(report.band, report.mode)) { parkObj.feature = iconFeature(ol.proj.fromLonLat([Number(g_pota.parks[park].longitude), Number(g_pota.parks[park].latitude)]), g_gtParkIconActive, 1); @@ -104,7 +108,6 @@ function makeParkFeatures() g_pota.mapParks[park] = parkObj; g_layerSources.pota.addFeature(parkObj.feature); - break; } } } @@ -117,23 +120,8 @@ function makeParkFeatures() } } -var g_potaSpotRedrawTimer = null; - -function redrawParkSpotsOnTimeout() -{ - if (g_potaSpotRedrawTimer != null) - { - clearTimeout(g_potaSpotRedrawTimer); - g_potaSpotRedrawTimer = null; - } - - g_potaSpotRedrawTimer = setTimeout(redrawParks, 250); -} - function potaSpotFromDecode(callObj) { - let hash = callObj.DEcall + callObj.band + callObj.mode; - for (const i in callObj.pota) { let park = callObj.pota[i]; @@ -153,33 +141,27 @@ function potaSpotFromDecode(callObj) if (!(park in g_pota.parkSpots)) { g_pota.parkSpots[park] = {}; - - let newSpot = spotFromCallObj(callObj, park); - g_pota.parkSpots[park][hash] = newSpot; - redrawParkSpotsOnTimeout(); + g_pota.parkSpots[park][callObj.DEcall] = spotFromCallObj(callObj, park, 0, 0); } - else if (!(hash in g_pota.parkSpots[park])) + else if (!(callObj.DEcall in g_pota.parkSpots[park])) { - let newSpot = spotFromCallObj(callObj, park); - g_pota.parkSpots[park][hash] = newSpot; - redrawParkSpotsOnTimeout(); + g_pota.parkSpots[park][callObj.DEcall] = spotFromCallObj(callObj, park, 0, 0); } else { // update spot - if (!g_pota.parkSpots[park][hash].rbn) - { - g_pota.parkSpots[park][hash].count++; - g_pota.parkSpots[park][hash].spotter = myDEcall; - g_pota.parkSpots[park][hash].spotTime = Date.now(); - g_pota.parkSpots[park][hash].source = "GT"; - g_pota.parkSpots[park][hash].comments = "RBN " + callObj.RSTsent + " dB " + myDEGrid; - } + g_pota.parkSpots[park][callObj.DEcall] = spotFromCallObj(callObj, park, g_pota.parkSpots[park][callObj.DEcall].count); } - if (!g_pota.parkSpots[park][hash].rbn) + + // may or may not be on screen, so try + addParkSpotFeature(park, g_pota.parkSpots[park][callObj.DEcall]); + + let hash = park+callObj.DEcall; + + if (!(hash in g_pota.rbnReportTimes) || Date.now() > g_pota.rbnReportTimes[hash]) { - g_pota.parkSpots[park][hash].rbn = true; - reportPotaRBN(g_pota.parkSpots[park][hash]); + g_pota.rbnReportTimes[hash] = Date.now() + g_pota.rbnFrequency; + reportPotaRBN(g_pota.parkSpots[park][callObj.DEcall]); } } } @@ -193,17 +175,17 @@ function reportPotaRBN(callSpot) reference: callSpot.reference, mode: callSpot.mode, source: "GT", - comments: callSpot.comments + comments: callSpot.comments, + activatorGrid: callSpot.activatorGrid, + spotterGrid: callSpot.spotterGrid } - - // console.log(report); - + getPostJSONBuffer( "https://api.pota.app/spot", rbnReportResult, null, "https", - 80, + 443, report, 10000, null, @@ -214,28 +196,29 @@ function reportPotaRBN(callSpot) function rbnReportResult(buffer, flag, cookies) { // It worked, but do we take these spots? - // console.log(String(buffer)); + //console.log(String(buffer)); } -function spotFromCallObj(callObj, park) +function spotFromCallObj(callObj, park, inCount, rbnTime) { let callSpot = { activator: callObj.DEcall, + activatorGrid: callObj.grid, spotter: myDEcall, + spotterGrid: myDEGrid, frequency: Number((g_instances[callObj.instance].status.Frequency / 1000000).toFixed(3)), reference: park, mode: callObj.mode, band: callObj.band, spotTime: Date.now(), source: "GT", - count: 1, - rbn: false, + count: inCount+1, comments: "RBN " + callObj.RSTsent + " dB " + myDEGrid }; return callSpot; } -function addParkSpotFeature(park) +function addParkSpotFeature(park, report) { let parkObj = Object.assign({}, g_parkTemplate); if (park in g_pota.mapParks) @@ -361,11 +344,20 @@ function processPotaSpots(buffer) newSpot.spotTime = Date.parse(newSpot.spotTime + "Z"); newSpot.frequency = parseInt(newSpot.frequency) / 1000; newSpot.band = newSpot.frequency.formatBand(); - (g_pota.callSpots[newSpot.activator] = g_pota.callSpots[newSpot.activator] || []).push(newSpot.reference); - - let hash = newSpot.activator + newSpot.band + newSpot.mode; - (g_pota.parkSpots[newSpot.reference] = g_pota.parkSpots[newSpot.reference] || {})[hash] = newSpot; + + if(!(newSpot.reference in g_pota.parkSpots)) + { + g_pota.parkSpots[newSpot.reference] = {}; + } + if (newSpot.activator in g_pota.parkSpots[newSpot.reference]) + { + g_pota.parkSpots[newSpot.reference][newSpot.activator] = fillObjectFromTemplate(g_pota.parkSpots[newSpot.reference][newSpot.activator], newSpot); + } + else + { + g_pota.parkSpots[newSpot.reference][newSpot.activator] = newSpot; + } } else { @@ -378,6 +370,7 @@ function processPotaSpots(buffer) { g_pota.callSpots[spot] = uniqueArrayFromArray(g_pota.callSpots[spot]); } + redrawParks(); } catch (e) @@ -482,11 +475,6 @@ function getPotaSchedule() g_pota.scheduleTimeout = setTimeout(getPotaSchedule, 900000); } -function sendPotaSpot() -{ - // if Pota spotting enabled, and we have enough info, send a spot to Pota -} - var g_lastPark = null; function mouseOverPark(feature) { @@ -516,12 +504,12 @@ function mouseParkMove() var positionInfo = myParktip.getBoundingClientRect(); var windowWidth = window.innerWidth; - myParktip.style.left = getMouseX() - positionInfo.width / 2 + "px"; - if (windowWidth - getMouseX() < positionInfo.width) + myParktip.style.left = getMouseX() - (positionInfo.width / 2) + "px"; + if (windowWidth - getMouseX() < (positionInfo.width / 2)) { myParktip.style.left = getMouseX() - (10 + positionInfo.width) + "px"; } - if (getMouseX() - positionInfo.width < 0) + if (getMouseX() - (positionInfo.width / 2) < 0) { myParktip.style.left = getMouseX() + 10 + "px"; } @@ -545,16 +533,19 @@ function createParkTipTable(toolElement) worker += "ActivatorSpotterFreqModeCountWhenSourceComment"; for (const i in g_pota.parkSpots[key]) { - worker += ""; - worker += "" + g_pota.parkSpots[key][i].activator + ""; - worker += "" + ((g_pota.parkSpots[key][i].spotter == g_pota.parkSpots[key][i].activator) ? "Self" : g_pota.parkSpots[key][i].spotter) + ""; - worker += "" + g_pota.parkSpots[key][i].frequency.formatMhz(3, 3) + " (" + g_pota.parkSpots[key][i].band + ")"; - worker += "" + g_pota.parkSpots[key][i].mode + ""; - worker += "" + g_pota.parkSpots[key][i].count + ""; - worker += "" + parseInt((now - g_pota.parkSpots[key][i].spotTime) / 1000).toDHMS() + ""; - worker += "" + g_pota.parkSpots[key][i].source + ""; - worker += "" + g_pota.parkSpots[key][i].comments + ""; - worker += ""; + if (validateMapBandAndMode(g_pota.parkSpots[key][i].band, g_pota.parkSpots[key][i].mode)) + { + worker += ""; + worker += "" + g_pota.parkSpots[key][i].activator + ""; + worker += "" + ((g_pota.parkSpots[key][i].spotter == g_pota.parkSpots[key][i].activator) ? "Self" : g_pota.parkSpots[key][i].spotter) + ""; + worker += "" + g_pota.parkSpots[key][i].frequency.formatMhz(3, 3) + " (" + g_pota.parkSpots[key][i].band + ")"; + worker += "" + g_pota.parkSpots[key][i].mode + ""; + worker += "" + g_pota.parkSpots[key][i].count + ""; + worker += "" + parseInt((now - g_pota.parkSpots[key][i].spotTime) / 1000).toDHMS() + ""; + worker += "" + g_pota.parkSpots[key][i].source + ""; + worker += "" + g_pota.parkSpots[key][i].comments + ""; + worker += ""; + } } worker += ""; diff --git a/package.nw/lib/roster/processRosterHunting.js b/package.nw/lib/roster/processRosterHunting.js index 01753567..2bad55bf 100644 --- a/package.nw/lib/roster/processRosterHunting.js +++ b/package.nw/lib/roster/processRosterHunting.js @@ -15,7 +15,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker) const currentYear = new Date().getFullYear(); const currentYearSuffix = `’${currentYear - 2000}`; - + const potaEnabled = (window.opener.g_potaEnabled === 1); // TODO: Hunting results might be used to filter, based on the "Callsigns: Only Wanted" option, // so maybe we can move this loop first, and add a check to the filtering loop? @@ -496,7 +496,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker) } // Hunting for POTAs - if (huntPOTA.checked == true && callObj.pota.length > 0) + if (potaEnabled && huntPOTA.checked == true && callObj.pota.length > 0) { let huntTotal = callObj.pota.length; let huntFound = 0, layeredFound = 0, workedFound = 0, layeredWorkedFound = 0; diff --git a/package.nw/lib/roster/renderRoster.js b/package.nw/lib/roster/renderRoster.js index 42eb3745..527a9b35 100644 --- a/package.nw/lib/roster/renderRoster.js +++ b/package.nw/lib/roster/renderRoster.js @@ -33,6 +33,16 @@ function renderRoster(callRoster, rosterSettings) columnOverrides.LoTW = false; } + if(window.opener.g_potaEnabled === 1) + { + huntingMatrixPotaDiv.style.display = ""; + } + else + { + huntingMatrixPotaDiv.style.display = "none"; + columnOverrides.POTA = false; + } + // dealing with spots if (g_rosterSettings.columns.Spot == true) onlySpotDiv.style.display = ""; else onlySpotDiv.style.display = "none";