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 += "
Activator | Spotter | Freq | Mode | Count | When | Source | Comment |
";
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";