kopia lustrzana https://gitlab.com/gridtracker.org/gridtracker
Merge branch 'cq-and-chat' into 'master'
Cq and chat See merge request gridtracker.org/gridtracker!257 If this is changing anything in the UI or operational behavior, please prepare to update the wiki!merge-requests/237/merge v1.22.1204
commit
e71e5c76c3
|
@ -1,3 +1,11 @@
|
|||
gridtracker (1.22.1204) unstable; urgency=low
|
||||
- Fixed CPU usage issue with messaging
|
||||
- Fixed Logging -> Local File(s) not showing files selected
|
||||
- Honor POTA spot expiration
|
||||
- New option 'Clear DX Call, DX Grid, Tx1-Tx5 when calling CQ in WSJT-X'
|
||||
-- Settings -> Lookups -> Feature Control -> Clear on CQ
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 04 Dec 2022 00:00:00 -0000
|
||||
|
||||
gridtracker (1.22.1123) unstable; urgency=low
|
||||
- LoTW QSL downloading issue fixed
|
||||
- CQ Only in Call Roster fixed
|
||||
|
|
|
@ -40,6 +40,12 @@ DESTDIR=${RPM_BUILD_ROOT} make clean
|
|||
%license %{_docdir}/%{name}/
|
||||
|
||||
%changelog
|
||||
* Sun Dec 04 2022 Tag Loomis <n0ttl@gridtracker.org> - 1.22.1204-1
|
||||
- Fixed CPU usage issue with messaging
|
||||
- Fixed Logging -> Local File(s) not showing files selected
|
||||
- Honor POTA spot expiration
|
||||
- New option 'Clear DX Call, DX Grid, Tx1-Tx5 when calling CQ in WSJT-X'
|
||||
-- Settings -> Lookups -> Feature Control -> Clear on CQ
|
||||
* Wed Nov 23 2022 Tag Loomis <n0ttl@gridtracker.org> - 1.22.1123-1
|
||||
- LoTW QSL downloading issue fixed
|
||||
- CQ Only in Call Roster fixed
|
||||
|
|
|
@ -1379,7 +1379,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<td>
|
||||
<input type="checkbox" id="potaMenu" onclick="changePotaMenu();" />
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Clear on CQ</td>
|
||||
<td>
|
||||
<input type="checkbox" id="clearOnCQ" onclick="changeClearOnCQ();" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
@ -2111,12 +2116,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<table align="center" class="subtable">
|
||||
<tr>
|
||||
<td>
|
||||
<div data-i18n="settings.logging.LocalFiles.details.add" class="button" id="selectAdifButton">Add
|
||||
File</div>
|
||||
<div data-i18n="settings.logging.LocalFiles.details.add" class="button" id="selectAdifButton">Add File</div>
|
||||
</td>
|
||||
<td>
|
||||
<div data-i18n="settings.logging.LocalFiles.details.noFiles" id="startupLogFileDiv">No file(s)
|
||||
selected</div>
|
||||
<div id="startupLogFileDiv"></div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
|
|
@ -154,10 +154,10 @@
|
|||
}
|
||||
else
|
||||
{
|
||||
var obj = document.getElementById(from.currentTarget.id);
|
||||
if (obj)
|
||||
var node = document.getElementById(from.currentTarget.id);
|
||||
if (node)
|
||||
{
|
||||
allCallDiv.removeChild(obj);
|
||||
allCallDiv.removeChild(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -172,10 +172,10 @@
|
|||
}
|
||||
else
|
||||
{
|
||||
var obj = document.getElementById(from.currentTarget.id);
|
||||
if (obj)
|
||||
var node = document.getElementById(from.currentTarget.id);
|
||||
if (node)
|
||||
{
|
||||
allCallDiv.removeChild(obj);
|
||||
allCallDiv.removeChild(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -189,10 +189,10 @@
|
|||
}
|
||||
else
|
||||
{
|
||||
var obj = document.getElementById(cid);
|
||||
if (obj)
|
||||
var node = document.getElementById(cid);
|
||||
if (node)
|
||||
{
|
||||
allCallDiv.removeChild(obj);
|
||||
allCallDiv.removeChild(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -204,6 +204,7 @@
|
|||
|
||||
function makeCallsignRow(callObj, show)
|
||||
{
|
||||
var isNewObj = false;
|
||||
var obj = document.getElementById(callObj.cid);
|
||||
if (obj && obj.fCall != callObj.fCall)
|
||||
{
|
||||
|
@ -213,6 +214,7 @@
|
|||
}
|
||||
if (!obj)
|
||||
{
|
||||
isNewObj = true;
|
||||
var low = 0;
|
||||
var mid = 0;
|
||||
var target = null;
|
||||
|
@ -260,11 +262,90 @@
|
|||
}
|
||||
obj.style.display = show ? "" : "none";
|
||||
}
|
||||
return isNewObj;
|
||||
}
|
||||
|
||||
function showAllCallsigns()
|
||||
function updateCallsign(id)
|
||||
{
|
||||
if (id in window.opener.g_gtFlagPins)
|
||||
{
|
||||
var obj = window.opener.g_gtFlagPins[id];
|
||||
if (obj.call != "" && obj.call != "NOCALL")
|
||||
{
|
||||
var show = true;
|
||||
try {
|
||||
if (searchBox.value.length > 0 && !obj.call.match(searchBox.value))
|
||||
{
|
||||
show = false;
|
||||
}
|
||||
}
|
||||
catch (e) {}
|
||||
|
||||
if (g_viewBand > 0 && window.opener.myBand != obj.band) show = false;
|
||||
|
||||
if (g_viewMode > 0 && window.opener.myMode != obj.mode) show = false;
|
||||
|
||||
if (obj.canmsg == false) show = false;
|
||||
|
||||
makeCallsignRow(obj, show);
|
||||
|
||||
if (obj.cid == g_currentId && messageInput.disabled == true && obj.live == true)
|
||||
{
|
||||
messageTextDiv.innerHTML += makeViewMessage("system", "GT", "Session resumed", null);
|
||||
messageInput.value = "";
|
||||
scrollDown(messageTextDiv);
|
||||
messageInput.disabled = false;
|
||||
}
|
||||
}
|
||||
if (id == g_currentId)
|
||||
{
|
||||
updateBar(g_currentId);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
var node = document.getElementById(id);
|
||||
if (node)
|
||||
{
|
||||
allCallDiv.removeChild(node);
|
||||
}
|
||||
}
|
||||
updateCount();
|
||||
}
|
||||
|
||||
function updateCount()
|
||||
{
|
||||
var count = 0;
|
||||
if(allCallDiv.childElementCount > 0)
|
||||
{
|
||||
for (var x = allCallDiv.childNodes.length-1; x > -1; x--)
|
||||
{
|
||||
if (allCallDiv.childNodes[x].style.display != "none")
|
||||
{
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
userCount.innerHTML = count;
|
||||
}
|
||||
|
||||
function removeAllChildNodes(parent)
|
||||
{
|
||||
while (parent.firstChild)
|
||||
{
|
||||
parent.removeChild(parent.firstChild);
|
||||
}
|
||||
}
|
||||
|
||||
function showAllCallsigns(justSearching = false)
|
||||
{
|
||||
allCallDiv.style.display = "none";
|
||||
if (justSearching == false)
|
||||
{
|
||||
removeAllChildNodes(allCallDiv);
|
||||
}
|
||||
|
||||
for (const x in window.opener.g_gtFlagPins)
|
||||
{
|
||||
var obj = window.opener.g_gtFlagPins[x];
|
||||
|
@ -285,11 +366,6 @@
|
|||
|
||||
if (obj.canmsg == false) show = false;
|
||||
|
||||
if (show)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
|
||||
makeCallsignRow(obj, show);
|
||||
|
||||
if (obj.cid == g_currentId && messageInput.disabled == true && obj.live == true)
|
||||
|
@ -302,65 +378,66 @@
|
|||
}
|
||||
}
|
||||
|
||||
if(allCallDiv.childElementCount > 0)
|
||||
{
|
||||
for (var x = allCallDiv.childNodes.length-1; x > -1; x--)
|
||||
{
|
||||
if (!(allCallDiv.childNodes[x].id in window.opener.g_gtFlagPins))
|
||||
{
|
||||
allCallDiv.removeChild(allCallDiv.childNodes[x]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updateBar(g_currentId);
|
||||
userCount.innerHTML = count;
|
||||
updateCount();
|
||||
|
||||
if (g_viewBand)
|
||||
{
|
||||
viewBand.innerHTML = window.opener.myBand;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
viewBand.innerHTML = "All";
|
||||
}
|
||||
|
||||
if (g_viewMode)
|
||||
{
|
||||
viewMode.innerHTML = window.opener.myMode;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
viewMode.innerHTML = "All";
|
||||
}
|
||||
|
||||
allCallDiv.style.display = "";
|
||||
|
||||
messagesRedraw();
|
||||
}
|
||||
|
||||
function messagesRedraw()
|
||||
{
|
||||
showAllMessages();
|
||||
Resize();
|
||||
}
|
||||
|
||||
function showAllMessages()
|
||||
{
|
||||
activeCallsignsDiv.innerHTML = "<font color='gray'>no message history</font>";
|
||||
if (Object.keys(window.opener.g_gtMessages).length > 0)
|
||||
{
|
||||
var worker = "<table style='width:100%;'>";
|
||||
var worker = "";
|
||||
for (const key in window.opener.g_gtMessages)
|
||||
{
|
||||
worker += "<tr style='cursor:pointer;vertical-align:bottom;'><td align=left onclick=\"openId('" + key + "');\">";
|
||||
if (key in window.opener.g_gtUnread) worker += "🔥";
|
||||
else worker += "💬";
|
||||
if (key in window.opener.g_gtFlagPins)
|
||||
{
|
||||
worker += "<tr style='cursor:pointer;vertical-align:bottom;'><td align=left onclick=\"openId('" + key + "');\">";
|
||||
if (key in window.opener.g_gtUnread)
|
||||
{
|
||||
worker += "🔥";
|
||||
}
|
||||
else
|
||||
{
|
||||
worker += "💬";
|
||||
}
|
||||
|
||||
worker +=
|
||||
"</td><td align=left style='color:cyan;' onclick=\"openId('" +
|
||||
key +
|
||||
"');\" >" +
|
||||
window.opener.g_gtFlagPins[key].call.formatCallsign() +
|
||||
"</td>";
|
||||
worker +=
|
||||
"<td align=right title='Clear Messages' style='padding-bottom:2px' onclick=\"clearMessage('" +
|
||||
key +
|
||||
"');\" >❌</td></tr>";
|
||||
worker += "</td><td align=left style='color:cyan;' onclick=\"openId('" + key + "');\" >" + window.opener.g_gtFlagPins[key].call.formatCallsign() + "</td>";
|
||||
worker += "<td align=right title='Clear Messages' style='padding-bottom:2px' onclick=\"clearMessage('" + key + "');\" >❌</td></tr>";
|
||||
}
|
||||
}
|
||||
if (worker.length > 0)
|
||||
{
|
||||
activeCallsignsDiv.innerHTML = "<table style='width:100%;'>" + worker + "</table>";
|
||||
}
|
||||
|
||||
worker += "</table>";
|
||||
activeCallsignsDiv.innerHTML = worker;
|
||||
} else {
|
||||
activeCallsignsDiv.innerHTML = "<font color='gray'>no message history</font>";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -378,8 +455,7 @@
|
|||
g_currentId = "";
|
||||
openId(what);
|
||||
}
|
||||
showAllMessages();
|
||||
Resize();
|
||||
messagesRedraw();
|
||||
}
|
||||
|
||||
function updateEverything()
|
||||
|
@ -435,14 +511,6 @@
|
|||
scrollDown(messageTextDiv);
|
||||
messageInput.disabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
var obj = document.getElementById(id);
|
||||
if (obj)
|
||||
{
|
||||
allCallDiv.removeChild(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function updateBar(id)
|
||||
|
@ -491,7 +559,8 @@
|
|||
if (id in window.opener.g_gtUnread)
|
||||
{
|
||||
delete window.opener.g_gtUnread[id];
|
||||
showAllCallsigns();
|
||||
updateCallsign(id);
|
||||
showAllMessages();
|
||||
}
|
||||
}
|
||||
messageTextDiv.innerHTML = worker;
|
||||
|
@ -556,7 +625,7 @@
|
|||
} else {
|
||||
clearSearch.style.display = "none";
|
||||
}
|
||||
showAllCallsigns();
|
||||
showAllCallsigns(true);
|
||||
}
|
||||
|
||||
function doLookup(what)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
<!DOCTYPE html>
|
||||
<!--
|
||||
This file is part of GridTracker.
|
||||
|
||||
|
|
Plik binarny nie jest wyświetlany.
Plik binarny nie jest wyświetlany.
|
@ -1381,8 +1381,7 @@ function setAdifStartup(checkbox)
|
|||
worker += "<table class='darkTable'>";
|
||||
for (var i in g_startupLogs)
|
||||
{
|
||||
worker +=
|
||||
"<tr title='" +
|
||||
worker += "<tr title='" +
|
||||
g_startupLogs[i].file +
|
||||
"'><td>" +
|
||||
g_startupLogs[i].name +
|
||||
|
@ -1882,12 +1881,11 @@ function sendToLogger(ADIF)
|
|||
record.GRIDSQUARE = g_liveCallsigns[localHash].grid.substr(0, 4);
|
||||
}
|
||||
|
||||
if (g_appSettings.potaEnabled == 1 && localHash in g_liveCallsigns && g_liveCallsigns[localHash].pota.length > 0)
|
||||
if (g_appSettings.potaEnabled == 1 && localHash in g_liveCallsigns && g_liveCallsigns[localHash].pota)
|
||||
{
|
||||
var pota = g_liveCallsigns[localHash].pota[0];
|
||||
if (pota != "?-????")
|
||||
if (g_liveCallsigns[localHash].pota != "?-????")
|
||||
{
|
||||
record.POTA = pota;
|
||||
record.POTA = g_liveCallsigns[localHash].pota;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2394,8 +2392,7 @@ function sendLotwLogEntry(report)
|
|||
lotwStation.value.length > 0
|
||||
)
|
||||
{
|
||||
var header =
|
||||
"Generated " + userTimeString(null) + " for " + myDEcall + "\r\n\r\n";
|
||||
var header = "Generated " + userTimeString(null) + " for " + myDEcall + "\r\n\r\n";
|
||||
var pid = "GridTracker";
|
||||
var pver = String(gtVersion);
|
||||
header += "<PROGRAMID:" + pid.length + ">" + pid + "\r\n";
|
||||
|
|
|
@ -36,6 +36,7 @@ var def_appSettings = {
|
|||
rosterAlwaysOnTop: false,
|
||||
centerGridsquare: "",
|
||||
chatUUID: "",
|
||||
clearOnCQ: false,
|
||||
crScript: 0,
|
||||
distanceUnit: "MI",
|
||||
earthImgSrc: 0,
|
||||
|
|
|
@ -175,6 +175,7 @@ loadAllSettings();
|
|||
|
||||
var myDEcall = g_appSettings.myDEcall;
|
||||
var myDEGrid = g_appSettings.myDEGrid;
|
||||
var myDXGrid = "";
|
||||
var myMode = g_appSettings.myMode;
|
||||
var myBand = g_appSettings.myBand;
|
||||
var myRawFreq = g_appSettings.myRawFreq;
|
||||
|
@ -1536,7 +1537,7 @@ function addDeDx(
|
|||
newCallsign.distance = 0;
|
||||
newCallsign.px = null;
|
||||
newCallsign.zone = null;
|
||||
newCallsign.pota = [];
|
||||
newCallsign.pota = null;
|
||||
newCallsign.cnty = finalCnty;
|
||||
newCallsign.cont = finalCont;
|
||||
if (finalDxcc > -1)
|
||||
|
@ -1823,67 +1824,19 @@ function createFlagTipTable(toolElement)
|
|||
workColor = "#00FF00";
|
||||
}
|
||||
|
||||
worker +=
|
||||
"<div style='background-color:" +
|
||||
workColor +
|
||||
";color:#000;font-weight:bold;font-size:18px;border:2px solid gray;margin:0px' class='roundBorder'>" +
|
||||
g_gtFlagPins[key].call.formatCallsign() +
|
||||
"</div>";
|
||||
worker += "<div style='background-color:" + workColor + ";color:#000;font-weight:bold;font-size:18px;border:2px solid gray;margin:0px' class='roundBorder'>" + g_gtFlagPins[key].call.formatCallsign() + "</div>";
|
||||
|
||||
worker += "<table id='tooltipTable' class='darkTable' >";
|
||||
worker += "<tr><td>DXCC</td><td style='color:orange;'>" + dxccName + " <font color='lightgreen'>(" + g_dxccInfo[dxcc].pp + ")</font></td>";
|
||||
worker += "<tr><td>Grid</td><td style='color:cyan;' >" + g_gtFlagPins[key].grid + "</td></tr>";
|
||||
worker += "<tr><td>Freq</td><td style='color:lightgreen' >" + Number(g_gtFlagPins[key].freq / 1000).formatMhz(3, 3) + " <font color='yellow'>(" + Number(g_gtFlagPins[key].freq / 1000000).formatBand() + ")</font></td></tr>";
|
||||
worker += "<tr><td>Mode</td><td style='color:orange' >" + g_gtFlagPins[key].mode + "</td></tr>";
|
||||
|
||||
worker +=
|
||||
"<tr><td>DXCC</td><td style='color:orange;'>" +
|
||||
dxccName +
|
||||
" <font color='lightgreen'>(" +
|
||||
g_dxccInfo[dxcc].pp +
|
||||
")</font></td>";
|
||||
|
||||
worker +=
|
||||
"<tr><td>Grid</td><td style='color:cyan;' >" +
|
||||
g_gtFlagPins[key].grid +
|
||||
"</td></tr>";
|
||||
|
||||
worker +=
|
||||
"<tr><td>Freq</td><td style='color:lightgreen' >" +
|
||||
Number(g_gtFlagPins[key].freq / 1000).formatMhz(3, 3) +
|
||||
" <font color='yellow'>(" +
|
||||
Number(g_gtFlagPins[key].freq / 1000000).formatBand() +
|
||||
")</font></td></tr>";
|
||||
|
||||
worker +=
|
||||
"<tr><td>Mode</td><td style='color:orange' >" +
|
||||
g_gtFlagPins[key].mode +
|
||||
"</td></tr>";
|
||||
|
||||
var LL = squareToLatLongAll(g_gtFlagPins[key].grid);
|
||||
|
||||
var bearing = parseInt(
|
||||
MyCircle.bearing(
|
||||
g_myLat,
|
||||
g_myLon,
|
||||
LL.la2 - (LL.la2 - LL.la1) / 2,
|
||||
LL.lo2 - (LL.lo2 - LL.lo1) / 2
|
||||
)
|
||||
);
|
||||
worker +=
|
||||
"<tr><td>Dist</td><td style='color:cyan'>" +
|
||||
parseInt(
|
||||
MyCircle.distance(
|
||||
g_myLat,
|
||||
g_myLon,
|
||||
LL.la2 - (LL.la2 - LL.la1) / 2,
|
||||
LL.lo2 - (LL.lo2 - LL.lo1) / 2,
|
||||
distanceUnit.value
|
||||
) * MyCircle.validateRadius(distanceUnit.value)
|
||||
) +
|
||||
distanceUnit.value.toLowerCase() +
|
||||
"</td></tr>";
|
||||
worker +=
|
||||
"<tr><td>Azim</td><td style='color:yellow'>" +
|
||||
bearing +
|
||||
"°</td></tr>";
|
||||
|
||||
var LL = squareToCenter(g_gtFlagPins[key].grid);
|
||||
var bearing = parseInt(MyCircle.bearing(g_myLat, g_myLon, LL.a, LL.o));
|
||||
|
||||
worker += "<tr><td>Dist</td><td style='color:cyan'>" + parseInt(MyCircle.distance(g_myLat, g_myLon, LL.a, LL.o, distanceUnit.value) * MyCircle.validateRadius(distanceUnit.value)) + distanceUnit.value.toLowerCase() + "</td></tr>";
|
||||
worker += "<tr><td>Azim</td><td style='color:yellow'>" + bearing + "°</td></tr>";
|
||||
worker += "</table>";
|
||||
}
|
||||
else if (toolElement.size == 73)
|
||||
|
@ -1992,94 +1945,35 @@ function createSpotTipTable(toolElement)
|
|||
g_layerSources["psk-hop"].clear();
|
||||
var report = g_receptionReports.spots[toolElement.spot];
|
||||
|
||||
var LL = squareToLatLongAll(myRawGrid);
|
||||
var Lat = LL.la2 - (LL.la2 - LL.la1) / 2;
|
||||
var Lon = LL.lo2 - (LL.lo2 - LL.lo1) / 2;
|
||||
var fromPoint = ol.proj.fromLonLat([Lon, Lat]);
|
||||
var LL = squareToCenter(myRawGrid);
|
||||
var fromPoint = ol.proj.fromLonLat([LL.o, LL.a]);
|
||||
|
||||
worker =
|
||||
"<table id='tooltipTable' class='darkTable' ><tr><th colspan=2 style='color:cyan'>Rx Spot</th></tr>";
|
||||
worker +=
|
||||
"<tr><td>Age</td><td>" +
|
||||
Number(now - report.when).toDHMS() +
|
||||
"</td></tr>";
|
||||
worker +=
|
||||
"<tr><td>dB</td><td style='color:#DD44DD' >" +
|
||||
Number(report.snr).formatSignalReport() +
|
||||
"</td></tr>";
|
||||
worker +=
|
||||
"<tr><td>Call</td><td style='color:#ff0' >" +
|
||||
report.call.formatCallsign() +
|
||||
"</td></tr>";
|
||||
worker = "<table id='tooltipTable' class='darkTable' ><tr><th colspan=2 style='color:cyan'>Rx Spot</th></tr>";
|
||||
worker += "<tr><td>Age</td><td>" + Number(now - report.when).toDHMS() + "</td></tr>";
|
||||
worker += "<tr><td>dB</td><td style='color:#DD44DD' >" + Number(report.snr).formatSignalReport() + "</td></tr>";
|
||||
worker += "<tr><td>Call</td><td style='color:#ff0' >" + report.call.formatCallsign() + "</td></tr>";
|
||||
|
||||
if (report.dxcc > 0)
|
||||
{
|
||||
worker +=
|
||||
"<tr><td>DXCC</td><td style='color:orange;'>" +
|
||||
g_dxccToAltName[report.dxcc] +
|
||||
" <font color='lightgreen'>(" +
|
||||
g_dxccInfo[report.dxcc].pp +
|
||||
")</font></td>";
|
||||
worker += "<tr><td>DXCC</td><td style='color:orange;'>" + g_dxccToAltName[report.dxcc] + " <font color='lightgreen'>(" + g_dxccInfo[report.dxcc].pp + ")</font></td>";
|
||||
}
|
||||
|
||||
worker +=
|
||||
"<tr><td>Grid</td><td style='color:cyan;cursor:pointer' >" +
|
||||
report.grid +
|
||||
"</td></tr>";
|
||||
worker +=
|
||||
"<tr><td>Freq</td><td style='color:lightgreen' >" +
|
||||
report.freq.formatMhz() +
|
||||
" <font color='yellow'>(" +
|
||||
report.band +
|
||||
")</font></td></tr>";
|
||||
worker +=
|
||||
"<tr><td>Mode</td><td style='color:orange' >" +
|
||||
report.mode +
|
||||
"</td></tr>";
|
||||
worker += "<tr><td>Grid</td><td style='color:cyan;cursor:pointer' >" + report.grid + "</td></tr>";
|
||||
worker += "<tr><td>Freq</td><td style='color:lightgreen' >" + report.freq.formatMhz() + " <font color='yellow'>(" + report.band + ")</font></td></tr>";
|
||||
worker += "<tr><td>Mode</td><td style='color:orange' >" + report.mode + "</td></tr>";
|
||||
|
||||
LL = squareToLatLongAll(report.grid);
|
||||
|
||||
report.bearing = parseInt(
|
||||
MyCircle.bearing(
|
||||
g_myLat,
|
||||
g_myLon,
|
||||
LL.la2 - (LL.la2 - LL.la1) / 2,
|
||||
LL.lo2 - (LL.lo2 - LL.lo1) / 2
|
||||
)
|
||||
);
|
||||
worker +=
|
||||
"<tr><td>Dist</td><td style='color:cyan'>" +
|
||||
parseInt(
|
||||
MyCircle.distance(
|
||||
g_myLat,
|
||||
g_myLon,
|
||||
LL.la2 - (LL.la2 - LL.la1) / 2,
|
||||
LL.lo2 - (LL.lo2 - LL.lo1) / 2,
|
||||
distanceUnit.value
|
||||
) * MyCircle.validateRadius(distanceUnit.value)
|
||||
) +
|
||||
distanceUnit.value.toLowerCase() +
|
||||
"</td></tr>";
|
||||
worker +=
|
||||
"<tr><td>Azim</td><td style='color:yellow'>" +
|
||||
report.bearing +
|
||||
"°</td></tr>";
|
||||
|
||||
worker +=
|
||||
"<tr><td>Time</td><td>" +
|
||||
userTimeString(report.when * 1000) +
|
||||
"</td></tr>";
|
||||
LL = squareToCenter(report.grid);
|
||||
|
||||
report.bearing = parseInt(MyCircle.bearing(g_myLat, g_myLon, LL.a, LL.o));
|
||||
worker += "<tr><td>Dist</td><td style='color:cyan'>" + parseInt(MyCircle.distance(g_myLat, g_myLon, LL.a, LL.o, distanceUnit.value) * MyCircle.validateRadius(distanceUnit.value)) + distanceUnit.value.toLowerCase() + "</td></tr>";
|
||||
worker += "<tr><td>Azim</td><td style='color:yellow'>" + report.bearing + "°</td></tr>";
|
||||
worker += "<tr><td>Time</td><td>" + userTimeString(report.when * 1000) + "</td></tr>";
|
||||
worker += "</table>";
|
||||
|
||||
var strokeWeight = pathWidthValue.value;
|
||||
var toPoint = ol.proj.fromLonLat([LL.o, LL.a]);
|
||||
|
||||
Lat = LL.la2 - (LL.la2 - LL.la1) / 2;
|
||||
Lon = LL.lo2 - (LL.lo2 - LL.lo1) / 2;
|
||||
|
||||
var toPoint = ol.proj.fromLonLat([Lon, Lat]);
|
||||
|
||||
var feature = flightFeature(
|
||||
flightFeature(
|
||||
[fromPoint, toPoint],
|
||||
{
|
||||
weight: strokeWeight,
|
||||
|
@ -4087,6 +3981,15 @@ function twoWideToLatLong(qth)
|
|||
return LatLong;
|
||||
}
|
||||
|
||||
function squareToCenter(qth)
|
||||
{
|
||||
var LL = squareToLatLongAll(qth);
|
||||
var obj = {};
|
||||
obj.a = LL.la2 - (LL.la2 - LL.la1) / 2;
|
||||
obj.o = LL.lo2 - (LL.lo2 - LL.lo1) / 2;
|
||||
return obj;
|
||||
}
|
||||
|
||||
function squareToLatLongAll(qth)
|
||||
{
|
||||
qth = qth.toUpperCase();
|
||||
|
@ -6155,15 +6058,9 @@ function haltAllTx(allTx = false)
|
|||
|
||||
function initiateQso(thisCall)
|
||||
{
|
||||
if (
|
||||
thisCall in g_callRoster &&
|
||||
g_callRoster[thisCall].message.instance in g_instances
|
||||
)
|
||||
if (thisCall in g_callRoster && g_callRoster[thisCall].message.instance in g_instances)
|
||||
{
|
||||
if (
|
||||
g_mapSettings.focusRig &&
|
||||
g_activeInstance != g_callRoster[thisCall].message.instance
|
||||
)
|
||||
if (g_mapSettings.focusRig && g_activeInstance != g_callRoster[thisCall].message.instance)
|
||||
{
|
||||
activeRig(g_callRoster[thisCall].message.instance);
|
||||
}
|
||||
|
@ -6204,11 +6101,7 @@ function spotLookupAndSetCall(spot)
|
|||
var mode = g_receptionReports.spots[spot].mode;
|
||||
for (var instance in g_instances)
|
||||
{
|
||||
if (
|
||||
g_instances[instance].valid &&
|
||||
g_instances[instance].status.Band == band &&
|
||||
g_instances[instance].status.MO == mode
|
||||
)
|
||||
if (g_instances[instance].valid && g_instances[instance].status.Band == band && g_instances[instance].status.MO == mode)
|
||||
{
|
||||
setCallAndGrid(call, grid, instance);
|
||||
return;
|
||||
|
@ -6217,7 +6110,7 @@ function spotLookupAndSetCall(spot)
|
|||
setCallAndGrid(call, grid, null);
|
||||
}
|
||||
|
||||
function setCallAndGrid(callsign, grid, instance = null)
|
||||
function setCallAndGrid(callsign, grid, instance = null, genMessages = true)
|
||||
{
|
||||
var thisInstance = null;
|
||||
var port;
|
||||
|
@ -6230,7 +6123,10 @@ function setCallAndGrid(callsign, grid, instance = null)
|
|||
port = g_instances[instance].remote.port;
|
||||
address = g_instances[instance].remote.address;
|
||||
}
|
||||
else alert("major instance error");
|
||||
else
|
||||
{
|
||||
alert("major instance error");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -6241,7 +6137,7 @@ function setCallAndGrid(callsign, grid, instance = null)
|
|||
address = g_instances[g_activeInstance].remote.address;
|
||||
}
|
||||
}
|
||||
if (thisInstance && thisInstance.TxEnabled == 0)
|
||||
if (thisInstance && (thisInstance.TxEnabled == 0 || genMessages == false))
|
||||
{
|
||||
var responseArray = Buffer.alloc(1024);
|
||||
var length = 0;
|
||||
|
@ -6255,25 +6151,50 @@ function setCallAndGrid(callsign, grid, instance = null)
|
|||
length = encodeQBOOL(responseArray, length, thisInstance.Fastmode);
|
||||
length = encodeQUINT32(responseArray, length, thisInstance.TRP);
|
||||
length = encodeQUINT32(responseArray, length, thisInstance.RxDF);
|
||||
length = encodeQUTF8(responseArray, length, callsign);
|
||||
|
||||
if (genMessages == true)
|
||||
{
|
||||
length = encodeQUTF8(responseArray, length, callsign);
|
||||
|
||||
var hash = liveHash(callsign, thisInstance.Band, thisInstance.MO);
|
||||
if (hash in g_liveCallsigns && g_liveCallsigns[hash].grid.length > 1) { grid = g_liveCallsigns[hash].grid; }
|
||||
var hash = liveHash(callsign, thisInstance.Band, thisInstance.MO);
|
||||
if (hash in g_liveCallsigns && g_liveCallsigns[hash].grid.length > 1) { grid = g_liveCallsigns[hash].grid; }
|
||||
|
||||
if (grid.length == 0) grid = " ";
|
||||
if (grid.length == 0) grid = " ";
|
||||
|
||||
length = encodeQUTF8(responseArray, length, grid);
|
||||
length = encodeQBOOL(responseArray, length, 1);
|
||||
length = encodeQUTF8(responseArray, length, grid);
|
||||
length = encodeQBOOL(responseArray, length, 1);
|
||||
|
||||
responseArray = responseArray.slice(0, length);
|
||||
wsjtUdpMessage(responseArray, responseArray.length, port, address);
|
||||
addLastTraffic("<font color='lightgreen'>Generated Msgs</font>");
|
||||
}
|
||||
else
|
||||
{
|
||||
// Callsign
|
||||
length = encodeQUTF8(responseArray, length, " ");
|
||||
// Grid
|
||||
length = encodeQUTF8(responseArray, length, " ");
|
||||
length = encodeQBOOL(responseArray, length, 1);
|
||||
|
||||
responseArray = responseArray.slice(0, length);
|
||||
wsjtUdpMessage(responseArray, responseArray.length, port, address);
|
||||
|
||||
responseArray = responseArray.slice(0, length);
|
||||
wsjtUdpMessage(responseArray, responseArray.length, port, address);
|
||||
addLastTraffic("<font color='lightgreen'>Generated Msgs</font>");
|
||||
responseArray = Buffer.alloc(1024);
|
||||
length = 0;
|
||||
length = encodeQUINT32(responseArray, length, thisInstance.magic_key);
|
||||
length = encodeQUINT32(responseArray, length, thisInstance.schema_number);
|
||||
length = encodeQUINT32(responseArray, length, 9);
|
||||
length = encodeQUTF8(responseArray, length, thisInstance.Id);
|
||||
length = encodeQUTF8(responseArray, length, "");
|
||||
length = encodeQBOOL(responseArray, length, 0);
|
||||
|
||||
responseArray = responseArray.slice(0, length);
|
||||
wsjtUdpMessage(responseArray, responseArray.length, port, address);
|
||||
}
|
||||
}
|
||||
if (thisInstance && thisInstance.TxEnabled == 1)
|
||||
if (thisInstance && thisInstance.TxEnabled == 1 && genMessages == true)
|
||||
{
|
||||
addLastTraffic(
|
||||
"<font color='yellow'>Transmit Enabled!</font><br/><font color='yellow'>Generate Msgs Aborted</font>"
|
||||
);
|
||||
addLastTraffic("<font color='yellow'>Transmit Enabled!</font><br/><font color='yellow'>Generate Msgs Aborted</font>");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6321,7 +6242,6 @@ function handleWsjtxQSO(newMessage)
|
|||
|
||||
function handleWsjtxNotSupported(newMessage) { }
|
||||
|
||||
var g_gtShareCount = 0;
|
||||
var g_lastBand = "";
|
||||
var g_lastMode = "";
|
||||
|
||||
|
@ -6389,9 +6309,9 @@ function activeRig(instance)
|
|||
}
|
||||
}
|
||||
|
||||
var g_lastDecodeCallsign = "";
|
||||
var g_lastTransmitCallsign = {};
|
||||
var g_lastStatusCallsign = {};
|
||||
var g_lastTxMessage = null;
|
||||
|
||||
function handleWsjtxStatus(newMessage)
|
||||
{
|
||||
|
@ -6431,11 +6351,7 @@ function handleWsjtxStatus(newMessage)
|
|||
|
||||
if (!(newMessage.instance in g_lastStatusCallsign)) { g_lastStatusCallsign[newMessage.instance] = ""; }
|
||||
|
||||
if (
|
||||
lookupOnTx.checked == true &&
|
||||
newMessage.Transmitting == 1 &&
|
||||
g_lastTransmitCallsign[newMessage.instance] != DXcall
|
||||
)
|
||||
if (lookupOnTx.checked == true && newMessage.Transmitting == 1 && g_lastTransmitCallsign[newMessage.instance] != DXcall)
|
||||
{
|
||||
openLookupWindow(true);
|
||||
g_lastTransmitCallsign[newMessage.instance] = DXcall;
|
||||
|
@ -6470,8 +6386,7 @@ function handleWsjtxStatus(newMessage)
|
|||
|
||||
var bandChange = false;
|
||||
var modeChange = false;
|
||||
var origMode = g_lastMode;
|
||||
var origBand = g_lastBand;
|
||||
|
||||
wsjtxMode.innerHTML = "<font color='orange'>" + newMessage.MO + "</font>";
|
||||
myMode = newMessage.MO;
|
||||
myBand = newMessage.Band;
|
||||
|
@ -6505,28 +6420,20 @@ function handleWsjtxStatus(newMessage)
|
|||
redrawParks();
|
||||
redrawPins();
|
||||
|
||||
var msg = "";
|
||||
|
||||
msg += "<font color='yellow'>" + myBand + "</font> / ";
|
||||
msg += "<font color='orange'>" + myMode + "</font>";
|
||||
var msg = "<font color='yellow'>" + myBand + "</font> / <font color='orange'>" + myMode + "</font>";
|
||||
addLastTraffic(msg);
|
||||
ackAlerts();
|
||||
updateChatWindow();
|
||||
}
|
||||
myRawFreq = newMessage.Frequency;
|
||||
frequency.innerHTML =
|
||||
"<font color='lightgreen'>" +
|
||||
Number(newMessage.Frequency / 1000).formatMhz(3, 3) +
|
||||
" Hz </font><font color='yellow'>(" +
|
||||
myBand +
|
||||
")</font>";
|
||||
myRawCall = newMessage.DEcall.trim();
|
||||
|
||||
myRawFreq = newMessage.Frequency;
|
||||
frequency.innerHTML = "<font color='lightgreen'>" + Number(newMessage.Frequency / 1000).formatMhz(3, 3) + " Hz </font><font color='yellow'>(" + myBand + ")</font>";
|
||||
myRawCall = newMessage.DEcall.trim();
|
||||
myRawGrid = newMessage.DEgrid.trim().substr(0, 6);
|
||||
|
||||
var LL = squareToLatLongAll(myRawGrid);
|
||||
g_mapSettings.latitude = g_myLat = LL.la2 - (LL.la2 - LL.la1) / 2;
|
||||
g_mapSettings.longitude = g_myLon = LL.lo2 - (LL.lo2 - LL.lo1) / 2;
|
||||
var LL = squareToCenter(myRawGrid);
|
||||
g_mapSettings.latitude = g_myLat = LL.a;
|
||||
g_mapSettings.longitude = g_myLon = LL.o;
|
||||
if (myRawGrid != g_lastRawGrid)
|
||||
{
|
||||
g_lastRawGrid = myRawGrid;
|
||||
|
@ -6545,6 +6452,17 @@ function handleWsjtxStatus(newMessage)
|
|||
dxCallBoxDiv.className = "DXCallBoxConfirmed";
|
||||
}
|
||||
|
||||
if (g_appSettings.clearOnCQ && newMessage.Transmitting == 1 && newMessage.TxMessage && g_lastTxMessage != newMessage.TxMessage)
|
||||
{
|
||||
g_lastTxMessage = newMessage.TxMessage;
|
||||
if (newMessage.TxMessage.substring(0, 2) == "CQ" && DXcall.length > 0)
|
||||
{
|
||||
setCallAndGrid("", "", newMessage.instance, false);
|
||||
DXcall = "";
|
||||
newMessage.DXgrid = "";
|
||||
}
|
||||
}
|
||||
|
||||
g_localDXcall = DXcall;
|
||||
localDXcall.innerHTML = DXcall.formatCallsign();
|
||||
if (localDXcall.innerHTML.length == 0)
|
||||
|
@ -6556,10 +6474,7 @@ function handleWsjtxStatus(newMessage)
|
|||
|
||||
if (myDXGrid.length == 0 && hash in g_liveCallsigns)
|
||||
{
|
||||
localDXGrid.innerHTML = myDXGrid = g_liveCallsigns[hash].grid.substr(
|
||||
0,
|
||||
4
|
||||
);
|
||||
localDXGrid.innerHTML = myDXGrid = g_liveCallsigns[hash].grid.substr(0, 4);
|
||||
}
|
||||
|
||||
if (localDXGrid.innerHTML.length == 0)
|
||||
|
@ -6570,39 +6485,28 @@ function handleWsjtxStatus(newMessage)
|
|||
}
|
||||
else
|
||||
{
|
||||
var LL = squareToLatLongAll(myDXGrid);
|
||||
localDXDistance.innerHTML =
|
||||
parseInt(
|
||||
MyCircle.distance(
|
||||
g_myLat,
|
||||
g_myLon,
|
||||
LL.la2 - (LL.la2 - LL.la1) / 2,
|
||||
LL.lo2 - (LL.lo2 - LL.lo1) / 2,
|
||||
distanceUnit.value
|
||||
) * MyCircle.validateRadius(distanceUnit.value)
|
||||
) + distanceUnit.value.toLowerCase();
|
||||
localDXAzimuth.innerHTML =
|
||||
parseInt(
|
||||
MyCircle.bearing(
|
||||
g_myLat,
|
||||
g_myLon,
|
||||
LL.la2 - (LL.la2 - LL.la1) / 2,
|
||||
LL.lo2 - (LL.lo2 - LL.lo1) / 2
|
||||
)
|
||||
) + "°";
|
||||
var LL = squareToCenter(myDXGrid);
|
||||
localDXDistance.innerHTML = parseInt(MyCircle.distance(g_myLat, g_myLon, LL.a, distanceUnit.value) * MyCircle.validateRadius(distanceUnit.value)) + distanceUnit.value.toLowerCase();
|
||||
localDXAzimuth.innerHTML = parseInt(MyCircle.bearing(g_myLat, g_myLon, LL.a, LL.o)) + "°";
|
||||
}
|
||||
|
||||
if (localDXcall.innerHTML != "-")
|
||||
{
|
||||
localDXReport.innerHTML = Number(
|
||||
newMessage.Report.trim()
|
||||
).formatSignalReport();
|
||||
if (DXcall.length > 0) { localDXCountry.innerHTML = g_dxccToAltName[callsignToDxcc(DXcall)]; }
|
||||
else localDXCountry.innerHTML = " ";
|
||||
localDXReport.innerHTML = Number(newMessage.Report.trim()).formatSignalReport();
|
||||
if (DXcall.length > 0)
|
||||
{
|
||||
localDXCountry.innerHTML = g_dxccToAltName[callsignToDxcc(DXcall)];
|
||||
}
|
||||
else
|
||||
{
|
||||
localDXCountry.innerHTML = " ";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
localDXReport.innerHTML = localDXCountry.innerHTML = "";
|
||||
}
|
||||
|
||||
myDEcall = newMessage.DEcall;
|
||||
myDEGrid = newMessage.DEgrid.trim().substr(0, 6);
|
||||
if (myDEGrid.length > 0) setHomeGridsquare();
|
||||
|
@ -6632,37 +6536,24 @@ function handleWsjtxStatus(newMessage)
|
|||
if (g_appSettings.gtShareEnable == "true")
|
||||
{
|
||||
g_gtLiveStatusUpdate = true;
|
||||
g_gtShareCount++;
|
||||
}
|
||||
else g_gtShareCount = 0;
|
||||
|
||||
if (bandChange || modeChange) reloadInfo(bandChange || modeChange);
|
||||
var worker = "";
|
||||
|
||||
worker +=
|
||||
"<div style='vertical-align:top;display:inline-block;margin-right:8px;'>";
|
||||
worker += "<div style='vertical-align:top;display:inline-block;margin-right:8px;'>";
|
||||
worker += "<table class='darkTable' align=center>";
|
||||
worker +=
|
||||
"<tr><th colspan=7>Last " +
|
||||
g_lastMessages.length +
|
||||
" Decoded Messages</th></tr>";
|
||||
worker +=
|
||||
"<tr><th>Time</th><th>dB</th><th>DT</th><th>Freq</th><th>Mode</th><th>Message</th><th>DXCC</th></tr>";
|
||||
worker += "<tr><th colspan=7>Last " + g_lastMessages.length + " Decoded Messages</th></tr>";
|
||||
worker += "<tr><th>Time</th><th>dB</th><th>DT</th><th>Freq</th><th>Mode</th><th>Message</th><th>DXCC</th></tr>";
|
||||
|
||||
worker += g_lastMessages.join("");
|
||||
|
||||
worker += "</table></div>";
|
||||
|
||||
setStatsDiv("decodeLastListDiv", worker);
|
||||
setStatsDivHeight(
|
||||
"decodeLastListDiv",
|
||||
getStatsWindowHeight() + 26 + "px"
|
||||
);
|
||||
setStatsDivHeight("decodeLastListDiv", getStatsWindowHeight() + 26 + "px");
|
||||
|
||||
if (
|
||||
g_appSettings.gtShareEnable === true &&
|
||||
Object.keys(g_spotCollector).length > 0
|
||||
)
|
||||
if (g_appSettings.gtShareEnable === true && Object.keys(g_spotCollector).length > 0)
|
||||
{
|
||||
gtChatSendSpots(g_spotCollector, g_spotDetailsCollector);
|
||||
g_spotCollector = {};
|
||||
|
@ -6677,10 +6568,7 @@ function handleWsjtxStatus(newMessage)
|
|||
|
||||
if (newMessage.TxEnabled)
|
||||
{
|
||||
if (
|
||||
g_mapSettings.fitQRZ &&
|
||||
(!g_spotsEnabled || g_receptionSettings.mergeSpots)
|
||||
)
|
||||
if (g_mapSettings.fitQRZ && (!g_spotsEnabled || g_receptionSettings.mergeSpots))
|
||||
{
|
||||
if (g_lastMapView == null)
|
||||
{
|
||||
|
@ -6692,19 +6580,12 @@ function handleWsjtxStatus(newMessage)
|
|||
{
|
||||
fitViewBetweenPoints([getPoint(myRawGrid), getPoint(myDXGrid)]);
|
||||
}
|
||||
else if (
|
||||
g_mapSettings.qrzDxccFallback &&
|
||||
DXcall.length > 0 &&
|
||||
callsignToDxcc(DXcall) > 0
|
||||
)
|
||||
else if (g_mapSettings.qrzDxccFallback && DXcall.length > 0 && callsignToDxcc(DXcall) > 0)
|
||||
{
|
||||
var dxcc = callsignToDxcc(DXcall);
|
||||
var Lat = g_dxccInfo[dxcc].lat;
|
||||
var Lon = g_dxccInfo[dxcc].lon;
|
||||
fitViewBetweenPoints(
|
||||
[getPoint(myRawGrid), ol.proj.fromLonLat([Lon, Lat])],
|
||||
15
|
||||
);
|
||||
fitViewBetweenPoints([getPoint(myRawGrid), ol.proj.fromLonLat([Lon, Lat])], 15);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6721,6 +6602,7 @@ function handleWsjtxStatus(newMessage)
|
|||
if (newMessage.Transmitting == 0)
|
||||
{
|
||||
// Not Transmitting
|
||||
g_lastTxMessage = null;
|
||||
g_layerSources.transmit.clear();
|
||||
g_transmitFlightPath = null;
|
||||
}
|
||||
|
@ -6733,53 +6615,31 @@ function handleWsjtxStatus(newMessage)
|
|||
txrxdec.innerHTML = "TRANSMIT";
|
||||
g_layerSources.transmit.clear();
|
||||
g_transmitFlightPath = null;
|
||||
if (
|
||||
qrzPathWidthValue.value != 0 &&
|
||||
g_appSettings.gridViewMode != 2 &&
|
||||
validateGridFromString(myRawGrid)
|
||||
)
|
||||
|
||||
if (qrzPathWidthValue.value != 0 && g_appSettings.gridViewMode != 2 && validateGridFromString(myRawGrid))
|
||||
{
|
||||
var strokeColor = getQrzPathColor();
|
||||
var strokeWeight = qrzPathWidthValue.value;
|
||||
var LL = squareToLatLongAll(myRawGrid);
|
||||
var Lat = LL.la2 - (LL.la2 - LL.la1) / 2;
|
||||
var Lon = LL.lo2 - (LL.lo2 - LL.lo1) / 2;
|
||||
var fromPoint = ol.proj.fromLonLat([Lon, Lat]);
|
||||
var LL = squareToCenter(myRawGrid);
|
||||
var fromPoint = ol.proj.fromLonLat([LL.o, LL.a]);
|
||||
var toPoint = null;
|
||||
|
||||
if (validateGridFromString(myDXGrid))
|
||||
{
|
||||
LL = squareToLatLongAll(myDXGrid);
|
||||
Lat = LL.la2 - (LL.la2 - LL.la1) / 2;
|
||||
Lon = LL.lo2 - (LL.lo2 - LL.lo1) / 2;
|
||||
|
||||
toPoint = ol.proj.fromLonLat([Lon, Lat]);
|
||||
LL = squareToCenter(myDXGrid);
|
||||
toPoint = ol.proj.fromLonLat([LL.o, LL.a]);
|
||||
}
|
||||
else if (
|
||||
g_mapSettings.qrzDxccFallback &&
|
||||
DXcall.length > 0 &&
|
||||
callsignToDxcc(DXcall) > 0
|
||||
)
|
||||
else if (g_mapSettings.qrzDxccFallback && DXcall.length > 0 && callsignToDxcc(DXcall) > 0)
|
||||
{
|
||||
var dxcc = callsignToDxcc(DXcall);
|
||||
Lat = g_dxccInfo[dxcc].lat;
|
||||
Lon = g_dxccInfo[dxcc].lon;
|
||||
|
||||
toPoint = ol.proj.fromLonLat([Lon, Lat]);
|
||||
toPoint = ol.proj.fromLonLat([g_dxccInfo[dxcc].lon, g_dxccInfo[dxcc].lat]);
|
||||
|
||||
var locality = g_dxccInfo[dxcc].geo;
|
||||
if (locality == "deleted") locality = null;
|
||||
|
||||
if (locality != null)
|
||||
{
|
||||
var feature = shapeFeature(
|
||||
"qrz",
|
||||
locality,
|
||||
"qrz",
|
||||
"#FFFF0010",
|
||||
"#FF0000FF",
|
||||
1.0
|
||||
);
|
||||
var feature = shapeFeature("qrz", locality, "qrz", "#FFFF0010", "#FF0000FF", 1.0);
|
||||
g_layerSources.transmit.addFeature(feature);
|
||||
}
|
||||
}
|
||||
|
@ -6847,14 +6707,12 @@ function drawTraffic()
|
|||
}
|
||||
trafficDiv.innerHTML = worker;
|
||||
}
|
||||
|
||||
function getPoint(grid)
|
||||
{
|
||||
var LL = squareToLatLongAll(grid);
|
||||
var Lat = LL.la2 - (LL.la2 - LL.la1) / 2;
|
||||
var Lon = LL.lo2 - (LL.lo2 - LL.lo1) / 2;
|
||||
return ol.proj.fromLonLat([Lon, Lat]);
|
||||
var LL = squareToCenter(grid);
|
||||
return ol.proj.fromLonLat([LL.o, LL.a]);
|
||||
}
|
||||
var g_showCQRU = true;
|
||||
|
||||
function fitViewBetweenPoints(points, maxZoom = 20)
|
||||
{
|
||||
|
@ -7045,7 +6903,7 @@ function handleWsjtxDecode(newMessage)
|
|||
newCallsign.qso = false;
|
||||
newCallsign.dxcc = callsignToDxcc(newCallsign.DEcall);
|
||||
newCallsign.px = null;
|
||||
newCallsign.pota = [];
|
||||
newCallsign.pota = null;
|
||||
newCallsign.zone = null;
|
||||
newCallsign.vucc_grids = [];
|
||||
newCallsign.propMode = "";
|
||||
|
@ -7143,61 +7001,51 @@ function handleWsjtxDecode(newMessage)
|
|||
callsign.CQ = CQ;
|
||||
callsign.RR73 = RR73;
|
||||
|
||||
if (msgDXcallsign == myDEcall) callsign.qrz = true;
|
||||
else callsign.qrz = false;
|
||||
callsign.qrz = (msgDXcallsign == myDEcall);
|
||||
|
||||
if (callsign.grid.length > 0 && callsign.distance == 0)
|
||||
{
|
||||
var LL = squareToLatLongAll(callsign.grid);
|
||||
callsign.distance = MyCircle.distance(
|
||||
g_myLat,
|
||||
g_myLon,
|
||||
LL.la2 - (LL.la2 - LL.la1) / 2,
|
||||
LL.lo2 - (LL.lo2 - LL.lo1) / 2,
|
||||
distanceUnit.value
|
||||
);
|
||||
callsign.heading = MyCircle.bearing(
|
||||
g_myLat,
|
||||
g_myLon,
|
||||
LL.la2 - (LL.la2 - LL.la1) / 2,
|
||||
LL.lo2 - (LL.lo2 - LL.lo1) / 2
|
||||
);
|
||||
var LL = squareToCenter(callsign.grid);
|
||||
callsign.distance = MyCircle.distance(g_myLat, g_myLon, LL.a, LL.o, distanceUnit.value);
|
||||
callsign.heading = MyCircle.bearing(g_myLat, g_myLon, LL.a, LL.o);
|
||||
}
|
||||
|
||||
if (g_appSettings.potaEnabled == 1)
|
||||
{
|
||||
callsign.pota = null;
|
||||
if (callsign.DEcall in g_pota.callSpots || callsign.DEcall in g_pota.callSchedule)
|
||||
{
|
||||
callsign.pota = [];
|
||||
var now = Date.now();
|
||||
if (callsign.DEcall in g_pota.callSpots)
|
||||
{
|
||||
// copies the entire array
|
||||
callsign.pota = [...g_pota.callSpots[callsign.DEcall]];
|
||||
if (g_pota.callSpots[callsign.DEcall] in g_pota.parkSpots && g_pota.parkSpots[g_pota.callSpots[callsign.DEcall]][callsign.DEcall].expire > now)
|
||||
{
|
||||
callsign.pota = g_pota.callSpots[callsign.DEcall];
|
||||
}
|
||||
}
|
||||
else if (callsign.DEcall in g_pota.callSchedule)
|
||||
{
|
||||
var now = Date.now();
|
||||
for (var i in g_pota.callSchedule[callsign.DEcall])
|
||||
{
|
||||
if (now < g_pota.callSchedule[callsign.DEcall][i].end && now >= g_pota.callSchedule[callsign.DEcall][i].start)
|
||||
{
|
||||
callsign.pota.push(g_pota.callSchedule[callsign.DEcall][i].id);
|
||||
callsign.pota = g_pota.callSchedule[callsign.DEcall][i].id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (callsign.pota.length > 0)
|
||||
if (callsign.pota)
|
||||
{
|
||||
potaSpotFromDecode(callsign);
|
||||
}
|
||||
else if (CQ == true && msgDXcallsign == "CQ POTA")
|
||||
{
|
||||
callsign.pota = ["?-????"];
|
||||
callsign.pota = "?-????";
|
||||
}
|
||||
}
|
||||
else if (CQ == true && msgDXcallsign == "CQ POTA")
|
||||
{
|
||||
callsign.pota = ["?-????"];
|
||||
callsign.pota = "?-????";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7244,11 +7092,13 @@ function handleWsjtxDecode(newMessage)
|
|||
|
||||
if (g_appSettings.gtSpotEnable === true && callsign.DEcall in g_gtCallsigns)
|
||||
{
|
||||
var key = g_gtCallsigns[callsign.DEcall];
|
||||
if (key in g_gtFlagPins && g_gtFlagPins[key].o == 1)
|
||||
for (const cid in g_gtCallsigns[callsign.DEcall])
|
||||
{
|
||||
g_spotCollector[key] = callsign.RSTsent;
|
||||
g_spotDetailsCollector[key] = [callsign.delta + newMessage.OF, callsign.mode];
|
||||
if (cid in g_gtFlagPins && g_gtFlagPins[cid].o == 1)
|
||||
{
|
||||
g_spotCollector[cid] = callsign.RSTsent;
|
||||
g_spotDetailsCollector[cid] = [callsign.delta + newMessage.OF, callsign.mode];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9524,16 +9374,8 @@ function renderStatsBox()
|
|||
|
||||
if (finalGrid.length > 0)
|
||||
{
|
||||
LL = squareToLatLongAll(finalGrid);
|
||||
unit = parseInt(
|
||||
MyCircle.distance(
|
||||
g_myLat,
|
||||
g_myLon,
|
||||
LL.la2 - (LL.la2 - LL.la1) / 2,
|
||||
LL.lo2 - (LL.lo2 - LL.lo1) / 2,
|
||||
distanceUnit.value
|
||||
) * MyCircle.validateRadius(distanceUnit.value)
|
||||
);
|
||||
LL = squareToCenter(finalGrid);
|
||||
unit = parseInt(MyCircle.distance(g_myLat, g_myLon, LL.a, LL.o, distanceUnit.value) * MyCircle.validateRadius(distanceUnit.value));
|
||||
|
||||
if (unit > long_distance.worked_unit)
|
||||
{
|
||||
|
@ -10798,22 +10640,29 @@ function setGtShareButtons()
|
|||
g_layerVectors.gtflags.setVisible(false);
|
||||
clearGtFlags();
|
||||
// Clear list
|
||||
g_gtFlagPins = {};
|
||||
g_gtFlagPins = Object()
|
||||
g_gtMessages = Object();
|
||||
g_gtUnread = Object();
|
||||
g_gtCallsigns = Object();
|
||||
g_gtSentAwayToCid = Object();
|
||||
|
||||
if (g_chatWindowHandle != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
g_chatWindowHandle.hide();
|
||||
g_chatWindowHandle.window.allCallDiv.innerHTML = "";
|
||||
g_chatWindowHandle.window.updateCount();
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
console.error(e);
|
||||
}
|
||||
}
|
||||
goProcessRoster();
|
||||
}
|
||||
|
||||
gtShareFlagImg.src =
|
||||
g_gtShareFlagImageArray[g_appSettings.gtShareEnable == false ? 0 : 1];
|
||||
gtShareFlagImg.src = g_gtShareFlagImageArray[g_appSettings.gtShareEnable == false ? 0 : 1];
|
||||
}
|
||||
|
||||
function setMulticastIp()
|
||||
|
@ -12324,9 +12173,7 @@ function drawAllGrids()
|
|||
}
|
||||
}
|
||||
|
||||
var LL = twoWideToLatLong(
|
||||
String.fromCharCode(x) + String.fromCharCode(y)
|
||||
);
|
||||
var LL = twoWideToLatLong(String.fromCharCode(x) + String.fromCharCode(y));
|
||||
var Lat = LL.la2 - (LL.la2 - LL.la1) / 2;
|
||||
var Lon = LL.lo2 - (LL.lo2 - LL.lo1) / 2;
|
||||
var point = ol.proj.fromLonLat([Lon, Lat]);
|
||||
|
@ -13080,6 +12927,12 @@ function setPins()
|
|||
}
|
||||
}
|
||||
|
||||
function changeClearOnCQ()
|
||||
{
|
||||
g_appSettings.clearOnCQ = clearOnCQ.checked;
|
||||
saveAppSettings();
|
||||
}
|
||||
|
||||
function loadViewSettings()
|
||||
{
|
||||
gtBandFilter.value = g_appSettings.gtBandFilter;
|
||||
|
@ -13142,6 +12995,8 @@ function loadViewSettings()
|
|||
lookupMerge.checked = g_appSettings.lookupMerge;
|
||||
lookupMissingGrid.checked = g_appSettings.lookupMissingGrid;
|
||||
|
||||
clearOnCQ.checked = g_appSettings.clearOnCQ;
|
||||
|
||||
if (g_appSettings.lookupMerge == true)
|
||||
{
|
||||
lookupMissingGridDiv.style.display = "inline-block";
|
||||
|
@ -13914,6 +13769,15 @@ function updateWsjtxListener(port)
|
|||
{
|
||||
newMessage.ConfName = null;
|
||||
}
|
||||
if (message.length > 0)
|
||||
{
|
||||
newMessage.TxMessage = decodeQUTF8(message);
|
||||
message = message.slice(g_qtToSplice);
|
||||
}
|
||||
else
|
||||
{
|
||||
newMessage.TxMessage = null;
|
||||
}
|
||||
g_instances[instanceId].oldStatus = g_instances[instanceId].status;
|
||||
g_instances[instanceId].status = newMessage;
|
||||
g_instances[instanceId].valid = true;
|
||||
|
@ -15670,11 +15534,8 @@ function mediaCheck()
|
|||
}
|
||||
}
|
||||
|
||||
if (typeof g_QSOhash[i].pota == "undefined" || g_QSOhash[i].pota == null)
|
||||
{
|
||||
g_QSOhash[i].pota = [];
|
||||
}
|
||||
|
||||
g_QSOhash[i].pota = null;
|
||||
|
||||
g_QSOcount++;
|
||||
if (g_QSOhash[i].confirmed) g_QSLcount++;
|
||||
}
|
||||
|
@ -15945,38 +15806,33 @@ function createSpot(report, key, fromPoint, addToLayer = true)
|
|||
{
|
||||
try
|
||||
{
|
||||
var LL = squareToLatLongAll(report.grid);
|
||||
var LL = squareToCenter(report.grid);
|
||||
|
||||
if (isNaN(LL.la1))
|
||||
if (isNaN(LL.a))
|
||||
{
|
||||
// Bad value in grid, don't map //
|
||||
return;
|
||||
}
|
||||
|
||||
var Lat = LL.la2 - (LL.la2 - LL.la1) / 2;
|
||||
var Lon = LL.lo2 - (LL.lo2 - LL.lo1) / 2;
|
||||
|
||||
var spot = spotFeature([Lon, Lat]);
|
||||
var spot = spotFeature([LL.o, LL.a]);
|
||||
|
||||
var colorNoAlpha = "#" + g_bandToColor[report.band];
|
||||
var colorAlpha = intAlphaToRGB(colorNoAlpha, report.color);
|
||||
var spotColor = colorAlpha;
|
||||
|
||||
var workingColor =
|
||||
g_mapSettings.nightMapEnable && g_nightTime
|
||||
? g_receptionSettings.pathNightColor
|
||||
: g_receptionSettings.pathColor;
|
||||
var workingColor = g_mapSettings.nightMapEnable && g_nightTime ? g_receptionSettings.pathNightColor : g_receptionSettings.pathColor;
|
||||
|
||||
if (workingColor != -1)
|
||||
{
|
||||
var testColor =
|
||||
workingColor < 1
|
||||
? "#0000000"
|
||||
: workingColor == 361
|
||||
? "#FFFFFF"
|
||||
: "hsla(" + workingColor + ", 100%, 50%," + report.color / 255 + ")";
|
||||
if (workingColor < 1 || workingColor == 361) { spotColor = intAlphaToRGB(testColor.substr(0, 7), report.color); }
|
||||
else spotColor = testColor;
|
||||
var testColor = workingColor < 1 ? "#0000000" : workingColor == 361 ? "#FFFFFF" : "hsla(" + workingColor + ", 100%, 50%," + report.color / 255 + ")";
|
||||
if (workingColor < 1 || workingColor == 361)
|
||||
{
|
||||
spotColor = intAlphaToRGB(testColor.substr(0, 7), report.color);
|
||||
}
|
||||
else
|
||||
{
|
||||
spotColor = testColor;
|
||||
}
|
||||
}
|
||||
|
||||
featureStyle = new ol.style.Style({
|
||||
|
@ -15993,7 +15849,7 @@ function createSpot(report, key, fromPoint, addToLayer = true)
|
|||
spot.size = 6; // Mouseover detection
|
||||
g_layerSources["psk-spots"].addFeature(spot);
|
||||
|
||||
var toPoint = ol.proj.fromLonLat([Lon, Lat]);
|
||||
var toPoint = ol.proj.fromLonLat([LL.o, LL.a]);
|
||||
|
||||
var lonLat = new ol.geom.Point(toPoint);
|
||||
|
||||
|
@ -16015,7 +15871,7 @@ function createSpot(report, key, fromPoint, addToLayer = true)
|
|||
? g_spotNightFlightColor
|
||||
: g_spotFlightColor;
|
||||
|
||||
var feature = flightFeature(
|
||||
flightFeature(
|
||||
[fromPoint, toPoint],
|
||||
{
|
||||
weight: strokeWeight,
|
||||
|
|
|
@ -38,7 +38,6 @@ var g_gtChatSocket = null;
|
|||
var g_gtFlagPins = Object();
|
||||
var g_gtMessages = Object();
|
||||
var g_gtUnread = Object();
|
||||
var g_gtIdToCid = Object();
|
||||
var g_gtCallsigns = Object();
|
||||
var g_gtSentAwayToCid = Object();
|
||||
|
||||
|
@ -47,13 +46,14 @@ var g_gtStatusCount = 0;
|
|||
var g_gtStatusTime = 500;
|
||||
var g_gtMaxChatMessages = 100;
|
||||
var g_gtNeedUsersList = true;
|
||||
var g_gtUuidValid = false;
|
||||
|
||||
var g_gtLiveStatusUpdate = false;
|
||||
|
||||
var myChatId = 0;
|
||||
|
||||
var myRoom = 0;
|
||||
var g_gtChatlistChangeCount = 0;
|
||||
|
||||
var g_gtCurrentMessageCount = 0;
|
||||
|
||||
function gtConnectChat()
|
||||
|
@ -165,17 +165,25 @@ function gtClosedSocket()
|
|||
g_gtState = ChatState.none;
|
||||
}
|
||||
|
||||
// Connect 15 seconds after startup
|
||||
var g_lastConnectAttempt = parseInt(Date.now() / 1000) - 15;
|
||||
|
||||
function gtCanConnect()
|
||||
{
|
||||
g_lastConnectAttempt = timeNowSec();
|
||||
g_gtState = ChatState.connect;
|
||||
}
|
||||
|
||||
function gtSetIdle()
|
||||
{
|
||||
g_gtStatusCount = 0;
|
||||
g_gtNeedUsersList = true;
|
||||
g_gtState = ChatState.idle;
|
||||
g_lastGtStatus = "";
|
||||
if (timeNowSec() - g_lastConnectAttempt >= 30)
|
||||
{
|
||||
g_gtStatusCount = 0;
|
||||
g_gtNeedUsersList = true;
|
||||
g_gtState = ChatState.idle;
|
||||
g_lastGtStatus = "";
|
||||
}
|
||||
g_gtUuidValid = false;
|
||||
}
|
||||
|
||||
function gtStatusCheck()
|
||||
|
@ -204,11 +212,11 @@ function gtStatusCheck()
|
|||
}
|
||||
}
|
||||
|
||||
function sendGtJson(json)
|
||||
function sendGtJson(json, isUUIDrequest = false)
|
||||
{
|
||||
if (g_gtChatSocket != null)
|
||||
{
|
||||
if (g_gtChatSocket.readyState === WebSocket.OPEN)
|
||||
if (g_gtChatSocket.readyState === WebSocket.OPEN && (isUUIDrequest || g_gtUuidValid))
|
||||
{
|
||||
g_gtChatSocket.send(json);
|
||||
}
|
||||
|
@ -220,7 +228,8 @@ function sendGtJson(json)
|
|||
}
|
||||
}
|
||||
}
|
||||
else g_gtState = ChatState.closed;
|
||||
// if we don't have a socketHandle, don't go changing the state willy nilly!
|
||||
// else g_gtState = ChatState.closed;
|
||||
}
|
||||
|
||||
var g_lastGtStatus = "";
|
||||
|
@ -263,34 +272,46 @@ function gtChatSendSpots(spotsObject, detailsObject)
|
|||
function gtChatRemoveCall(jsmesg)
|
||||
{
|
||||
var id = jsmesg.id;
|
||||
if (id in g_gtIdToCid)
|
||||
var cid = jsmesg.cid;
|
||||
|
||||
if (cid in g_gtFlagPins)
|
||||
{
|
||||
var cid = g_gtIdToCid[id];
|
||||
if (cid in g_gtFlagPins)
|
||||
if (id in g_gtFlagPins[cid].ids)
|
||||
{
|
||||
delete g_gtFlagPins[cid].ids[id];
|
||||
if (Object.keys(g_gtFlagPins[cid].ids).length == 0)
|
||||
}
|
||||
else
|
||||
{
|
||||
console.log("drop: No such id in g_gtFlagPins.ids:");
|
||||
console.log(jsmesg);
|
||||
console.log(g_gtFlagPins[cid].ids);
|
||||
}
|
||||
|
||||
if (Object.keys(g_gtFlagPins[cid].ids).length == 0)
|
||||
{
|
||||
delete g_gtCallsigns[g_gtFlagPins[cid].call][cid];
|
||||
|
||||
if (g_gtFlagPins[cid].pin != null)
|
||||
{
|
||||
if (g_gtFlagPins[cid].pin != null)
|
||||
{
|
||||
// remove pin from map here
|
||||
if (g_layerSources.gtflags.hasFeature(g_gtFlagPins[cid].pin))
|
||||
{ g_layerSources.gtflags.removeFeature(g_gtFlagPins[cid].pin); }
|
||||
delete g_gtFlagPins[cid].pin;
|
||||
g_gtFlagPins[cid].pin = null;
|
||||
}
|
||||
g_gtFlagPins[cid].live = false;
|
||||
notifyNoChat(cid);
|
||||
if (!(cid in g_gtMessages))
|
||||
// remove pin from map here
|
||||
if (g_layerSources.gtflags.hasFeature(g_gtFlagPins[cid].pin))
|
||||
{ g_layerSources.gtflags.removeFeature(g_gtFlagPins[cid].pin); }
|
||||
delete g_gtFlagPins[cid].pin;
|
||||
g_gtFlagPins[cid].pin = null;
|
||||
}
|
||||
g_gtFlagPins[cid].live = false;
|
||||
notifyNoChat(cid);
|
||||
if (!(cid in g_gtMessages))
|
||||
{
|
||||
if (Object.keys(g_gtCallsigns[g_gtFlagPins[cid].call]).length == 0)
|
||||
{
|
||||
delete g_gtCallsigns[g_gtFlagPins[cid].call];
|
||||
delete g_gtFlagPins[cid];
|
||||
}
|
||||
|
||||
updateChatWindow();
|
||||
delete g_gtFlagPins[cid];
|
||||
}
|
||||
|
||||
updateChatWindow(cid);
|
||||
}
|
||||
delete g_gtIdToCid[id];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -303,7 +324,7 @@ function gtChatUpdateCall(jsmesg)
|
|||
{
|
||||
g_gtFlagPins[cid].ids[id] = true;
|
||||
// Did they move grid location?
|
||||
if (g_gtFlagPins[cid].pin != null)
|
||||
if (jsmesg.grid != g_gtFlagPins[cid].grid && g_gtFlagPins[cid].pin != null)
|
||||
{
|
||||
// remove pin from map here
|
||||
if (g_layerSources.gtflags.hasFeature(g_gtFlagPins[cid].pin))
|
||||
|
@ -311,6 +332,11 @@ function gtChatUpdateCall(jsmesg)
|
|||
delete g_gtFlagPins[cid].pin;
|
||||
g_gtFlagPins[cid].pin = null;
|
||||
}
|
||||
// Changed callsign?
|
||||
if (g_gtFlagPins[cid].call != jsmesg.call)
|
||||
{
|
||||
delete g_gtCallsigns[g_gtFlagPins[cid].call][cid];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -319,7 +345,6 @@ function gtChatUpdateCall(jsmesg)
|
|||
g_gtFlagPins[cid].ids = Object();
|
||||
g_gtFlagPins[cid].ids[id] = true;
|
||||
}
|
||||
g_gtIdToCid[jsmesg.id] = jsmesg.cid;
|
||||
|
||||
g_gtFlagPins[cid].cid = jsmesg.cid;
|
||||
g_gtFlagPins[cid].call = jsmesg.call;
|
||||
|
@ -342,9 +367,15 @@ function gtChatUpdateCall(jsmesg)
|
|||
g_layerSources.gtflags.addFeature(g_gtFlagPins[cid].pin);
|
||||
}
|
||||
}
|
||||
g_gtChatlistChangeCount++;
|
||||
g_gtCallsigns[g_gtFlagPins[cid].call] = cid;
|
||||
updateChatWindow();
|
||||
|
||||
if (!(g_gtFlagPins[cid].call in g_gtCallsigns))
|
||||
{
|
||||
// Can happen when a user changes callsign
|
||||
g_gtCallsigns[g_gtFlagPins[cid].call] = Object();
|
||||
}
|
||||
g_gtCallsigns[g_gtFlagPins[cid].call][cid] = true;
|
||||
|
||||
updateChatWindow(cid);
|
||||
}
|
||||
|
||||
function gtChatGetList()
|
||||
|
@ -370,7 +401,9 @@ function redrawPins()
|
|||
makeGtPin(g_gtFlagPins[cid]);
|
||||
|
||||
if (g_gtFlagPins[cid].pin != null)
|
||||
{ g_layerSources.gtflags.addFeature(g_gtFlagPins[cid].pin); }
|
||||
{
|
||||
g_layerSources.gtflags.addFeature(g_gtFlagPins[cid].pin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -381,7 +414,9 @@ function makeGtPin(obj)
|
|||
if (obj.pin)
|
||||
{
|
||||
if (g_layerSources.gtflags.hasFeature(obj.pin))
|
||||
{ g_layerSources.gtflags.removeFeature(obj.pin); }
|
||||
{
|
||||
g_layerSources.gtflags.removeFeature(obj.pin);
|
||||
}
|
||||
delete obj.pin;
|
||||
obj.pin = null;
|
||||
}
|
||||
|
@ -394,19 +429,13 @@ function makeGtPin(obj)
|
|||
|
||||
if (validateGridFromString(obj.grid) == false) return;
|
||||
|
||||
if (
|
||||
g_appSettings.gtFlagImgSrc == 2 &&
|
||||
(obj.mode != myMode || obj.band != myBand)
|
||||
)
|
||||
{ return; }
|
||||
if (g_appSettings.gtFlagImgSrc == 2 && (obj.mode != myMode || obj.band != myBand))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var LL = squareToLatLongAll(obj.grid);
|
||||
var myLonLat = [
|
||||
LL.lo2 - (LL.lo2 - LL.lo1) / 2,
|
||||
LL.la2 - (LL.la2 - LL.la1) / 2
|
||||
];
|
||||
|
||||
obj.pin = iconFeature(ol.proj.fromLonLat(myLonLat), g_gtFlagIcon, 100);
|
||||
var LL = squareToCenter(obj.grid);
|
||||
obj.pin = iconFeature(ol.proj.fromLonLat([LL.o, LL.a]), g_gtFlagIcon, 100);
|
||||
obj.pin.key = obj.cid;
|
||||
obj.pin.isGtFlag = true;
|
||||
obj.pin.size = 1;
|
||||
|
@ -418,14 +447,12 @@ function gtChatNewList(jsmesg)
|
|||
{
|
||||
clearGtFlags();
|
||||
|
||||
for (var cid in g_gtFlagPins)
|
||||
{
|
||||
g_gtFlagPins[cid].live = false;
|
||||
if (!(cid in g_gtMessages))
|
||||
{
|
||||
delete g_gtFlagPins[cid];
|
||||
}
|
||||
}
|
||||
// starting clean if we're getting a new chat list
|
||||
g_gtFlagPins = Object()
|
||||
g_gtMessages = Object();
|
||||
g_gtUnread = Object();
|
||||
g_gtCallsigns = Object();
|
||||
g_gtSentAwayToCid = Object();
|
||||
|
||||
for (var key in jsmesg.data.calls)
|
||||
{
|
||||
|
@ -445,7 +472,6 @@ function gtChatNewList(jsmesg)
|
|||
g_gtFlagPins[cid].pin = null;
|
||||
}
|
||||
|
||||
g_gtIdToCid[id] = cid;
|
||||
g_gtFlagPins[cid].call = jsmesg.data.calls[key];
|
||||
g_gtFlagPins[cid].fCall = g_gtFlagPins[cid].call.formatCallsign();
|
||||
g_gtFlagPins[cid].grid = jsmesg.data.grid[key];
|
||||
|
@ -458,7 +484,13 @@ function gtChatNewList(jsmesg)
|
|||
g_gtFlagPins[cid].o = jsmesg.data.o[key];
|
||||
g_gtFlagPins[cid].dxcc = callsignToDxcc(g_gtFlagPins[cid].call);
|
||||
g_gtFlagPins[cid].live = true;
|
||||
g_gtCallsigns[g_gtFlagPins[cid].call] = cid;
|
||||
|
||||
if (!(g_gtFlagPins[cid].call in g_gtCallsigns))
|
||||
{
|
||||
g_gtCallsigns[g_gtFlagPins[cid].call] = Object();
|
||||
}
|
||||
|
||||
g_gtCallsigns[g_gtFlagPins[cid].call][cid] = true;
|
||||
|
||||
makeGtPin(g_gtFlagPins[cid]);
|
||||
|
||||
|
@ -468,7 +500,6 @@ function gtChatNewList(jsmesg)
|
|||
}
|
||||
}
|
||||
}
|
||||
g_gtChatlistChangeCount++;
|
||||
|
||||
updateChatWindow();
|
||||
}
|
||||
|
@ -555,7 +586,7 @@ function gtChatSendUUID()
|
|||
msg.call = myDEcall;
|
||||
msg.ver = gtShortVersion;
|
||||
|
||||
sendGtJson(JSON.stringify(msg));
|
||||
sendGtJson(JSON.stringify(msg), true);
|
||||
}
|
||||
|
||||
function gtChatSetUUID(jsmesg)
|
||||
|
@ -563,17 +594,18 @@ function gtChatSetUUID(jsmesg)
|
|||
g_appSettings.chatUUID = jsmesg.uuid;
|
||||
myChatId = jsmesg.id;
|
||||
|
||||
g_gtUuidValid = true;
|
||||
gtChatSendStatus();
|
||||
|
||||
g_gtLiveStatusUpdate = false;
|
||||
g_gtStatusCount = g_gtStatusTime;
|
||||
g_gtState = ChatState.status;
|
||||
}
|
||||
|
||||
var g_getEngineWasRunning = false;
|
||||
|
||||
function gtChatStateMachine()
|
||||
{
|
||||
if (
|
||||
g_appSettings.gtShareEnable == true &&
|
||||
g_mapSettings.offlineMode == false
|
||||
)
|
||||
if (g_appSettings.gtShareEnable == true && g_mapSettings.offlineMode == false)
|
||||
{
|
||||
var now = timeNowSec();
|
||||
g_gtStateToFunction[g_gtState]();
|
||||
|
@ -584,22 +616,23 @@ function gtChatStateMachine()
|
|||
}
|
||||
else msgImg.style.webkitFilter = "";
|
||||
|
||||
if (
|
||||
g_msgSettings.msgFrequencySelect > 0 &&
|
||||
Object.keys(g_gtUnread).length > 0
|
||||
)
|
||||
if (g_msgSettings.msgFrequencySelect > 0 && Object.keys(g_gtUnread).length > 0)
|
||||
{
|
||||
if (now - g_lastChatMsgAlert > g_msgSettings.msgFrequencySelect * 60)
|
||||
{
|
||||
alertChatMessage();
|
||||
}
|
||||
}
|
||||
g_getEngineWasRunning = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
closeGtSocket();
|
||||
g_gtChatlistChangeCount = 0;
|
||||
g_lastGtStatus = "";
|
||||
if (g_getEngineWasRunning == true)
|
||||
{
|
||||
g_getEngineWasRunning = false;
|
||||
closeGtSocket();
|
||||
g_lastGtStatus = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -690,13 +723,20 @@ function notifyNoChat(id)
|
|||
}
|
||||
}
|
||||
|
||||
function updateChatWindow()
|
||||
function updateChatWindow(id = null)
|
||||
{
|
||||
if (g_chatWindowHandle != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
g_chatWindowHandle.window.updateEverything();
|
||||
if (id)
|
||||
{
|
||||
g_chatWindowHandle.window.updateCallsign(id);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_chatWindowHandle.window.updateEverything();
|
||||
}
|
||||
}
|
||||
catch (e) {}
|
||||
}
|
||||
|
@ -712,9 +752,9 @@ function newChatMessage(id, jsmesg)
|
|||
try
|
||||
{
|
||||
hasFocus = g_chatWindowHandle.window.newChatMessage(id, jsmesg);
|
||||
g_chatWindowHandle.window.messagesRedraw();
|
||||
}
|
||||
catch (e) {}
|
||||
updateChatWindow();
|
||||
}
|
||||
return hasFocus;
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ var g_potaSpotTemplate = {
|
|||
band: "",
|
||||
reference: "",
|
||||
spotTime: 0,
|
||||
expire: 0,
|
||||
spotter: "",
|
||||
comments: "",
|
||||
source: "GT",
|
||||
|
@ -132,10 +133,10 @@ function makeParkFeatures()
|
|||
{
|
||||
if (park in g_pota.parks)
|
||||
{
|
||||
let parkObj = Object.assign({}, g_parkTemplate);
|
||||
var parkObj = Object.assign({}, g_parkTemplate);
|
||||
for (const call in g_pota.parkSpots[park])
|
||||
{
|
||||
let report = g_pota.parkSpots[park][call];
|
||||
var 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);
|
||||
|
@ -158,85 +159,105 @@ function makeParkFeatures()
|
|||
|
||||
function potaSpotFromDecode(callObj)
|
||||
{
|
||||
for (const i in callObj.pota)
|
||||
if (myDEcall != "" && myDEcall != "NOCALL")
|
||||
{
|
||||
let park = callObj.pota[i];
|
||||
let spotObj = null;
|
||||
var park = callObj.pota;
|
||||
|
||||
if (!(callObj.DEcall in g_pota.callSpots))
|
||||
if (callObj.DEcall in g_pota.callSpots && park in g_pota.parkSpots)
|
||||
{
|
||||
// new call and park
|
||||
g_pota.callSpots[callObj.DEcall] = [park];
|
||||
}
|
||||
else if (!g_pota.callSpots[callObj.DEcall].includes(park))
|
||||
{
|
||||
// new park
|
||||
g_pota.callSpots[callObj.DEcall].push(park);
|
||||
}
|
||||
// update spot
|
||||
var newObj = spotFromCallObj(callObj, park, g_pota.parkSpots[park][callObj.DEcall].count);
|
||||
g_pota.parkSpots[park][callObj.DEcall] = fillObjectFromTemplate(g_pota.parkSpots[park][callObj.DEcall], newObj);
|
||||
|
||||
if (!(park in g_pota.parkSpots))
|
||||
{
|
||||
g_pota.parkSpots[park] = {};
|
||||
g_pota.parkSpots[park][callObj.DEcall] = spotFromCallObj(callObj, park, 0, 0);
|
||||
// may or may not be on screen, so try
|
||||
if (g_appSettings.potaMapEnabled)
|
||||
{
|
||||
addParkSpotFeature(park, g_pota.parkSpots[park][callObj.DEcall]);
|
||||
}
|
||||
|
||||
var hash = park + callObj.DEcall;
|
||||
if (!(hash in g_pota.rbnReportTimes) || Date.now() > g_pota.rbnReportTimes[hash])
|
||||
{
|
||||
g_pota.rbnReportTimes[hash] = Date.now() + g_pota.rbnFrequency;
|
||||
reportPotaRBN(g_pota.parkSpots[park][callObj.DEcall]);
|
||||
}
|
||||
}
|
||||
else if (!(callObj.DEcall in g_pota.parkSpots[park]))
|
||||
else if (callObj.DEcall in g_pota.callSchedule)
|
||||
{
|
||||
g_pota.parkSpots[park][callObj.DEcall] = spotFromCallObj(callObj, park, 0, 0);
|
||||
// Looks like it's scheduled, so it's new
|
||||
g_pota.callSpots[callObj.DEcall] = park;
|
||||
|
||||
if (!(park in g_pota.parkSpots))
|
||||
{
|
||||
g_pota.parkSpots[park] = {};
|
||||
}
|
||||
|
||||
var newObj = spotFromCallObj(callObj, park, 0);
|
||||
newObj.expire = newObj.spotTime + 300000;
|
||||
g_pota.parkSpots[park][callObj.DEcall] = newObj;
|
||||
|
||||
if (g_appSettings.potaMapEnabled)
|
||||
{
|
||||
addParkSpotFeature(park, g_pota.parkSpots[park][callObj.DEcall]);
|
||||
}
|
||||
|
||||
var hash = park + callObj.DEcall;
|
||||
if (!(hash in g_pota.rbnReportTimes) || Date.now() > g_pota.rbnReportTimes[hash])
|
||||
{
|
||||
g_pota.rbnReportTimes[hash] = Date.now() + g_pota.rbnFrequency;
|
||||
reportPotaRBN(g_pota.parkSpots[park][callObj.DEcall]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// update spot
|
||||
g_pota.parkSpots[park][callObj.DEcall] = spotFromCallObj(callObj, park, g_pota.parkSpots[park][callObj.DEcall].count);
|
||||
}
|
||||
|
||||
// may or may not be on screen, so try
|
||||
if (g_appSettings.potaMapEnabled)
|
||||
{
|
||||
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.rbnReportTimes[hash] = Date.now() + g_pota.rbnFrequency;
|
||||
reportPotaRBN(g_pota.parkSpots[park][callObj.DEcall]);
|
||||
if (!(callObj.DEcall in g_pota.callSpots))
|
||||
{
|
||||
console.log("No call spot: " + callObj.DEcall);
|
||||
}
|
||||
if (!(park in g_pota.parkSpots))
|
||||
{
|
||||
console.log("No park spot: " + park);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function reportPotaRBN(callSpot)
|
||||
{
|
||||
let report = {
|
||||
activator: callSpot.activator,
|
||||
spotter: myDEcall + "-#",
|
||||
frequency: String(parseInt(callSpot.frequency * 1000)),
|
||||
reference: callSpot.reference,
|
||||
mode: callSpot.mode,
|
||||
source: "RBN",
|
||||
comments: callSpot.comments,
|
||||
activatorGrid: callSpot.activatorGrid,
|
||||
spotterGrid: callSpot.spotterGrid
|
||||
}
|
||||
|
||||
if (Number(report.frequency) > 0)
|
||||
if (Date.now() < callSpot.expire)
|
||||
{
|
||||
getPostJSONBuffer(
|
||||
"https://api.pota.app/spot",
|
||||
rbnReportResult,
|
||||
null,
|
||||
"https",
|
||||
443,
|
||||
report,
|
||||
10000,
|
||||
null,
|
||||
null
|
||||
);
|
||||
var report = {
|
||||
activator: callSpot.activator,
|
||||
spotter: myDEcall + "-#",
|
||||
frequency: String(parseInt(callSpot.frequency * 1000)),
|
||||
reference: callSpot.reference,
|
||||
mode: callSpot.mode,
|
||||
source: "RBN",
|
||||
comments: callSpot.comments,
|
||||
activatorGrid: callSpot.activatorGrid,
|
||||
spotterGrid: callSpot.spotterGrid
|
||||
};
|
||||
|
||||
if (Number(report.frequency) > 0)
|
||||
{
|
||||
getPostJSONBuffer(
|
||||
"https://api.pota.app/spot",
|
||||
rbnReportResult,
|
||||
null,
|
||||
"https",
|
||||
443,
|
||||
report,
|
||||
10000,
|
||||
null,
|
||||
null
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function reportPotaQSO(record)
|
||||
{
|
||||
let report = {
|
||||
var report = {
|
||||
activator: record.CALL,
|
||||
spotter: record.STATION_CALLSIGN,
|
||||
frequency: record.FREQ,
|
||||
|
@ -246,7 +267,7 @@ function reportPotaQSO(record)
|
|||
comments: record.COMMENT ? record.COMMENT : "",
|
||||
activatorGrid: record.GRIDSQUARE ? record.GRIDSQUARE : "",
|
||||
spotterGrid: record.MY_GRIDSQUARE ? record.MY_GRIDSQUARE : ""
|
||||
}
|
||||
};
|
||||
|
||||
if ("SUBMODE" in record)
|
||||
{
|
||||
|
@ -282,7 +303,7 @@ function rbnReportResult(buffer, flag, cookies)
|
|||
|
||||
function spotFromCallObj(callObj, park, inCount, rbnTime)
|
||||
{
|
||||
let callSpot = {
|
||||
var callSpot = {
|
||||
activator: callObj.DEcall,
|
||||
activatorGrid: callObj.grid,
|
||||
spotter: myDEcall + "-#",
|
||||
|
@ -301,7 +322,7 @@ function spotFromCallObj(callObj, park, inCount, rbnTime)
|
|||
|
||||
function addParkSpotFeature(park, report)
|
||||
{
|
||||
let parkObj = Object.assign({}, g_parkTemplate);
|
||||
var parkObj = Object.assign({}, g_parkTemplate);
|
||||
if (park in g_pota.mapParks)
|
||||
{
|
||||
parkObj = g_pota.mapParks[park];
|
||||
|
@ -326,11 +347,11 @@ function processPotaParks(buffer)
|
|||
{
|
||||
try
|
||||
{
|
||||
let data = JSON.parse(buffer);
|
||||
let newParks = data.parks;
|
||||
var data = JSON.parse(buffer);
|
||||
var newParks = data.parks;
|
||||
for (const park in newParks)
|
||||
{
|
||||
let locations = newParks[park].locationDesc.split(",");
|
||||
var locations = newParks[park].locationDesc.split(",");
|
||||
for (const i in locations)
|
||||
{
|
||||
if (locations[i] in data.locations)
|
||||
|
@ -381,7 +402,7 @@ function getPotaParks()
|
|||
// This is a shallow copy, don't use with objects that contain other objects or arrays
|
||||
function fillObjectFromTemplate(template, input)
|
||||
{
|
||||
let object = {};
|
||||
var object = {};
|
||||
for (const key in template)
|
||||
{
|
||||
if (key in input)
|
||||
|
@ -399,7 +420,7 @@ function fillObjectFromTemplate(template, input)
|
|||
|
||||
function uniqueArrayFromArray(input)
|
||||
{
|
||||
let unique = [];
|
||||
var unique = [];
|
||||
input.forEach((c) =>
|
||||
{
|
||||
if (!unique.includes(c))
|
||||
|
@ -416,37 +437,36 @@ function processPotaSpots(buffer)
|
|||
{
|
||||
try
|
||||
{
|
||||
let spots = JSON.parse(buffer);
|
||||
var spots = JSON.parse(buffer);
|
||||
g_pota.callSpots = {};
|
||||
g_pota.parkSpots = {};
|
||||
for (const spot in spots)
|
||||
{
|
||||
if (spots[spot].reference in g_pota.parks)
|
||||
{
|
||||
let newSpot = fillObjectFromTemplate(g_potaSpotTemplate, spots[spot]);
|
||||
var newSpot = fillObjectFromTemplate(g_potaSpotTemplate, spots[spot]);
|
||||
newSpot.spotTime = Date.parse(newSpot.spotTime + "Z");
|
||||
newSpot.frequency = parseInt(newSpot.frequency) / 1000;
|
||||
newSpot.expire = newSpot.spotTime + (Number(newSpot.expire) * 1000);
|
||||
newSpot.band = newSpot.frequency.formatBand();
|
||||
if (newSpot.spotter == newSpot.activator && newSpot.comments.match(/qrt/gi))
|
||||
{
|
||||
// don't add the spot, they have self-QRT'ed
|
||||
}
|
||||
else if (Date.now() > newSpot.expire)
|
||||
{
|
||||
// Spot is expired!
|
||||
}
|
||||
else
|
||||
{
|
||||
(g_pota.callSpots[newSpot.activator] = g_pota.callSpots[newSpot.activator] || []).push(newSpot.reference);
|
||||
g_pota.callSpots[newSpot.activator] = newSpot.reference;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
g_pota.parkSpots[newSpot.reference][newSpot.activator] = newSpot;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -454,12 +474,6 @@ function processPotaSpots(buffer)
|
|||
console.log("PotaSpots: unknown park id: " + spots[spot].reference);
|
||||
}
|
||||
}
|
||||
|
||||
// Sanity dedupe checks
|
||||
for (const spot in g_pota.callSpots)
|
||||
{
|
||||
g_pota.callSpots[spot] = uniqueArrayFromArray(g_pota.callSpots[spot]);
|
||||
}
|
||||
|
||||
redrawParks();
|
||||
}
|
||||
|
@ -498,12 +512,12 @@ function processPotaSchedule(buffer)
|
|||
{
|
||||
try
|
||||
{
|
||||
let schedules = JSON.parse(buffer);
|
||||
var schedules = JSON.parse(buffer);
|
||||
g_pota.callSchedule = {};
|
||||
g_pota.parkSchedule = {};
|
||||
for (const i in schedules)
|
||||
{
|
||||
let newObj = {};
|
||||
var newObj = {};
|
||||
newObj.id = schedules[i].reference;
|
||||
newObj.start = Date.parse(schedules[i].startDate + "T" + schedules[i].startTime + "Z");
|
||||
newObj.end = Date.parse(schedules[i].endDate + "T" + schedules[i].endTime + "Z");
|
||||
|
@ -608,10 +622,10 @@ function mouseParkMove()
|
|||
|
||||
function createParkTipTable(toolElement)
|
||||
{
|
||||
let worker = "";
|
||||
var worker = "";
|
||||
|
||||
let key = toolElement.key;
|
||||
let now = Date.now();
|
||||
var key = toolElement.key;
|
||||
var now = Date.now();
|
||||
|
||||
worker += "<div style='background-color:#000;color:lightgreen;font-weight:bold;font-size:12px;border:1px solid gray;margin:0px' class='roundBorder'>" +
|
||||
key +
|
||||
|
@ -645,8 +659,8 @@ function createParkTipTable(toolElement)
|
|||
buffer += "<tr><th>Activator</th><th>Start</th><th>End</th><th>Frequencies</th><th>Comment</th></tr>";
|
||||
for (const i in g_pota.parkSchedule[key])
|
||||
{
|
||||
let start = g_pota.parkSchedule[key][i].start;
|
||||
let end = g_pota.parkSchedule[key][i].end;
|
||||
var start = g_pota.parkSchedule[key][i].start;
|
||||
var end = g_pota.parkSchedule[key][i].end;
|
||||
if (now < end)
|
||||
{
|
||||
buffer += "<tr>";
|
||||
|
|
|
@ -117,16 +117,20 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
}
|
||||
|
||||
// Calls that have OAMS chat support
|
||||
if (
|
||||
callsign in window.opener.g_gtCallsigns &&
|
||||
window.opener.g_gtCallsigns[callsign] in window.opener.g_gtFlagPins &&
|
||||
window.opener.g_gtFlagPins[window.opener.g_gtCallsigns[callsign]].canmsg == true
|
||||
)
|
||||
if (callsign in window.opener.g_gtCallsigns)
|
||||
{
|
||||
callObj.callFlags.oams = true;
|
||||
// grab the CID
|
||||
callObj.gt = window.opener.g_gtCallsigns[callsign];
|
||||
hasGtPin = true;
|
||||
callObj.gt = 0;
|
||||
for (const cid in window.opener.g_gtCallsigns[callsign])
|
||||
{
|
||||
if (cid in window.opener.g_gtFlagPins && window.opener.g_gtFlagPins[cid].canmsg == true)
|
||||
{
|
||||
// found the first one we can message, break now
|
||||
callObj.callFlags.oams = true;
|
||||
callObj.gt = cid;
|
||||
hasGtPin = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -518,17 +522,15 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
}
|
||||
|
||||
// Hunting for POTAs
|
||||
if (potaEnabled && huntPOTA.checked == true && callObj.pota.length > 0)
|
||||
if (potaEnabled && huntPOTA.checked == true && callObj.pota)
|
||||
{
|
||||
let huntTotal = callObj.pota.length;
|
||||
let huntTotal = 1;
|
||||
let workedFound = 0;
|
||||
|
||||
for (const index in callObj.pota)
|
||||
{
|
||||
let hash = g_dayAsString + callsign + callObj.pota[index] + (rosterSettings.layeredMode ? layeredHashSuffix : workHashSuffix);
|
||||
let hash = g_dayAsString + callsign + callObj.pota + (rosterSettings.layeredMode ? layeredHashSuffix : workHashSuffix);
|
||||
|
||||
if (rosterSettings.workedIndex && hash in rosterSettings.workedIndex.pota) workedFound++;
|
||||
}
|
||||
if (rosterSettings.workedIndex && hash in rosterSettings.workedIndex.pota) workedFound++;
|
||||
|
||||
if (workedFound != huntTotal)
|
||||
{
|
||||
shouldAlert = true;
|
||||
|
|
|
@ -400,14 +400,9 @@ const ROSTER_COLUMNS = {
|
|||
|
||||
function potaColumnRef(callObj)
|
||||
{
|
||||
if (callObj.pota.length > 0)
|
||||
if (callObj.pota)
|
||||
{
|
||||
let value = callObj.pota[0];
|
||||
if (callObj.pota.length > 1)
|
||||
{
|
||||
value += " +" + String(callObj.pota.length - 1);
|
||||
}
|
||||
return value;
|
||||
return callObj.pota;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -417,14 +412,13 @@ function potaColumnRef(callObj)
|
|||
|
||||
function potaColumnHover(callObj)
|
||||
{
|
||||
let value = ""
|
||||
for (let i in callObj.pota)
|
||||
let value = "";
|
||||
|
||||
if (callObj.pota in window.opener.g_pota.parks)
|
||||
{
|
||||
if (callObj.pota[i] in window.opener.g_pota.parks)
|
||||
{
|
||||
value += callObj.pota[i] + " - " + window.opener.g_pota.parks[callObj.pota[i]].name + "\n";
|
||||
}
|
||||
value += callObj.pota + " - " + window.opener.g_pota.parks[callObj.pota].name + "\n";
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "GridTracker",
|
||||
"product_string_do_not_use": "gridtracker",
|
||||
"version": "1.22.1123",
|
||||
"version": "1.22.1204",
|
||||
"betaVersion": "",
|
||||
"description": "GridTracker, an amateur radio companion",
|
||||
"author": "GridTracker.org",
|
||||
|
|
Ładowanie…
Reference in New Issue