Functional stage

merge-requests/203/head
Tag 2022-09-25 15:36:49 -07:00
rodzic 8ba7d0da46
commit a03870706f
4 zmienionych plików z 76 dodań i 75 usunięć

Wyświetl plik

@ -172,7 +172,7 @@
<div> <div>
<label><input type="checkbox" id="huntPX" onchange="wantedChanged(this);" /> WPX</label> <label><input type="checkbox" id="huntPX" onchange="wantedChanged(this);" /> WPX</label>
</div> </div>
<div> <div id="huntingMatrixPotaDiv">
<label title="Parks On The Air"> <label title="Parks On The Air">
<input type="checkbox" id="huntPOTA" onchange="wantedChanged(this);" /> POTA <input type="checkbox" id="huntPOTA" onchange="wantedChanged(this);" /> POTA
</label> </label>

Wyświetl plik

@ -12,20 +12,24 @@ var g_pota = {
callSpots: {}, callSpots: {},
parkSpots: {}, parkSpots: {},
spotsTimeout: null, spotsTimeout: null,
mapParks: {} mapParks: {},
rbnReportTimes: {},
rbnFrequency: 600000
}; };
var g_spotTemplate = { var g_spotTemplate = {
activator: "", activator: "",
frequency: 0, frequency: 0,
mode: "", mode: "",
band: "",
reference: "", reference: "",
spotTime: 0, spotTime: 0,
spotter: "", spotter: "",
comments: "", comments: "",
source: "GT", source: "GT",
count: 1, count: 1,
rbn: false activatorGrid: "",
spotterGrid: ""
}; };
var g_parkTemplate = { var g_parkTemplate = {
@ -70,6 +74,7 @@ function togglePota()
g_layerSources.pota.clear(); g_layerSources.pota.clear();
g_pota.mapParks = {}; g_pota.mapParks = {};
} }
goProcessRoster();
} }
function redrawParks() function redrawParks()
@ -92,10 +97,9 @@ function makeParkFeatures()
if (park in g_pota.parks) if (park in g_pota.parks)
{ {
let parkObj = Object.assign({}, g_parkTemplate); let parkObj = Object.assign({}, g_parkTemplate);
for (const call in g_pota.parkSpots[park])
for (const i 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)) 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); 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_pota.mapParks[park] = parkObj;
g_layerSources.pota.addFeature(parkObj.feature); 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) function potaSpotFromDecode(callObj)
{ {
let hash = callObj.DEcall + callObj.band + callObj.mode;
for (const i in callObj.pota) for (const i in callObj.pota)
{ {
let park = callObj.pota[i]; let park = callObj.pota[i];
@ -153,33 +141,27 @@ function potaSpotFromDecode(callObj)
if (!(park in g_pota.parkSpots)) if (!(park in g_pota.parkSpots))
{ {
g_pota.parkSpots[park] = {}; g_pota.parkSpots[park] = {};
g_pota.parkSpots[park][callObj.DEcall] = spotFromCallObj(callObj, park, 0, 0);
let newSpot = spotFromCallObj(callObj, park);
g_pota.parkSpots[park][hash] = newSpot;
redrawParkSpotsOnTimeout();
} }
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][callObj.DEcall] = spotFromCallObj(callObj, park, 0, 0);
g_pota.parkSpots[park][hash] = newSpot;
redrawParkSpotsOnTimeout();
} }
else else
{ {
// update spot // update spot
if (!g_pota.parkSpots[park][hash].rbn) g_pota.parkSpots[park][callObj.DEcall] = spotFromCallObj(callObj, park, g_pota.parkSpots[park][callObj.DEcall].count);
{
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;
}
} }
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; g_pota.rbnReportTimes[hash] = Date.now() + g_pota.rbnFrequency;
reportPotaRBN(g_pota.parkSpots[park][hash]); reportPotaRBN(g_pota.parkSpots[park][callObj.DEcall]);
} }
} }
} }
@ -193,17 +175,17 @@ function reportPotaRBN(callSpot)
reference: callSpot.reference, reference: callSpot.reference,
mode: callSpot.mode, mode: callSpot.mode,
source: "GT", source: "GT",
comments: callSpot.comments comments: callSpot.comments,
activatorGrid: callSpot.activatorGrid,
spotterGrid: callSpot.spotterGrid
} }
// console.log(report);
getPostJSONBuffer( getPostJSONBuffer(
"https://api.pota.app/spot", "https://api.pota.app/spot",
rbnReportResult, rbnReportResult,
null, null,
"https", "https",
80, 443,
report, report,
10000, 10000,
null, null,
@ -214,28 +196,29 @@ function reportPotaRBN(callSpot)
function rbnReportResult(buffer, flag, cookies) function rbnReportResult(buffer, flag, cookies)
{ {
// It worked, but do we take these spots? // 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 = { let callSpot = {
activator: callObj.DEcall, activator: callObj.DEcall,
activatorGrid: callObj.grid,
spotter: myDEcall, spotter: myDEcall,
spotterGrid: myDEGrid,
frequency: Number((g_instances[callObj.instance].status.Frequency / 1000000).toFixed(3)), frequency: Number((g_instances[callObj.instance].status.Frequency / 1000000).toFixed(3)),
reference: park, reference: park,
mode: callObj.mode, mode: callObj.mode,
band: callObj.band, band: callObj.band,
spotTime: Date.now(), spotTime: Date.now(),
source: "GT", source: "GT",
count: 1, count: inCount+1,
rbn: false,
comments: "RBN " + callObj.RSTsent + " dB " + myDEGrid comments: "RBN " + callObj.RSTsent + " dB " + myDEGrid
}; };
return callSpot; return callSpot;
} }
function addParkSpotFeature(park) function addParkSpotFeature(park, report)
{ {
let parkObj = Object.assign({}, g_parkTemplate); let parkObj = Object.assign({}, g_parkTemplate);
if (park in g_pota.mapParks) if (park in g_pota.mapParks)
@ -361,11 +344,20 @@ function processPotaSpots(buffer)
newSpot.spotTime = Date.parse(newSpot.spotTime + "Z"); newSpot.spotTime = Date.parse(newSpot.spotTime + "Z");
newSpot.frequency = parseInt(newSpot.frequency) / 1000; newSpot.frequency = parseInt(newSpot.frequency) / 1000;
newSpot.band = newSpot.frequency.formatBand(); newSpot.band = newSpot.frequency.formatBand();
(g_pota.callSpots[newSpot.activator] = g_pota.callSpots[newSpot.activator] || []).push(newSpot.reference); (g_pota.callSpots[newSpot.activator] = g_pota.callSpots[newSpot.activator] || []).push(newSpot.reference);
let hash = newSpot.activator + newSpot.band + newSpot.mode; if(!(newSpot.reference in g_pota.parkSpots))
(g_pota.parkSpots[newSpot.reference] = g_pota.parkSpots[newSpot.reference] || {})[hash] = newSpot; {
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 else
{ {
@ -378,6 +370,7 @@ function processPotaSpots(buffer)
{ {
g_pota.callSpots[spot] = uniqueArrayFromArray(g_pota.callSpots[spot]); g_pota.callSpots[spot] = uniqueArrayFromArray(g_pota.callSpots[spot]);
} }
redrawParks(); redrawParks();
} }
catch (e) catch (e)
@ -482,11 +475,6 @@ function getPotaSchedule()
g_pota.scheduleTimeout = setTimeout(getPotaSchedule, 900000); 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; var g_lastPark = null;
function mouseOverPark(feature) function mouseOverPark(feature)
{ {
@ -516,12 +504,12 @@ function mouseParkMove()
var positionInfo = myParktip.getBoundingClientRect(); var positionInfo = myParktip.getBoundingClientRect();
var windowWidth = window.innerWidth; var windowWidth = window.innerWidth;
myParktip.style.left = getMouseX() - positionInfo.width / 2 + "px"; myParktip.style.left = getMouseX() - (positionInfo.width / 2) + "px";
if (windowWidth - getMouseX() < positionInfo.width) if (windowWidth - getMouseX() < (positionInfo.width / 2))
{ {
myParktip.style.left = getMouseX() - (10 + positionInfo.width) + "px"; 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"; myParktip.style.left = getMouseX() + 10 + "px";
} }
@ -545,16 +533,19 @@ function createParkTipTable(toolElement)
worker += "<tr><th>Activator</th><th>Spotter</th><th>Freq</th><th>Mode</th><th>Count</th><th>When</th><th>Source</th><th>Comment</th></tr>"; worker += "<tr><th>Activator</th><th>Spotter</th><th>Freq</th><th>Mode</th><th>Count</th><th>When</th><th>Source</th><th>Comment</th></tr>";
for (const i in g_pota.parkSpots[key]) for (const i in g_pota.parkSpots[key])
{ {
worker += "<tr>"; if (validateMapBandAndMode(g_pota.parkSpots[key][i].band, g_pota.parkSpots[key][i].mode))
worker += "<td style='color:yellow'>" + g_pota.parkSpots[key][i].activator + "</td>"; {
worker += "<td style='color:cyan'>" + ((g_pota.parkSpots[key][i].spotter == g_pota.parkSpots[key][i].activator) ? "Self" : g_pota.parkSpots[key][i].spotter) + "</td>"; worker += "<tr>";
worker += "<td style='color:lightgreen' >" + g_pota.parkSpots[key][i].frequency.formatMhz(3, 3) + " <font color='yellow'>(" + g_pota.parkSpots[key][i].band + ")</font></td>"; worker += "<td style='color:yellow'>" + g_pota.parkSpots[key][i].activator + "</td>";
worker += "<td style='color:orange'>" + g_pota.parkSpots[key][i].mode + "</td>"; worker += "<td style='color:cyan'>" + ((g_pota.parkSpots[key][i].spotter == g_pota.parkSpots[key][i].activator) ? "Self" : g_pota.parkSpots[key][i].spotter) + "</td>";
worker += "<td>" + g_pota.parkSpots[key][i].count + "</td>"; worker += "<td style='color:lightgreen' >" + g_pota.parkSpots[key][i].frequency.formatMhz(3, 3) + " <font color='yellow'>(" + g_pota.parkSpots[key][i].band + ")</font></td>";
worker += "<td style='color:lightblue' >" + parseInt((now - g_pota.parkSpots[key][i].spotTime) / 1000).toDHMS() + "</td>"; worker += "<td style='color:orange'>" + g_pota.parkSpots[key][i].mode + "</td>";
worker += "<td>" + g_pota.parkSpots[key][i].source + "</td>"; worker += "<td>" + g_pota.parkSpots[key][i].count + "</td>";
worker += "<td>" + g_pota.parkSpots[key][i].comments + "</td>"; worker += "<td style='color:lightblue' >" + parseInt((now - g_pota.parkSpots[key][i].spotTime) / 1000).toDHMS() + "</td>";
worker += "</tr>"; worker += "<td>" + g_pota.parkSpots[key][i].source + "</td>";
worker += "<td>" + g_pota.parkSpots[key][i].comments + "</td>";
worker += "</tr>";
}
} }
worker += "</table>"; worker += "</table>";

Wyświetl plik

@ -15,7 +15,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
const currentYear = new Date().getFullYear(); const currentYear = new Date().getFullYear();
const currentYearSuffix = `&rsquo;${currentYear - 2000}`; const currentYearSuffix = `&rsquo;${currentYear - 2000}`;
const potaEnabled = (window.opener.g_potaEnabled === 1);
// TODO: Hunting results might be used to filter, based on the "Callsigns: Only Wanted" option, // 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? // 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 // 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 huntTotal = callObj.pota.length;
let huntFound = 0, layeredFound = 0, workedFound = 0, layeredWorkedFound = 0; let huntFound = 0, layeredFound = 0, workedFound = 0, layeredWorkedFound = 0;

Wyświetl plik

@ -33,6 +33,16 @@ function renderRoster(callRoster, rosterSettings)
columnOverrides.LoTW = false; columnOverrides.LoTW = false;
} }
if(window.opener.g_potaEnabled === 1)
{
huntingMatrixPotaDiv.style.display = "";
}
else
{
huntingMatrixPotaDiv.style.display = "none";
columnOverrides.POTA = false;
}
// dealing with spots // dealing with spots
if (g_rosterSettings.columns.Spot == true) onlySpotDiv.style.display = ""; if (g_rosterSettings.columns.Spot == true) onlySpotDiv.style.display = "";
else onlySpotDiv.style.display = "none"; else onlySpotDiv.style.display = "none";