Merge branch 'canada-plus' into 'master'

Fix log viewer, add canadian provinces

See merge request gridtracker.org/gridtracker!307

If this is changing anything in the UI or operational behavior, please prepare to update the wiki!
master v1.23.1226
T Loomis 2023-12-27 18:48:04 +00:00
commit e318242e7a
30 zmienionych plików z 907 dodań i 255484 usunięć

8
debian/changelog vendored
Wyświetl plik

@ -1,3 +1,11 @@
gridtracker (1.23.1226) unstable; urgency=low
- System - Improved Primary Administrative Area (State) detection
- System - Added Canadian and Australian callsign databases
- Map - Added 'Worked All Canadian Provinces' award layer (Key 9)
- POTA - Map marker updated when park worked
- Call Roster - Properly show POTA worked status
- Logbook - Filter QSO by grid “Working Grid(s)”
-- Tag Loomis <n0ttl@gridtracker.org> Tue, 26 Dec 2023 00:00:00 -0000
gridtracker (1.23.1217) unstable; urgency=low
- BIGCTY - Update from December 15th
- System - Add QSO processing indicator

Wyświetl plik

@ -1,6 +1,6 @@
Name: {{{ git_name name=gridtracker }}}
Summary: GridTracker: An Amateur Radio Companion
Version: 1.23.1217
Version: 1.23.1226
Release: 1%{?dist}
BuildArch: noarch
Source0: {{{ git_dir_pack }}}
@ -40,6 +40,13 @@ DESTDIR=${RPM_BUILD_ROOT} make clean
%license %{_docdir}/%{name}/
%changelog
* Tue Dec 26 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1226-1
- System - Improved Primary Administrative Area (State) detection
- System - Added Canadian and Australian callsign databases
- Map - Added 'Worked All Canadian Provinces' award layer (Key 9)
- POTA - Map marker updated when park worked
- Call Roster - Properly show POTA worked status
- Logbook - Filter QSO by grid “Working Grid(s)”
* Sun Dec 17 2023 Tag Loomis <n0ttl@gridtracker.org> - 1.23.1217-1
- BIGCTY - Update from December 15th
- System - Add QSO processing indicator

Wyświetl plik

@ -715,7 +715,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<div id="printHotKeyDiv" style="border: 1px solid cyan; color: white; text-align: auto">
<table align="center" class="darkTable">
<tr>
<th colspan="6">Hot Key List (v1.20.0825+)</th>
<th colspan="6">Hot Key List (v1.23.1220+)</th>
</tr>
<tr>
<th>Key</th>
@ -791,7 +791,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</tr>
<tr>
<td>9</td>
<td align="left">Toggle Timezone Overlay</td>
<td align="left">Show CA Provinces Award Layer</td>
<td></td>
<td>X</td>
<td align="left">Toggle Map Position Info</td>
@ -870,8 +870,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<td>Shift-Key</td>
</tr>
<tr>
<td></td>
<td align="left"></td>
<td>H</td>
<td align="left">Toggle Timezone Overlay</td>
<td></td>
<td>F8</td>
<td align="left">Recall Map Position 4</td>
@ -1374,13 +1374,29 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<th data-i18n="settings.lookup.Count.header">Count</th>
</tr>
<tr>
<td data-i18n="settings.lookup.db.ULS">United States ULS</td>
<td data-i18n="settings.lookup.db.ULS">US Callsigns</td>
<td>
<input type="checkbox" id="ulsUseEnable" onclick="ulsValuesChanged();" />
</td>
<td id="ulsUpdatedTd">Never</td>
<td id="ulsCountTd">0</td>
</tr>
<tr>
<td>Canada Callsigns</td>
<td>
<input type="checkbox" id="cacUseEnable" onclick="cacValuesChanged();" />
</td>
<td id="cacUpdatedTd">Never</td>
<td id="cacCountTd">0</td>
</tr>
<tr>
<td>Australia Callsigns</td>
<td>
<input type="checkbox" id="ausUseEnable" onclick="ausValuesChanged();" />
</td>
<td id="ausUpdatedTd">Never</td>
<td id="ausCountTd">0</td>
</tr>
<tr>
<td data-i18n="settings.lookup.db.LoTW">Logbook of The World</td>
<td>
@ -1552,7 +1568,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
title="Filter Logbook QSOs to include these Callsigns only&#10;(comma separated)">
<table align="center">
<tr>
<td data-i18n="settings.logbook.callsigns.label"><b>Working Callsign(s)</b></td>
<td data-i18n="settings.logbook.callsigns.label">Working Callsign(s)</td>
</tr>
<tr>
<td>
@ -1569,8 +1585,38 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
oninput="if ( ValidateCallsigns(this) ) workingCallsignsChanged(this);" />
</td>
</tr>
<tr>
<td id="qsoCallsignsFound"></td>
</tr>
</table>
</div>
<div style="padding: 5px" class="mapItem"
title="Filter Logbook QSOs to include these Grids only&#10;(comma separated)">
<table align="center">
<tr>
<td>Working Grid(s)</td>
</tr>
<tr>
<td>
<label for="workingGridEnable">Enable?</label>
<input title="Enable Filtering" type="checkbox" id="workingGridEnable"
onclick="workingGridEnableChanged(this);" />
</td>
</tr>
<tr>
<td id="workingGridsTd">
<label for="workingGridsValue">Grid(s)</label>
<input id="workingGridsValue" type="text" class="inputTextValue" size="15"
onkeypress="return validGridKeys(event.charCode);"
oninput="if ( ValidateGrids(this) ) workingGridsChanged(this);" />
</td>
</tr>
<tr>
<td id="qsoGridsFound"></td>
</tr>
</table>
</div>
<br />
<div style="padding: 5px" class="mapItem" title="Filter Logbook QSOs from before this Date">
<table align="center">
<tr>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Wyświetl plik

@ -72,12 +72,8 @@
<button id="itubox" class="infoTablinks" onclick="openInfoTab(event, 'ituzoneBoxDiv', 'showITUzoneBox')">
ITU Zones
</button>
<button
id="waswacbox"
class="infoTablinks"
onclick="openInfoTab(event, 'waswaczoneBoxDiv', 'showWASWACzoneBox')"
>
WAC / WAS
<button id="waswacbox" class="infoTablinks" onclick="openInfoTab(event, 'waswaczoneBoxDiv', 'showWASWACzoneBox')">
WAC / WAS / WACP
</button>
<button id="wpxbox" class="infoTablinks" onclick="openInfoTab(event, 'wpxBoxDiv', 'showWPXBox')">WPX</button>
<button id="calbox" class="infoTablinks" onclick="openInfoTab(event, 'callsignBoxDiv', 'showCallsignBox')">

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -597,7 +597,7 @@
"stats.tabs.DXCCs": "DXCCs",
"stats.tabs.CQZones": "CQ分區",
"stats.tabs.ITUZones": "ITU分區",
"stats.tabs.WASWAC": "洲大陸/美國州",
"stats.tabs.WASWAC": "洲大陸/美國州/加拿大省",
"stats.tabs.live": "在線",
"stats.noDecodes": "還沒有解碼",
"stats.viewing": "檢視",
@ -833,6 +833,7 @@
"gt.ITUZoneBox.Worked": "曾通聯的 ITU分區",
"gt.WASWACBox.WAC": "曾通聯的所有大洲",
"gt.WASWACBox.WAS": "曾通聯的所有美國州份",
"gt.WASWACBox.WACP": "Worked All Canadian Provinces",
"gt.displayItemsList.Worked": "曾通聯",
"gt.displayItemsList.Confirmed": "已確認",
"gt.displayItemsList.Needed": "需要的",

Wyświetl plik

@ -597,7 +597,7 @@
"stats.tabs.DXCCs": "DXCCs",
"stats.tabs.CQZones": "CQ分区",
"stats.tabs.ITUZones": "ITU分区",
"stats.tabs.WASWAC": "洲大陆/美国州",
"stats.tabs.WASWAC": "洲大陆/美国州/WACP",
"stats.tabs.live": "实时",
"stats.noDecodes": "还没有解码",
"stats.viewing": "检视",
@ -833,6 +833,7 @@
"gt.ITUZoneBox.Worked": "通联过的 ITU分区",
"gt.WASWACBox.WAC": "通联过的所有大洲",
"gt.WASWACBox.WAS": "通联过的所有美国州",
"gt.WASWACBox.WACP": "Worked All Canadian Provinces",
"gt.displayItemsList.Worked": "通联过的",
"gt.displayItemsList.Confirmed": "已确认的",
"gt.displayItemsList.Needed": "需要的",

Wyświetl plik

@ -594,8 +594,8 @@
"stats.tabs.scores": "Ergebnisse",
"stats.tabs.DXCCs": "DXCCs",
"stats.tabs.CQZones": "CQ-Zonen",
"stats.tabs.ITUZones": "ITU-Zones",
"stats.tabs.WASWAC": "WAC / WAS",
"stats.tabs.ITUZones": "ITU-Zonen",
"stats.tabs.WASWAC": "WAC / WAS / WACP",
"stats.tabs.live": "Live",
"stats.noDecodes": "Noch keine Nachrichten",
"stats.viewing": "Ansicht",
@ -857,7 +857,8 @@
"gt.CQZoneBox.Worked": "Gearbeitete CQ-Zonen",
"gt.ITUZoneBox.Worked": "Gearbeitete ITU-Zonen",
"gt.WASWACBox.WAC": "Worked All Continents",
"gt.WASWACBox.WAS": "Worked All States",
"gt.WASWACBox.WAS": "Worked All US States",
"gt.WASWACBox.WACP": "Worked All Canadian Provinces",
"gt.displayItemsList.Worked": "Gearbeitet",
"gt.displayItemsList.Confirmed": "Bestätigt",
"gt.displayItemsList.Needed": "Benötigt",

Wyświetl plik

@ -226,7 +226,7 @@
"settings.lookup.Enabled.header": "Enabled",
"settings.lookup.LastDwnld.header": "Last Download",
"settings.lookup.Count.header": "Count",
"settings.lookup.db.ULS": "United States ULS",
"settings.lookup.db.ULS": "US Callsigns",
"settings.lookup.db.LoTW": "Logbook of The World",
"settings.lookup.db.eQSL": "eQSL",
"settings.lookup.db.OQRS": "ClubLog OQRS",
@ -596,7 +596,7 @@
"stats.tabs.DXCCs": "DXCCs",
"stats.tabs.CQZones": "CQ Zones",
"stats.tabs.ITUZones": "ITU Zones",
"stats.tabs.WASWAC": "WAC / WAS",
"stats.tabs.WASWAC": "WAC / WAS / WACP",
"stats.tabs.live": "Live",
"stats.noDecodes": "No decodes yet",
"stats.viewing": "Viewing",
@ -832,7 +832,8 @@
"gt.CQZoneBox.Worked": "Worked CQ Zones",
"gt.ITUZoneBox.Worked": "Worked ITU Zones",
"gt.WASWACBox.WAC": "Worked All Continents",
"gt.WASWACBox.WAS": "Worked All States",
"gt.WASWACBox.WAS": "Worked All US States",
"gt.WASWACBox.WACP": "Worked All Canadian Provinces",
"gt.displayItemsList.Worked": "Worked",
"gt.displayItemsList.Confirmed": "Confirmed",
"gt.displayItemsList.Needed": "Needed",

Wyświetl plik

@ -595,7 +595,7 @@
"stats.tabs.DXCCs": "DXCCs",
"stats.tabs.CQZones": "Zonas CQ",
"stats.tabs.ITUZones": "Zonas ITU",
"stats.tabs.WASWAC": "WAC / WAS",
"stats.tabs.WASWAC": "WAC / WAS / WACP",
"stats.tabs.live": "En Vivo",
"stats.noDecodes": "Sin decodificaciones",
"stats.viewing": "Viendo",
@ -828,6 +828,7 @@
"gt.ITUZoneBox.Worked": "Zonas ITU Trabajadas",
"gt.WASWACBox.WAC": "WAC - Continentes Trabajados",
"gt.WASWACBox.WAS": "WAS - Estados Trabajados",
"gt.WASWACBox.WACP": "WACP - Provincias canadienses",
"gt.displayItemsList.Worked": "Trabajados",
"gt.displayItemsList.Confirmed": "Confirmados",
"gt.displayItemsList.Needed": "Necesarios",

Wyświetl plik

@ -596,7 +596,7 @@
"stats.tabs.DXCCs": "DXCCs",
"stats.tabs.CQZones": "CQ Zones",
"stats.tabs.ITUZones": "ITU Zones",
"stats.tabs.WASWAC": "WAC / WAS",
"stats.tabs.WASWAC": "WAC / WAS / WACP",
"stats.tabs.live": "Live",
"stats.noDecodes": "Aucun décodage pour l'instant",
"stats.viewing": "Visualisation",
@ -832,7 +832,8 @@
"gt.CQZoneBox.Worked": "Zones CQ travaillées",
"gt.ITUZoneBox.Worked": "Zones ITU travaillées",
"gt.WASWACBox.WAC": "Continents",
"gt.WASWACBox.WAS": "États",
"gt.WASWACBox.WAS": "États américains",
"gt.WASWACBox.WACP": "Provinces canadiennes",
"gt.displayItemsList.Worked": "Travaillé",
"gt.displayItemsList.Confirmed": "Confirmé",
"gt.displayItemsList.Needed": "Nécessaire",

Wyświetl plik

@ -596,7 +596,7 @@
"stats.tabs.DXCCs": "DXCCs",
"stats.tabs.CQZones": "CQ Zone",
"stats.tabs.ITUZones": "ITU Zone",
"stats.tabs.WASWAC": "WAC / WAS",
"stats.tabs.WASWAC": "WAC / WAS / WACP",
"stats.tabs.live": "Live",
"stats.noDecodes": "Nessuna decodifica per il momento",
"stats.viewing": "Visualizzazione",
@ -832,7 +832,8 @@
"gt.CQZoneBox.Worked": "Zona CQ lavorata",
"gt.ITUZoneBox.Worked": "Zona ITU lavorata",
"gt.WASWACBox.WAC": "Continenti",
"gt.WASWACBox.WAS": "Stati",
"gt.WASWACBox.WAS": "Stati Uniti",
"gt.WASWACBox.WACP": "Province canadesi",
"gt.displayItemsList.Worked": "Lavorato",
"gt.displayItemsList.Confirmed": "Confermato",
"gt.displayItemsList.Needed": "Necessario",

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 5.1 KiB

Wyświetl plik

@ -170,6 +170,7 @@ function onAdiLoadComplete(adiBuffer)
{
finalDEcall = GT.appSettings.myCall;
}
GT.myQsoCalls[finalDEcall] = true;
if (GT.appSettings.workingCallsignEnable && !(finalDEcall in GT.appSettings.workingCallsigns))
{
@ -199,6 +200,19 @@ function onAdiLoadComplete(adiBuffer)
}
var confirmed = false;
var myGrid = findAdiField(activeAdifArray[x], "MY_GRIDSQUARE").toUpperCase();
if (myGrid.length > 3)
{
let finalMyGrid = myGrid.substr(0, 4);
GT.myQsoGrids[finalMyGrid] = true;
if (GT.appSettings.workingGridEnable && !(finalMyGrid in GT.appSettings.workingGrids))
{
// not in the working grids, move to next
continue;
}
}
var finalDXcall = findAdiField(activeAdifArray[x], "CALL").replace("_", "/");
var finalGrid = findAdiField(activeAdifArray[x], "GRIDSQUARE").toUpperCase();
var vuccGrids = findAdiField(activeAdifArray[x], "VUCC_GRIDS").toUpperCase();
@ -514,6 +528,9 @@ function onAdiLoadComplete(adiBuffer)
GT.fileSelector.value = null;
}
GT.fromDirectCallNoFileDialog = false;
qsoGridsFound.innerHTML = "Found: " + Object.keys(GT.myQsoGrids).join(",");
qsoCallsignsFound.innerHTML = "Found: " + Object.keys(GT.myQsoCalls).join(",");
}
function clubLogCallback(buffer, flag, cookie)
@ -782,6 +799,7 @@ function grabLoTWQSO()
lotwLogin.value +
"&password=" +
encodeURIComponent(lotwPassword.value) +
((GT.appSettings.workingGridEnable == true) ? "&qso_mydetail=yes" : "") +
"&qso_query=1&qso_qsl=no&qso_qsldetail=yes&qso_withown=yes" +
lastQSLDateString,
lotwCallback,
@ -808,6 +826,7 @@ function grabLoTWQSL()
lotwLogin.value +
"&password=" +
encodeURIComponent(lotwPassword.value) +
((GT.appSettings.workingGridEnable == true) ? "&qso_mydetail=yes" : "") +
"&qso_query=1&qso_qsl=yes&qso_qsldetail=yes&qso_withown=yes" +
lastQSLDateString,
lotwCallback,
@ -1487,6 +1506,10 @@ function startupAdifLoadCheck()
{
logEventMedia.value = GT.alertSettings.logEventMedia;
loadWsjtLogFile();
if (loadGTCheckBox.checked == true) loadGtQSOLogFile();
if (loadAdifCheckBox.checked == true && GT.startupLogs.length > 0) startupAdifLoadFunction();
if (GT.mapSettings.offlineMode == false)
@ -1496,13 +1519,7 @@ function startupAdifLoadCheck()
if (loadQRZCheckBox.checked == true) grabQrzComLog(false);
if (loadClubCheckBox.checked == true) grabClubLog(false);
if (loadPsk24CheckBox.checked == true) grabPsk24();
}
if (loadGTCheckBox.checked == true) loadGtQSOLogFile();
loadWsjtLogFile();
}
function getABuffer(file_url, callback, flag, mode, port, imgToGray, stringOfFlag, timeoutX)
@ -2029,6 +2046,16 @@ function finishSendingReport(record, localMode)
}
}
report += "<EOR>";
var reportNoPotaNoStateNoCnty = "";
for (const key in record)
{
if (key != "POTA" && key != "STATE" && key != "CNTY")
{
reportNoPotaNoStateNoCnty += "<" + key + ":" + Buffer.byteLength(record[key]) + ">" + record[key] + " ";
}
}
reportNoPotaNoStateNoCnty += "<EOR>";
// this report is for internal use ONLY!
var reportWithPota = "";
@ -2099,7 +2126,7 @@ function finishSendingReport(record, localMode)
try
{
sendQrzLogEntry(report);
sendQrzLogEntry(reportNoPotaNoStateNoCnty);
}
catch (e)
{

Wyświetl plik

@ -6,15 +6,26 @@ GT.lotwCallsigns = Object();
GT.lotwFile = "";
GT.lotwWhenDate = 0;
GT.lotwLoadTimer = null;
GT.eqslCallsigns = Object();
GT.eqslFile = "";
GT.eqslWhenDate = 0;
GT.eqslLoadTimer = null;
GT.ulsCallsignsCount = 0;
GT.ulsCallsignsCount = 0;
GT.ulsWhenDate = 0;
GT.ulsLoadTimer = null;
GT.cacCallsigns = Object();
GT.cacFile = "";
GT.cacWhenDate = 0;
GT.cacLoadTimer = null;
GT.ausCallsigns = Object();
GT.ausFile = "";
GT.ausWhenDate = 0;
GT.ausLoadTimer = null;
GT.oqrsCallsigns = Object();
GT.oqrsFile = "";
GT.oqrsWhenDate = 0;
@ -54,6 +65,8 @@ function callsignServicesInit()
GT.lotwFile = GT.NWappData + "lotw-ts-callsigns.json";
GT.eqslFile = GT.NWappData + "eqsl-callsigns.json";
GT.oqrsFile = GT.NWappData + "cloqrs-callsigns.json";
GT.cacFile = GT.NWappData + "canada-callsigns.txt";
GT.ausFile = GT.NWappData + "aus-callsigns.txt";
if (GT.callsignLookups.lotwUseEnable)
{
@ -67,6 +80,14 @@ function callsignServicesInit()
{
ulsLoadCallsigns();
}
if (GT.callsignLookups.cacUseEnable)
{
cacLoadCallsigns();
}
if (GT.callsignLookups.ausUseEnable)
{
ausLoadCallsigns();
}
if (GT.callsignLookups.oqrsUseEnable)
{
oqrsLoadCallsigns();
@ -75,6 +96,8 @@ function callsignServicesInit()
lotwSettingsDisplay();
eqslSettingsDisplay();
ulsSettingsDisplay();
cacSettingsDisplay();
ausSettingsDisplay();
oqrsSettingsDisplay();
}
@ -218,6 +241,227 @@ function processLotwCallsigns(result, flag)
lotwSettingsDisplay();
}
function cacLoadCallsigns()
{
var now = timeNowSec();
if (now - GT.callsignLookups.cacLastUpdate > 86400 * 7)
{ GT.callsignLookups.cacLastUpdate = 0; }
else
{
var cacWhenTimer = 86400 * 7 - (now - GT.callsignLookups.cacLastUpdate);
GT.cacWhenDate = now + cacWhenTimer;
GT.cacLoadTimer = nodeTimers.setTimeout(cacDownload, cacWhenTimer * 1000);
}
try
{
if (!fs.existsSync(GT.cacFile))
{
GT.callsignLookups.cacLastUpdate = 0;
}
else
{
parseCacCallsigns(fs.readFileSync(GT.cacFile, "UTF-8"));
}
if (GT.callsignLookups.cacLastUpdate == 0)
{
cacDownload();
}
}
catch (e)
{
GT.callsignLookups.cacLastUpdate = 0;
cacDownload();
}
}
function parseCacCallsigns(data)
{
let callsignRows = data.split("\n");
for (let x = 0; x < callsignRows.length; x++)
{
if (callsignRows[x].length > 1)
{
GT.cacCallsigns[callsignRows[x].substr(8)] = callsignRows[x].substr(6, 2);
}
}
fs.writeFileSync(GT.cacFile, data, "UTF-8");
updateQSO();
}
function processCacCallsigns(buffer, flag)
{
let data = (typeof buffer == "object") ? String(buffer) : buffer;
parseCacCallsigns(data);
GT.callsignLookups.cacLastUpdate = timeNowSec();
var now = timeNowSec();
if (GT.cacLoadTimer != null) nodeTimers.clearTimeout(GT.cacLoadTimer);
var cacWhenTimer = 86400 * 7 - (now - GT.callsignLookups.cacLastUpdate);
GT.cacWhenDate = now + cacWhenTimer;
GT.cacLoadTimer = nodeTimers.setTimeout(cacDownload, cacWhenTimer * 1000);
cacSettingsDisplay();
}
function cacDownload(fromSettings)
{
cacUpdatedTd.innerHTML = "<b><i>Downloading...</i></b>";
getBuffer(
"https://storage.googleapis.com/gt_app/canada.txt",
processCacCallsigns,
null,
"http",
80
);
}
function cacSettingsDisplay()
{
cacUseEnable.checked = GT.callsignLookups.cacUseEnable;
if (GT.callsignLookups.cacLastUpdate == 0)
{
cacUpdatedTd.innerHTML = "Never";
}
else
{
cacUpdatedTd.innerHTML = userTimeString(GT.callsignLookups.cacLastUpdate * 1000);
}
if (!GT.callsignLookups.cacUseEnable)
{
if (GT.cacLoadTimer != null) nodeTimers.clearTimeout(GT.cacLoadTimer);
GT.cacLoadTimer = null;
GT.cacCallsigns = Object();
}
cacCountTd.innerHTML = Object.keys(GT.cacCallsigns).length;
}
function cacValuesChanged()
{
GT.callsignLookups.cacUseEnable = cacUseEnable.checked;
saveCallsignSettings();
if (GT.callsignLookups.cacUseEnable == true)
{
cacLoadCallsigns();
}
cacSettingsDisplay();
}
function ausLoadCallsigns()
{
var now = timeNowSec();
if (now - GT.callsignLookups.ausLastUpdate > 86400 * 7)
{ GT.callsignLookups.ausLastUpdate = 0; }
else
{
var ausWhenTimer = 86400 * 7 - (now - GT.callsignLookups.ausLastUpdate);
GT.ausWhenDate = now + ausWhenTimer;
GT.ausLoadTimer = nodeTimers.setTimeout(ausDownload, ausWhenTimer * 1000);
}
try
{
if (!fs.existsSync(GT.ausFile))
{
GT.callsignLookups.ausLastUpdate = 0;
}
else
{
parseAusCallsigns(fs.readFileSync(GT.ausFile, "UTF-8"));
}
if (GT.callsignLookups.ausLastUpdate == 0)
{
ausDownload();
}
}
catch (e)
{
GT.callsignLookups.ausLastUpdate = 0;
ausDownload();
}
}
function parseAusCallsigns(data)
{
let callsignRows = data.split("\n");
for (let x = 0; x < callsignRows.length; x++)
{
let parts = callsignRows[x].split(",");
if (parts.length == 2)
{
GT.ausCallsigns[parts[1].trim()] = parts[0].trim();
}
}
fs.writeFileSync(GT.ausFile, data, "UTF-8");
updateQSO();
}
function processAusCallsigns(buffer, flag)
{
let data = (typeof buffer == "object") ? String(buffer) : buffer;
parseAusCallsigns(data);
GT.callsignLookups.ausLastUpdate = timeNowSec();
var now = timeNowSec();
if (GT.ausLoadTimer != null) nodeTimers.clearTimeout(GT.ausLoadTimer);
var ausWhenTimer = 86400 * 7 - (now - GT.callsignLookups.ausLastUpdate);
GT.ausWhenDate = now + ausWhenTimer;
GT.ausLoadTimer = nodeTimers.setTimeout(ausDownload, ausWhenTimer * 1000);
ausSettingsDisplay();
}
function ausDownload(fromSettings)
{
ausUpdatedTd.innerHTML = "<b><i>Downloading...</i></b>";
getBuffer(
"https://storage.googleapis.com/gt_app/aus.txt",
processAusCallsigns,
null,
"http",
80
);
}
function ausSettingsDisplay()
{
ausUseEnable.checked = GT.callsignLookups.ausUseEnable;
if (GT.callsignLookups.ausLastUpdate == 0)
{
ausUpdatedTd.innerHTML = "Never";
}
else
{
ausUpdatedTd.innerHTML = userTimeString(GT.callsignLookups.ausLastUpdate * 1000);
}
if (!GT.callsignLookups.ausUseEnable)
{
if (GT.ausLoadTimer != null) nodeTimers.clearTimeout(GT.ausLoadTimer);
GT.ausLoadTimer = null;
GT.ausCallsigns = Object();
}
ausCountTd.innerHTML = Object.keys(GT.ausCallsigns).length;
}
function ausValuesChanged()
{
GT.callsignLookups.ausUseEnable = ausUseEnable.checked;
saveCallsignSettings();
if (GT.callsignLookups.ausUseEnable == true)
{
ausLoadCallsigns();
}
ausSettingsDisplay();
}
function oqrsLoadCallsigns()
{
var now = timeNowSec();
@ -454,44 +698,66 @@ function ulsLoadCallsigns()
function updateQSO()
{
if (GT.ulsCallsignsCount > 0)
if (GT.ulsCallsignsCount > 0 && GT.callsignLookups.ulsUseEnable)
{
for (hash in GT.QSOhash)
for (let hash in GT.QSOhash)
{
var details = GT.QSOhash[hash];
var lookupCall = false;
if ((details.cnty == null || details.state == null) && isKnownCallsignDXCC(details.dxcc))
let details = GT.QSOhash[hash];
if (isKnownCallsignUSplus(details.dxcc))
{
// Do County Lookup
lookupCall = true;
}
else if (details.cnty != null && isKnownCallsignUSplus(details.dxcc))
{
if (!(details.cnty in GT.cntyToCounty))
let lookupCall = false;
if ((details.cnty == null || details.state == null))
{
if (details.cnty.indexOf(",") == -1)
// Do County Lookup
lookupCall = true;
}
else if (details.cnty != null)
{
if (!(details.cnty in GT.cntyToCounty))
{
if (!(details.state + "," + details.cnty in GT.cntyToCounty))
if (details.cnty.indexOf(",") == -1)
{
if (!(details.state + "," + details.cnty in GT.cntyToCounty))
{
lookupCall = true;
}
}
else
{
lookupCall = true;
}
}
else
{
lookupCall = true;
}
}
}
if (lookupCall)
{
if (GT.callsignLookups.ulsUseEnable)
if (lookupCall)
{
lookupUsCallsign(details, true);
lookupKnownCallsign(details, true);
}
}
}
}
if (GT.callsignLookups.cacUseEnable || GT.callsignLookups.ausUseEnable)
{
for (let hash in GT.QSOhash)
{
let details = GT.QSOhash[hash];
if (details.dxcc == 1 && details.state == null)
{
if (details.DEcall in GT.cacCallsigns)
{
details.state = "CA-" + GT.cacCallsigns[details.DEcall];
}
}
else if (details.dxcc == 150 && details.state == null)
{
if (details.DEcall in GT.ausCallsigns)
{
details.state = "AU-" + GT.ausCallsigns[details.DEcall];
}
}
}
refreshQSOs();
}
}
function updateCallsignCount()
@ -751,7 +1017,7 @@ function processulsCallsigns(data, flag, cookies, starting, finished)
return Buffer(returnBuffer); // eslint-disable-line node/no-deprecated-api
}
function lookupUsCallsign(object, writeState = false)
function lookupKnownCallsign(object, writeState = false)
{
GT.ulsDatabase.transaction(function (tx)
{
@ -765,14 +1031,7 @@ function lookupUsCallsign(object, writeState = false)
{
if (object.state == null)
{
if (object.dxcc == 1)
{
object.state = "CA-" + results.rows[0].state;
}
else
{
object.state = "US-" + results.rows[0].state;
}
object.state = "US-" + results.rows[0].state;
if (writeState)
{
refreshQSOs();

Wyświetl plik

@ -98,6 +98,8 @@ var def_appSettings = {
wsjtUdpPort: 0,
workingCallsignEnable: false,
workingCallsigns: {},
workingGridEnable: false,
workingGrids: {},
workingDateEnable: false,
workingDate: 0,
qsoItemsPerPage: 100,
@ -267,6 +269,12 @@ var def_callsignLookups = {
ulsUseEnable: true,
ulsWeeklyEnable: true,
ulsLastUpdate: 0,
cacUseEnable: true,
cacWeeklyEnable: true,
cacLastUpdate: 0,
ausUseEnable: true,
ausWeeklyEnable: true,
ausLastUpdate: 0,
oqrsUseEnable: false,
oqrsWeeklyEnable: false,
oqrsLastUpdate: 0

Plik diff jest za duży Load Diff

Wyświetl plik

@ -54,6 +54,13 @@ GT.gtParkOnInstance = new ol.style.Text({
justify: "center"
});
GT.gtParkWorkedOnInstance = new ol.style.Text({
text: "🌄",
font: "20px Verdana",
textAlign: "center",
justify: "center"
});
GT.gtParkOffInstance = new ol.style.Text({
text: "🌲",
font: "20px Verdana",
@ -147,6 +154,10 @@ function makeParkFeatures()
{
try
{
let now = timeNowSec();
let day = parseInt(now / 86400);
let dayAsString = String(day);
for (const park in GT.pota.parkSpots)
{
if (park in GT.pota.parks)
@ -163,7 +174,15 @@ function makeParkFeatures()
{
if (GT.instances[instance].valid && GT.instances[instance].status.Band == report.band && GT.instances[instance].status.MO == report.mode)
{
parkIcon = GT.gtParkOnInstance;
let hash = dayAsString + park + report.band + report.mode;
if (hash in GT.tracker.worked.pota)
{
parkIcon = GT.gtParkWorkedOnInstance;
}
else
{
parkIcon = GT.gtParkOnInstance;
}
zIndex = 2;
break;
}
@ -353,11 +372,24 @@ function addParkSpotFeature(park, report)
{
let parkIcon = GT.gtParkOffInstance;
let zIndex = 1;
let now = timeNowSec();
let day = parseInt(now / 86400);
let dayAsString = String(day);
for (let instance in GT.instances)
{
if (GT.instances[instance].valid && GT.instances[instance].status.Band == report.band && GT.instances[instance].status.MO == report.mode)
{
parkIcon = GT.gtParkOnInstance;
let hash = dayAsString + park + report.band + report.mode;
if (hash in GT.tracker.worked.pota)
{
parkIcon = GT.gtParkWorkedOnInstance;
}
else
{
parkIcon = GT.gtParkOnInstance;
}
zIndex = 2;
break;
}

Wyświetl plik

@ -42,6 +42,20 @@ function processRosterFiltering(callRoster, rosterSettings)
continue;
}
if (CR.rosterSettings.columns.Spot == true)
{
callObj.spot = window.opener.getSpotTime(callObj.DEcall + callObj.mode + callObj.band);
if (CR.rosterSettings.onlySpot == true && (callObj.spot.when == 0 || (timeNowSec() - callObj.spot.when > window.opener.GT.receptionSettings.viewHistoryTimeSec)))
{
entry.tx = false;
continue;
}
}
else
{
callObj.spot = { when: 0, snr: 0 };
}
if (rosterSettings.now - callObj.age > CR.rosterSettings.rosterTime)
{
entry.tx = false;
@ -146,24 +160,6 @@ function processRosterFiltering(callRoster, rosterSettings)
continue;
}
if (CR.rosterSettings.columns.Spot == true)
{
callObj.spot = window.opener.getSpotTime(callObj.DEcall + callObj.mode + callObj.band);
if (callObj.spot == null)
{
callObj.spot = { when: 0, snr: 0 };
}
if (CR.rosterSettings.onlySpot == true && (callObj.spot.when == 0 || (timeNowSec() - callObj.spot.when > window.opener.GT.receptionSettings.viewHistoryTimeSec)))
{
entry.tx = false;
continue;
}
}
else
{
callObj.spot = { when: 0, snr: 0 };
}
let usesOneOf = 0;
let checkUses = 0;

Wyświetl plik

@ -392,57 +392,53 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
}
}
// Hunting for US States
if ((huntState.checked || awardTrackerOverrides.states) && window.opener.GT.callsignLookups.ulsUseEnable == true)
// Hunting for Known States
if (huntState.checked || awardTrackerOverrides.states)
{
let stateSearch = callObj.state;
let finalDxcc = callObj.dxcc;
if (finalDxcc == 291 || finalDxcc == 110 || finalDxcc == 6)
if (stateSearch in window.opener.GT.StateData)
{
if (stateSearch in window.opener.GT.StateData)
let hash = stateSearch + workHashSuffix;
let layeredHash = rosterSettings.layeredMode && (stateSearch + layeredHashSuffix)
if (rosterSettings.huntIndex && !(hash in rosterSettings.huntIndex.state))
{
let hash = stateSearch + workHashSuffix;
let layeredHash = rosterSettings.layeredMode && (stateSearch + layeredHashSuffix)
shouldAlert = true;
callObj.reason.push("state");
if (rosterSettings.huntIndex && !(hash in rosterSettings.huntIndex.state))
if (rosterSettings.workedIndex && hash in rosterSettings.workedIndex.state)
{
shouldAlert = true;
callObj.reason.push("state");
if (rosterSettings.workedIndex && hash in rosterSettings.workedIndex.state)
if (rosterSettings.layeredMode && layeredHash in rosterSettings.huntIndex.state)
{
if (rosterSettings.layeredMode && layeredHash in rosterSettings.huntIndex.state)
{
callObj.hunting.state = "worked-and-mixed";
stateConf = `${layeredUnconf}${state}${layeredUnconfAlpha};`;
stateBg = `${state}${layeredInversionAlpha}`;
state = bold;
}
else
{
callObj.hunting.state = "worked";
stateConf = `${unconf}${state}${inversionAlpha};`;
}
callObj.hunting.state = "worked-and-mixed";
stateConf = `${layeredUnconf}${state}${layeredUnconfAlpha};`;
stateBg = `${state}${layeredInversionAlpha}`;
state = bold;
}
else
{
if (rosterSettings.layeredMode && layeredHash in rosterSettings.huntIndex.state)
{
callObj.hunting.state = "mixed";
stateBg = `${state}${layeredAlpha};`;
state = bold;
}
else if (rosterSettings.layeredMode && layeredHash in rosterSettings.workedIndex.state)
{
callObj.hunting.state = "mixed-worked";
stateConf = `${unconf}${state}${layeredAlpha};`;
}
else
{
callObj.hunting.state = "hunted";
stateBg = `${state}${inversionAlpha};`;
state = bold;
}
callObj.hunting.state = "worked";
stateConf = `${unconf}${state}${inversionAlpha};`;
}
}
else
{
if (rosterSettings.layeredMode && layeredHash in rosterSettings.huntIndex.state)
{
callObj.hunting.state = "mixed";
stateBg = `${state}${layeredAlpha};`;
state = bold;
}
else if (rosterSettings.layeredMode && layeredHash in rosterSettings.workedIndex.state)
{
callObj.hunting.state = "mixed-worked";
stateConf = `${unconf}${state}${layeredAlpha};`;
}
else
{
callObj.hunting.state = "hunted";
stateBg = `${state}${inversionAlpha};`;
state = bold;
}
}
}
@ -504,16 +500,26 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
if (potaEnabled && huntPOTA.checked == true && callObj.pota)
{
let hash = CR.dayAsString + callsign + callObj.pota + (rosterSettings.layeredMode ? layeredHashSuffix : workHashSuffix);
let parkHash = callObj.pota + (rosterSettings.layeredMode ? layeredHashSuffix : workHashSuffix);
// POTA is only in the worked list
if (!(hash in CR.worked.pota))
{
shouldAlert = true;
callObj.reason.push("pota");
callObj.hunting.pota = "hunted";
potaBg = `${pota}${inversionAlpha};`;
pota = bold;
if (parkHash in CR.worked.pota)
{
potaConf = `${unconf}${pota}${inversionAlpha};`;
}
else
{
potaBg = `${pota}${inversionAlpha};`;
pota = bold;
}
}
else if (parkHash in CR.worked.pota)
{
potaConf = `${unconf}${pota}${inversionAlpha};`;
}
}

Wyświetl plik

@ -148,7 +148,8 @@ const ROSTER_COLUMNS = {
tableData: (callObj) => ({
align: "center",
rawAttrs: callObj.style.state,
html: callObj.state ? callObj.state.substr(3) : "&nbsp;"
html: callObj.state ? callObj.state.substr(3) : "&nbsp;",
title: (callObj.state in window.opener.GT.StateData) ? window.opener.GT.StateData[callObj.state].name : null
})
},

Wyświetl plik

@ -125,10 +125,16 @@ function validateCallByElement(elementString)
function init()
{
openInfoTab(event, "workedBoxDiv", "showWorkedBox");
openInfoTab(qsobox, "workedBoxDiv", "showWorkedBox");
loadChildWindowI18n();
}
function searchWorked(dxcc, band, mode)
{
openInfoTab(qsobox, "workedBoxDiv", "showWorkedBox");
window.opener.searchWorked(dxcc, band, mode);
}
function addTextToClipboard(data)
{
navigator.clipboard.writeText(data);

Wyświetl plik

@ -677,7 +677,7 @@ a {
font-weight: bold;
border-top-right-radius: 6px;
border-top-left-radius: 6px;
margin-left: 5px;
margin-left: 0px;
margin-right: 0px;
color: #eee;
background: black;

Wyświetl plik

@ -1,7 +1,7 @@
{
"name": "GridTracker",
"product_string_do_not_use": "gridtracker",
"version": "1.23.1217",
"version": "1.23.1226",
"betaVersion": "",
"description": "GridTracker: An Amateur Radio Companion",
"author": "GridTracker.org",