kopia lustrzana https://gitlab.com/gridtracker.org/gridtracker
Safety commit
Better processing indicator Async load local adif files BIGCTY update 0105 Baby step another step Lint 1 Removed debug and dead code DO9KW DO9KW II Lint free safety commit big baby step Remove uneeded timer more speed opt Massive speed improvements Lint Fixed WSPR grid colors and dimming Auto-mute on single or no audio devices. lint Chinese Google Maps and OAMS spot/decode metering Decodes are small and once a minute. Properly save *all* settings on language change Proper method name and code reduction Moved trackQSO to gtCommon in prep for log event 30 minutes inactivity WSJT-X log event not a heavy hit to stat parsing BIGCTY 0125 version bump for testing A bigger hit on uls lookups, but they won't get stuck as un resolved this way Dumped ULS websql database Save lookupssettings and fix changelog lint fix whitespace? roll version, changelog fix Fix really old bug, always set the liveCallsigns with stations info Moved eslint disabled code to bottom of file Removed last traces of .rect, cleaned up vector layer accessors Removed dead code Local ADIF loads now add to startup log list and auto load when added via dialogscbayer-ccc
rodzic
134310fcee
commit
5469779198
|
@ -1,36 +1,36 @@
|
|||
gridtracker (1.24.0104) unstable; urgency=high
|
||||
- System - fixed database creation error on new installs
|
||||
gridtracker (1.24.0131) unstable; urgency=low
|
||||
- System - major changes, to be updated
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Wed, 31 Jan 2024 00:00:00 -0000
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Thu, 04 Jan 2024 00:00:00 -0000
|
||||
gridtracker (1.24.0104) unstable; urgency=high
|
||||
- System - fixed database creation error on new installs
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Thu, 04 Jan 2024 00:00:00 -0000
|
||||
|
||||
gridtracker (1.24.0103) unstable; urgency=low
|
||||
- Windows - NSIS installer reverted to 3.06.1-1
|
||||
- System - Fixed bug in handling hamqth lookups
|
||||
- Stats - DXCCs - Added confirmed band slot counts
|
||||
- BIGCTY - Update from Dec 28th 2023
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Wed, 03 Jan 2024 00:00:00 -0000
|
||||
- Windows - NSIS installer reverted to 3.06.1-1
|
||||
- System - Fixed bug in handling hamqth lookups
|
||||
- Stats - DXCCs - Added confirmed band slot counts
|
||||
- BIGCTY - Update from Dec 28th 2023
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Wed, 03 Jan 2024 00:00:00 -0000
|
||||
|
||||
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
|
||||
- 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
|
||||
- System - QSL location authority selector added in Settings > Logbook
|
||||
- Logbook Viewer - QSL sources added
|
||||
- Call Roster - Added Grid to Watcher and Ignores
|
||||
- Language - Updates to Chinese simplified and traditional translations
|
||||
- Logging - DX Keeper grid bug workaround
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 17 Dec 2023 00:00:00 -0000
|
||||
- BIGCTY - Update from December 15th
|
||||
- System - Add QSO processing indicator
|
||||
- System - QSL location authority selector added in Settings > Logbook
|
||||
- Logbook Viewer - QSL sources added
|
||||
- Call Roster - Added Grid to Watcher and Ignores
|
||||
- Language - Updates to Chinese simplified and traditional translations
|
||||
- Logging - DX Keeper grid bug workaround
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 17 Dec 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1207) unstable; urgency=high
|
||||
- BIGCTY - Update from December 5th
|
||||
|
@ -74,19 +74,16 @@ gridtracker (1.23.1112) unstable; urgency=low
|
|||
- Logging - Descriptive error if QRZ.com logging failure
|
||||
- Logbook Viewer - Regex enabled callsign searching
|
||||
- Settings - Logbook - New "Logbook Items Per Page" slider
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 12 Nov 2023 00:00:00 -0000
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 12 Nov 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1019) unstable; urgency=low
|
||||
- HTTP - Removed timeouts on transactions affecting log downloading and uploading
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Thu, 19 Oct 2023 00:00:00 -0000
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Thu, 19 Oct 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1015) unstable; urgency=low
|
||||
- ADIF – Fixed record loading failure for PSK-Reporter if FREQ present
|
||||
- WSPR – Fixed decodes not appearing
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 15 Oct 2023 00:00:00 -0000
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 15 Oct 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.1014) unstable; urgency=low
|
||||
- Call Roster - Fixed "All Traffic/Only Wanted" filtering
|
||||
|
@ -98,14 +95,12 @@ gridtracker (1.23.1014) unstable; urgency=low
|
|||
- System – Swaziland renamed to Eswatini
|
||||
- Logging – HamZone.cn service is now HamCQ.cn
|
||||
- Maps – Toner (online), Terrain, Watercolor and Geography Class no longer public access
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sat, 14 Oct 2023 00:00:00 -0000
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sat, 14 Oct 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.0402) unstable; urgency=low
|
||||
- Roster - fixed Hunting mode not saving
|
||||
- Packager - fixed Arm distribution
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 02 Apr 2023 00:00:00 -0000
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 02 Apr 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.0328) unstable; urgency=low
|
||||
- Language - added German/Deutsch
|
||||
|
@ -122,8 +117,7 @@ gridtracker (1.23.0328) unstable; urgency=low
|
|||
- Mac – “Full Stop” no longer spoken at startup
|
||||
- Satellite – framework started for satellite tracking
|
||||
- BIGCTY – update from March 19th
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Tue, 28 Mar 2023 00:00:00 -0000
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Tue, 28 Mar 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.0206) unstable; urgency=low
|
||||
- Bugfix for Turkey zone 1 decodes
|
||||
|
@ -140,12 +134,10 @@ gridtracker (1.23.0206) unstable; urgency=low
|
|||
- Award Tracker CQ Zone and State fix
|
||||
- <...> treated as UNKNOWN in Call Roster
|
||||
- LoTW download button not responding
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Mon, 06 Feb 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.23.0110) unstable; urgency=high
|
||||
- Emergency LoTW fix
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Tue, 10 Jan 2023 00:00:00 -0000
|
||||
|
||||
gridtracker (1.22.1226) unstable; urgency=low
|
||||
|
@ -155,7 +147,6 @@ gridtracker (1.22.1226) unstable; urgency=low
|
|||
- Fixed Logbook of The World loading
|
||||
- No longer clear data on new versions
|
||||
- More code clean up
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Mon, 26 Dec 2022 00:00:00 -0000
|
||||
|
||||
gridtracker (1.22.1204) unstable; urgency=low
|
||||
|
@ -164,19 +155,16 @@ gridtracker (1.22.1204) unstable; urgency=low
|
|||
- 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
|
||||
- Failure to start on some installs
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Wed, 23 Nov 2022 00:00:00 -0000
|
||||
|
||||
gridtracker (1.22.1122) unstable; urgency=low
|
||||
- WSPR decoding corrupting QSO data fix!
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Tue, 22 Nov 2022 00:00:00 -0000
|
||||
|
||||
gridtracker (1.22.1119) unstable; urgency=low
|
||||
|
@ -191,7 +179,6 @@ gridtracker (1.22.1119) unstable; urgency=low
|
|||
- Grid-overlay (Hotkey B) performance boost
|
||||
- BIGCTY update from November 14th
|
||||
- Performance improvements
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sat, 19 Nov 2022 12:00:00 -0000
|
||||
|
||||
gridtracker (1.22.1016) unstable; urgency=low
|
||||
|
@ -202,17 +189,14 @@ gridtracker (1.22.1016) unstable; urgency=low
|
|||
- New 'No Unknown DXCC' exception in call roster
|
||||
- Award tracker now shows wanted options for highlighting
|
||||
- Small performance improvements and installation size reduction
|
||||
|
||||
-- Matthew Chambers <nr0q@gridtracker.org> Sun, 16 Oct 2022 19:55:00 -0000
|
||||
|
||||
gridtracker (1.22.1010) unstable; urgency=low
|
||||
- Fix issue with map selection not saving/restoring
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sun, 09 Oct 2022 12:00:00 -0000
|
||||
|
||||
gridtracker (1.22.1009) unstable; urgency=low
|
||||
- Fix issue loading logs and generating scores tab
|
||||
|
||||
-- Tag Loomis <n0ttl@gridtracker.org> Sat, 08 Oct 2022 12:00:00 -0000
|
||||
|
||||
gridtracker (1.22.1008) unstable; urgency=low
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Name: {{{ git_name name=gridtracker }}}
|
||||
Summary: GridTracker: An Amateur Radio Companion
|
||||
Version: 1.24.0104
|
||||
Version: 1.24.0131
|
||||
Release: 1%{?dist}
|
||||
BuildArch: noarch
|
||||
Source0: {{{ git_dir_pack }}}
|
||||
|
@ -40,6 +40,9 @@ DESTDIR=${RPM_BUILD_ROOT} make clean
|
|||
%license %{_docdir}/%{name}/
|
||||
|
||||
%changelog
|
||||
* Wed Jan 31 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0131-1
|
||||
- System - major changes, to be updated
|
||||
- BIGCTY - Update from Jan 25th
|
||||
* Thu Jan 04 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0104-1
|
||||
- System - fixed database creation error on new installs
|
||||
* Wed Jan 03 2024 Tag Loomis <n0ttl@gridtracker.org> - 1.24.0103-1
|
||||
|
|
|
@ -39,6 +39,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<script src="./lib/defaults.js" type="text/javascript"></script>
|
||||
<script src="./lib/protos.js" type="text/javascript"></script>
|
||||
<script src="./lib/screens.js" type="text/javascript"></script>
|
||||
<script src="./lib/gtCommon.js" type="text/javascript"></script>
|
||||
<script src="./lib/alerts.js" type="text/javascript"></script>
|
||||
<script src="./lib/third-party.js" type="text/javascript"></script>
|
||||
<script src="./lib/grid-math.js" type="text/javascript"></script>
|
||||
|
@ -64,7 +65,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<script src="./lib/gt.js" type="text/javascript"></script>
|
||||
</head>
|
||||
|
||||
<body id="mainBody" onload="initialDatabases();">
|
||||
<body id="mainBody" onload="startupApplication();">
|
||||
<div id="startupDiv">
|
||||
<div class="fill">
|
||||
<img src="gridview.png" alt="" />
|
||||
|
@ -334,7 +335,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
align="right">
|
||||
QSO
|
||||
</td>
|
||||
<td style="cursor: pointer" class="roundBorderValue" id="qsoCountStyle"
|
||||
<td style="cursor: pointer" class="roundBorderValue"
|
||||
onclick="resetSearch(); openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox);" title="Worked Stations"
|
||||
align="center">
|
||||
<div id="qsoCount">0</div>
|
||||
|
@ -354,7 +355,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
title="Show Confirmed List" align="right">
|
||||
QSL
|
||||
</td>
|
||||
<td style="cursor: pointer" class="roundBorderValue" id="qslCountStyle"
|
||||
<td style="cursor: pointer" class="roundBorderValue"
|
||||
onclick="resetSearch(); GT.filterQSL='true'; openInfoTab('qsobox', 'workedBoxDiv', showWorkedBox)"
|
||||
title="Show Confirmed List" align="center">
|
||||
<div id="qslCount">0</div>
|
||||
|
@ -369,9 +370,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
</div>
|
||||
</td>
|
||||
<td colspan="2">
|
||||
<div data-i18n="quickLoad.clearLog.label" style="min-width: 58px" id="clearOrLoadButton" class="button"
|
||||
<div data-i18n="callsigns.processing" style="display:none; padding-left:2px;padding-right:2px;" id="busyDiv" class="busyDiv">...</div>
|
||||
<div data-i18n="quickLoad.clearLog.label" id="clearOrLoadButton" class="button"
|
||||
onclick="clearOrLoadQSOs();updateCountStats();"
|
||||
title="Clear or Reload Log Data (does not delete files)">
|
||||
title="Clear or Reload Log Data">
|
||||
Clear Log
|
||||
</div>
|
||||
</td>
|
||||
|
@ -562,9 +564,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<div id="buttonSpotsBoxDiv" onClick="cycleSpotsView();" class="iconButton" title="View Spot Reports">
|
||||
<img id="spotsButtonImg" src="./img/spots.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="buttonPsk24CheckBoxDiv" onclick="grabPsk24()" class="iconButton" title="Your PSK 24hour report">
|
||||
<img id="pskImg" src="./img/psk_24_32.png" class="buttonImg" />
|
||||
</div>
|
||||
<div id="buttonQRZCheckBoxDiv" onclick="if ( ValidateQrzApi(qrzApiKey ) ) grabQrzComLog()" class="iconButton"
|
||||
title="Download log from QRZ.com">
|
||||
<img id="qrzLogImg" src="./img/log_QRZ.png" class="buttonImg" />
|
||||
|
@ -1670,6 +1669,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<option value="C">Clublog</option>
|
||||
<option value="O">Other</option>
|
||||
<option value="0">Last Loaded</option>
|
||||
<option value="1">None</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -2235,23 +2235,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr id="pskTr">
|
||||
<td data-i18n="settings.logging.PSKReporter.source">PSK-Reporter</td>
|
||||
<td>
|
||||
<input type="checkbox" checked="false" id="buttonPsk24CheckBox"
|
||||
onclick="adifMenuCheckBoxChanged(this);" />
|
||||
</td>
|
||||
<td>
|
||||
<input type="checkbox" checked="false" id="loadPsk24CheckBox"
|
||||
onclick="adifStartupCheckBoxChanged(this);" />
|
||||
</td>
|
||||
<td></td>
|
||||
<td>
|
||||
<div data-i18n="settings.logging.PSKReporter.details" id="pskDaysDiv">24 Hour History</div>
|
||||
</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td data-i18n="settings.logging.QRZcom.source">QRZ.com</td>
|
||||
<td>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -144,5 +144,17 @@
|
|||
"minZoom": 0,
|
||||
"maxZoom": 4,
|
||||
"offline": true
|
||||
},
|
||||
"GoogleMap by GoogleCN (Chinese)": {
|
||||
"url": "http://gac-geo.googlecnapps.cn/maps/vt?lyrs=m&gl=CN&x={x}&y={y}&z={z}",
|
||||
"attributions": "GoogleCN",
|
||||
"minZoom": 3,
|
||||
"maxZoom": 19
|
||||
},
|
||||
"GoogleMap Satellite by GoogleCN (Chinese)": {
|
||||
"url": "http://gac-geo.googlecnapps.cn/maps/vt?lyrs=s,m&gl=CN&x={x}&y={y}&z={z}",
|
||||
"attributions": "GoogleCN",
|
||||
"minZoom": 3,
|
||||
"maxZoom": 19
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1516,7 +1516,7 @@
|
|||
"VE9TEN/5",
|
||||
"VE9XX/6",
|
||||
"VE9ZP/4",
|
||||
"VER20231228",
|
||||
"VER20240125",
|
||||
"VF0X",
|
||||
"VF0X/M",
|
||||
"VO/DL2GF",
|
||||
|
@ -2705,6 +2705,7 @@
|
|||
"KB7SIQ",
|
||||
"KB7UBH",
|
||||
"KB7VFZ",
|
||||
"KB7WAS",
|
||||
"KB7YEC",
|
||||
"KB8LJT",
|
||||
"KB8QKR",
|
||||
|
@ -2758,6 +2759,7 @@
|
|||
"KC4PTI",
|
||||
"KC5BNN",
|
||||
"KC5CHO",
|
||||
"KC5CZC",
|
||||
"KC5DJA",
|
||||
"KC5IBS",
|
||||
"KC5KIG",
|
||||
|
@ -2905,6 +2907,7 @@
|
|||
"KE6DXH",
|
||||
"KE6FNQ",
|
||||
"KE6IPM",
|
||||
"KE6KVE",
|
||||
"KE6SYD",
|
||||
"KE6TCE",
|
||||
"KE6VUB",
|
||||
|
@ -3029,7 +3032,6 @@
|
|||
"KI4GDI",
|
||||
"KI4NGY",
|
||||
"KI4NVI",
|
||||
"KI4SET",
|
||||
"KI4SOM",
|
||||
"KI4YRQ",
|
||||
"KI5KBN",
|
||||
|
@ -3078,6 +3080,7 @@
|
|||
"KK4CLS",
|
||||
"KK4LRE",
|
||||
"KK4QXE",
|
||||
"KK4REY",
|
||||
"KK4RYG",
|
||||
"KK4WWH",
|
||||
"KK4WWI",
|
||||
|
@ -3249,6 +3252,7 @@
|
|||
"W4AUL",
|
||||
"W4BVB",
|
||||
"W4RSB",
|
||||
"W4TFS",
|
||||
"W5ERV",
|
||||
"W5JKT",
|
||||
"W5MSC",
|
||||
|
@ -3293,6 +3297,7 @@
|
|||
"WA7USX",
|
||||
"WA7YXF",
|
||||
"WB0CMZ",
|
||||
"WB1BR",
|
||||
"WB1GZL",
|
||||
"WB1ILS",
|
||||
"WB5EAA",
|
||||
|
@ -6898,6 +6903,7 @@
|
|||
"EM1U/P",
|
||||
"EM1UA",
|
||||
"EM1UC",
|
||||
"EM1UTQ",
|
||||
"FT4YM/P",
|
||||
"FT5YJ/P",
|
||||
"FT5YK/KC4",
|
||||
|
@ -7232,6 +7238,7 @@
|
|||
"EM1U/P": "73",
|
||||
"EM1UA": "73",
|
||||
"EM1UC": "73",
|
||||
"EM1UTQ": "73",
|
||||
"VP8/UW5EHR": "73",
|
||||
"AB0KG/KC4": "71",
|
||||
"KC4/AB0KG": "71",
|
||||
|
@ -10733,6 +10740,7 @@
|
|||
"R27UFA",
|
||||
"R280A",
|
||||
"R280B",
|
||||
"R2AB/8",
|
||||
"R2AEA/9",
|
||||
"R2AKM/0",
|
||||
"R2BDY/9",
|
||||
|
@ -15265,6 +15273,7 @@
|
|||
"R2BDY/9": "31",
|
||||
"R2DA/9": "31",
|
||||
"R9/UN0C": "31",
|
||||
"R9HAF/M": "31",
|
||||
"R9MJ/9": "31",
|
||||
"RA0LH/9": "31",
|
||||
"RA9H": "31",
|
||||
|
@ -15578,7 +15587,6 @@
|
|||
"R400N": "31",
|
||||
"R70B": "31",
|
||||
"R9/EW1TM": "31",
|
||||
"R9HAF/M": "31",
|
||||
"R9UAG/N": "31",
|
||||
"RA30KR": "31",
|
||||
"RA4CQ/9": "31",
|
||||
|
@ -16423,6 +16431,7 @@
|
|||
"R2BDY/9": "18",
|
||||
"R2DA/9": "18",
|
||||
"R9/UN0C": "18",
|
||||
"R9HAF/M": "18",
|
||||
"R9MJ/9": "18",
|
||||
"RA0LH/9": "18",
|
||||
"RA9H": "18",
|
||||
|
@ -16662,7 +16671,6 @@
|
|||
"R400N": "18",
|
||||
"R70B": "18",
|
||||
"R9/EW1TM": "18",
|
||||
"R9HAF/M": "18",
|
||||
"R9UAG/N": "18",
|
||||
"RA30KR": "18",
|
||||
"RA4CQ/9": "18",
|
||||
|
@ -17918,7 +17926,6 @@
|
|||
"EA6LU/P",
|
||||
"EA6URI/PAZ",
|
||||
"EA6URL/IF",
|
||||
"EA6XQ/P",
|
||||
"EA7DUT/6",
|
||||
"EA9CI/6",
|
||||
"EA9CP/6",
|
||||
|
@ -20444,6 +20451,7 @@
|
|||
"R0DAD/7",
|
||||
"R0IA/3",
|
||||
"R0IT/6",
|
||||
"R0LFX/6",
|
||||
"R0QAO/3",
|
||||
"R0QAW/3",
|
||||
"R0RA/7",
|
||||
|
@ -21167,7 +21175,6 @@
|
|||
"RT22NY",
|
||||
"RT2F/3",
|
||||
"RT2F/3/M",
|
||||
"RT2F/P",
|
||||
"RT30DX",
|
||||
"RT36MS",
|
||||
"RT4I",
|
||||
|
@ -21421,6 +21428,7 @@
|
|||
"UA0AGE/6",
|
||||
"UA0AK/3",
|
||||
"UA0BDS/1",
|
||||
"UA0CID/8",
|
||||
"UA0DM/4",
|
||||
"UA0FHC/3",
|
||||
"UA0FM/3",
|
||||
|
@ -21724,6 +21732,8 @@
|
|||
"UE80SKR/P",
|
||||
"UE80V",
|
||||
"UE80YG",
|
||||
"UE81M",
|
||||
"UE81ML",
|
||||
"UE85AGN",
|
||||
"UE85DRK",
|
||||
"UE85L",
|
||||
|
@ -23978,7 +23988,8 @@
|
|||
"TO8S",
|
||||
"TO8UFT",
|
||||
"TO9RRG",
|
||||
"TO9T"
|
||||
"TO9T",
|
||||
"VERSION"
|
||||
],
|
||||
"prefixITU": {},
|
||||
"prefixCQ": {},
|
||||
|
@ -26138,6 +26149,7 @@
|
|||
"LU3FCI/F",
|
||||
"LU3FCR/H",
|
||||
"LU3FGG/F",
|
||||
"LU3FGG/H",
|
||||
"LU3FLG/F",
|
||||
"LU3FMD/F",
|
||||
"LU3FN/H",
|
||||
|
@ -27121,6 +27133,7 @@
|
|||
"LW2DJM/D",
|
||||
"LW2DKF/D",
|
||||
"LW2DNC/D",
|
||||
"LW2DO/D",
|
||||
"LW2DOD/D",
|
||||
"LW2DOM/D",
|
||||
"LW2DOY/D",
|
||||
|
@ -27134,6 +27147,7 @@
|
|||
"LW2ECC/D",
|
||||
"LW2ECK/D",
|
||||
"LW2ECM/D",
|
||||
"LW2EDM/D",
|
||||
"LW2EFS/D",
|
||||
"LW2EHD/D",
|
||||
"LW2EIY/H",
|
||||
|
@ -27161,6 +27175,7 @@
|
|||
"LW3DKC/W",
|
||||
"LW3DKO/D",
|
||||
"LW3DKO/XA",
|
||||
"LW3DMV/D",
|
||||
"LW3DN/D",
|
||||
"LW3DRW/D",
|
||||
"LW3DSM/D",
|
||||
|
@ -30133,6 +30148,7 @@
|
|||
"PU2AIL/YL",
|
||||
"PU2RTO/LH",
|
||||
"PU3KIT/YL",
|
||||
"PU5MFI/CB",
|
||||
"PV8DX/SD",
|
||||
"PV8IG/SD",
|
||||
"PW8AA/SD",
|
||||
|
@ -30393,7 +30409,6 @@
|
|||
"AJ8HT",
|
||||
"AK0S",
|
||||
"AK2J",
|
||||
"AK4RA",
|
||||
"AL3U",
|
||||
"AL6D",
|
||||
"AL7RQ",
|
||||
|
@ -30511,7 +30526,6 @@
|
|||
"KB7JB",
|
||||
"KB7JHB",
|
||||
"KB7LPW",
|
||||
"KB7MEU",
|
||||
"KB7QKJ",
|
||||
"KB7UQH",
|
||||
"KB7UVR",
|
||||
|
@ -30666,6 +30680,7 @@
|
|||
"KE7UW",
|
||||
"KE8LGD",
|
||||
"KE8QB",
|
||||
"KE8UML",
|
||||
"KF0FMQ",
|
||||
"KF4FQR",
|
||||
"KF4IBW",
|
||||
|
@ -30754,6 +30769,7 @@
|
|||
"KG7ZJM",
|
||||
"KG9MDR",
|
||||
"KH0AI",
|
||||
"KH0B",
|
||||
"KH0HL",
|
||||
"KH0WJ",
|
||||
"KH2DC",
|
||||
|
@ -32025,6 +32041,7 @@
|
|||
"RP76KB",
|
||||
"RQ2K",
|
||||
"RT2F",
|
||||
"RT2F/P",
|
||||
"RT9K/2",
|
||||
"RT9T/2",
|
||||
"RU2F",
|
||||
|
@ -34273,7 +34290,6 @@
|
|||
"VI103WIA",
|
||||
"VI5RAS/6",
|
||||
"VI5RAS/8",
|
||||
"VI75G",
|
||||
"VI90ANZAC",
|
||||
"VI90IARU",
|
||||
"VK100WIA",
|
||||
|
@ -35734,6 +35750,7 @@
|
|||
"FO0MIC/MM3",
|
||||
"TX0A",
|
||||
"TX0M",
|
||||
"TX0QRP",
|
||||
"TX0T",
|
||||
"TX2AH",
|
||||
"TX3T",
|
||||
|
@ -36743,7 +36760,6 @@
|
|||
"K4LCR",
|
||||
"K4PFH",
|
||||
"K4VIC",
|
||||
"K4W",
|
||||
"K5YJR",
|
||||
"K6BOT",
|
||||
"KA2ABJ",
|
||||
|
@ -36874,6 +36890,7 @@
|
|||
"KG4VCC",
|
||||
"KG5AFY",
|
||||
"KG6WWV",
|
||||
"KG7BLF",
|
||||
"KG9KG",
|
||||
"KH2RU",
|
||||
"KH4AA",
|
||||
|
@ -36941,6 +36958,7 @@
|
|||
"KP4FRD/LH",
|
||||
"KP4MD/P",
|
||||
"KP4PRE/EVNT",
|
||||
"KP4QVQ/CERT",
|
||||
"KP4VP/LH",
|
||||
"KR4SQ",
|
||||
"KU4JI",
|
||||
|
@ -36973,6 +36991,7 @@
|
|||
"N3YUB",
|
||||
"N3ZII",
|
||||
"N4AKO",
|
||||
"N4ANI",
|
||||
"N4CIE",
|
||||
"N4JZD",
|
||||
"N4LER",
|
||||
|
@ -38351,6 +38370,7 @@
|
|||
"IO0MMI",
|
||||
"IO0WRTC",
|
||||
"IO0WWA",
|
||||
"IP0A",
|
||||
"IP0Y",
|
||||
"IQ0AAI",
|
||||
"IQ0AG",
|
||||
|
@ -40162,46 +40182,6 @@
|
|||
],
|
||||
"prefix": [
|
||||
"4U",
|
||||
"BG11",
|
||||
"BG12",
|
||||
"BG13",
|
||||
"BG14",
|
||||
"BG15",
|
||||
"BG16",
|
||||
"BG17",
|
||||
"BG18",
|
||||
"BG21",
|
||||
"BG22",
|
||||
"BG23",
|
||||
"BG24",
|
||||
"BG25",
|
||||
"BG26",
|
||||
"BG27",
|
||||
"BG28",
|
||||
"BG31",
|
||||
"BG32",
|
||||
"BG33",
|
||||
"BG34",
|
||||
"BG35",
|
||||
"BG36",
|
||||
"BG37",
|
||||
"BG38",
|
||||
"BS11",
|
||||
"BS12",
|
||||
"BS13",
|
||||
"BS14",
|
||||
"BS15",
|
||||
"BS16",
|
||||
"BS17",
|
||||
"BS18",
|
||||
"BS21",
|
||||
"BS22",
|
||||
"BS23",
|
||||
"BS24",
|
||||
"BS25",
|
||||
"BS26",
|
||||
"BS27",
|
||||
"BS28",
|
||||
"I"
|
||||
],
|
||||
"worked": false,
|
||||
|
@ -43649,6 +43629,7 @@
|
|||
"EA6RC/4",
|
||||
"EA6SK/2",
|
||||
"EA6SK/7",
|
||||
"EA6XQ/P",
|
||||
"EA7CFU/U",
|
||||
"EA7FC/FCJ",
|
||||
"EA7HZ/F",
|
||||
|
@ -44033,6 +44014,7 @@
|
|||
"AJ2O",
|
||||
"K2AHU",
|
||||
"K2ATZ",
|
||||
"K2DER",
|
||||
"K3BMG",
|
||||
"K5KFL",
|
||||
"K5KUB",
|
||||
|
@ -45709,6 +45691,7 @@
|
|||
"AK0P",
|
||||
"AK2OR",
|
||||
"AK4P",
|
||||
"AK4RA",
|
||||
"AK7J",
|
||||
"AL0A",
|
||||
"AL0AA",
|
||||
|
@ -45763,10 +45746,12 @@
|
|||
"AL4R",
|
||||
"AL4T",
|
||||
"AL4T/4",
|
||||
"AL4US",
|
||||
"AL4V",
|
||||
"AL4X",
|
||||
"AL5A",
|
||||
"AL5B",
|
||||
"AL5C",
|
||||
"AL5ET",
|
||||
"AL5IN",
|
||||
"AL5J",
|
||||
|
@ -46034,6 +46019,7 @@
|
|||
"K4QFS",
|
||||
"K4S",
|
||||
"K4SKY",
|
||||
"K4W",
|
||||
"K4WEM",
|
||||
"K4XS",
|
||||
"K4XSS",
|
||||
|
@ -46221,6 +46207,8 @@
|
|||
"KB7DEL",
|
||||
"KB7FS",
|
||||
"KB7HWK",
|
||||
"KB7MET",
|
||||
"KB7MEU",
|
||||
"KB7QEE",
|
||||
"KB7RQP",
|
||||
"KB7VUR",
|
||||
|
@ -46448,6 +46436,7 @@
|
|||
"KF6UPQ",
|
||||
"KF6VGT",
|
||||
"KF6XC",
|
||||
"KF7AZ",
|
||||
"KF7IJL",
|
||||
"KF7KAD",
|
||||
"KF7TUU",
|
||||
|
@ -46588,8 +46577,10 @@
|
|||
"KH2GUM/P",
|
||||
"KH2H",
|
||||
"KH2HB",
|
||||
"KH2IT",
|
||||
"KH2IW",
|
||||
"KH2JA",
|
||||
"KH2JB",
|
||||
"KH2JH",
|
||||
"KH2JK",
|
||||
"KH2JX",
|
||||
|
@ -46691,6 +46682,7 @@
|
|||
"KH6DX/M6",
|
||||
"KH6DZ",
|
||||
"KH6EAM",
|
||||
"KH6EB",
|
||||
"KH6ED",
|
||||
"KH6EE",
|
||||
"KH6EE/7",
|
||||
|
@ -47054,6 +47046,7 @@
|
|||
"KI4IGB",
|
||||
"KI4IPI",
|
||||
"KI4MGS",
|
||||
"KI4SET",
|
||||
"KI4VAK",
|
||||
"KI4WOI",
|
||||
"KI5DQL",
|
||||
|
@ -47477,6 +47470,7 @@
|
|||
"KL3ST",
|
||||
"KL3TB",
|
||||
"KL3TD",
|
||||
"KL3TI",
|
||||
"KL3TQ",
|
||||
"KL3TW",
|
||||
"KL3TY",
|
||||
|
@ -47486,6 +47480,7 @@
|
|||
"KL3VA",
|
||||
"KL3VJ",
|
||||
"KL3VN",
|
||||
"KL3VO",
|
||||
"KL3WM",
|
||||
"KL3X",
|
||||
"KL3XB",
|
||||
|
@ -47506,6 +47501,7 @@
|
|||
"KL4FX",
|
||||
"KL4GW",
|
||||
"KL4H",
|
||||
"KL4HA",
|
||||
"KL4IP",
|
||||
"KL4IY",
|
||||
"KL4J",
|
||||
|
@ -47959,6 +47955,7 @@
|
|||
"KL7RN",
|
||||
"KL7RS",
|
||||
"KL7RT",
|
||||
"KL7RV",
|
||||
"KL7RWS",
|
||||
"KL7RZ",
|
||||
"KL7S",
|
||||
|
@ -48096,6 +48093,7 @@
|
|||
"KP3JOS",
|
||||
"KP3LM",
|
||||
"KP3M",
|
||||
"KP3O",
|
||||
"KP3RC",
|
||||
"KP3RK",
|
||||
"KP3SK",
|
||||
|
@ -48406,6 +48404,7 @@
|
|||
"N2QMT",
|
||||
"N2SEX/LH",
|
||||
"N2VXF",
|
||||
"N2W",
|
||||
"N2YCX",
|
||||
"N2YZW",
|
||||
"N3BQ",
|
||||
|
@ -49343,7 +49342,6 @@
|
|||
"WB0BNR",
|
||||
"WB0EST",
|
||||
"WB0YUL",
|
||||
"WB1BR",
|
||||
"WB2AC",
|
||||
"WB3JIC",
|
||||
"WB4LMK",
|
||||
|
@ -49398,6 +49396,7 @@
|
|||
"WH0M",
|
||||
"WH0VL",
|
||||
"WH0W",
|
||||
"WH2A",
|
||||
"WH2AAT",
|
||||
"WH2ABJ",
|
||||
"WH2ABM",
|
||||
|
@ -49591,6 +49590,7 @@
|
|||
"WH6EIQ",
|
||||
"WH6EIR",
|
||||
"WH6EJD",
|
||||
"WH6EJK",
|
||||
"WH6EJV",
|
||||
"WH6EKB",
|
||||
"WH6EKI",
|
||||
|
@ -49626,6 +49626,7 @@
|
|||
"WH6EZW",
|
||||
"WH6FAD",
|
||||
"WH6FAM/3",
|
||||
"WH6FAR",
|
||||
"WH6FBA",
|
||||
"WH6FBH",
|
||||
"WH6FBM",
|
||||
|
@ -49689,10 +49690,12 @@
|
|||
"WH6GTV",
|
||||
"WH6GUP",
|
||||
"WH6GV",
|
||||
"WH6GVX",
|
||||
"WH6GWN",
|
||||
"WH6HA",
|
||||
"WH6HQ",
|
||||
"WH6IF",
|
||||
"WH6IL",
|
||||
"WH6IO",
|
||||
"WH6IW",
|
||||
"WH6IZ",
|
||||
|
@ -49744,6 +49747,7 @@
|
|||
"WH6SB",
|
||||
"WH6SD",
|
||||
"WH6SKY",
|
||||
"WH6SL",
|
||||
"WH6SR",
|
||||
"WH6SW",
|
||||
"WH6SW/1",
|
||||
|
@ -49753,6 +49757,7 @@
|
|||
"WH6TK",
|
||||
"WH6TT",
|
||||
"WH6U",
|
||||
"WH6UD",
|
||||
"WH6UO",
|
||||
"WH6USA",
|
||||
"WH6UU",
|
||||
|
@ -50039,6 +50044,7 @@
|
|||
"WL7PJ",
|
||||
"WL7PO",
|
||||
"WL7QC",
|
||||
"WL7QF",
|
||||
"WL7QX",
|
||||
"WL7RA",
|
||||
"WL7RV",
|
||||
|
@ -50108,6 +50114,7 @@
|
|||
"WP2B/0",
|
||||
"WP2BB",
|
||||
"WP2C",
|
||||
"WP2F",
|
||||
"WP2FLY",
|
||||
"WP2J",
|
||||
"WP2L",
|
||||
|
@ -50418,6 +50425,7 @@
|
|||
"WP4OJK",
|
||||
"WP4OKB",
|
||||
"WP4OKI",
|
||||
"WP4OKS",
|
||||
"WP4OLM",
|
||||
"WP4OLN",
|
||||
"WP4OMG",
|
||||
|
@ -50434,6 +50442,7 @@
|
|||
"WP4OTQ",
|
||||
"WP4OUE",
|
||||
"WP4OUP",
|
||||
"WP4OWV",
|
||||
"WP4OXA",
|
||||
"WP4OZK",
|
||||
"WP4OZP",
|
||||
|
@ -51647,6 +51656,7 @@
|
|||
"KL3QS": "07",
|
||||
"KL3SM": "07",
|
||||
"KL3VN": "07",
|
||||
"KL3VO": "07",
|
||||
"KL4IY": "07",
|
||||
"KL4JN": "07",
|
||||
"KL4TP": "07",
|
||||
|
@ -52006,7 +52016,6 @@
|
|||
"WA1BDA": "08",
|
||||
"WA1WCC/100RCA": "08",
|
||||
"WA1WCC/IMD": "08",
|
||||
"WB1BR": "08",
|
||||
"WD0FPY/1/LH": "08",
|
||||
"WH0EWX": "08",
|
||||
"WH2B": "08",
|
||||
|
@ -52160,6 +52169,7 @@
|
|||
"N2QMT": "08",
|
||||
"N2SEX/LH": "08",
|
||||
"N2VXF": "08",
|
||||
"N2W": "08",
|
||||
"N6SIW": "08",
|
||||
"ND2Y": "08",
|
||||
"NH2DC": "08",
|
||||
|
@ -52201,6 +52211,7 @@
|
|||
"WH6DLD": "08",
|
||||
"WH6DNT": "08",
|
||||
"WH6EHT": "08",
|
||||
"WH6FAR": "08",
|
||||
"WH6FRH": "08",
|
||||
"WH6GWN": "08",
|
||||
"WH6UO": "08",
|
||||
|
@ -52242,7 +52253,9 @@
|
|||
"WP4NBS": "08",
|
||||
"WP4NZF": "08",
|
||||
"WP4OCO": "08",
|
||||
"WP4OKS": "08",
|
||||
"WP4OPY": "08",
|
||||
"WP4OWV": "08",
|
||||
"WP4PZB": "08",
|
||||
"WP4R": "08",
|
||||
"WP4RPD": "08",
|
||||
|
@ -52291,6 +52304,7 @@
|
|||
"KG5FVY": "08",
|
||||
"KG6RN": "08",
|
||||
"KH2EI": "08",
|
||||
"KH2IT": "08",
|
||||
"KH2JH": "08",
|
||||
"KH2SX": "08",
|
||||
"KH6CUJ": "08",
|
||||
|
@ -52399,12 +52413,14 @@
|
|||
"WH6EEL": "08",
|
||||
"WH6EEN": "08",
|
||||
"WH6EIJ": "08",
|
||||
"WH6EJD": "08",
|
||||
"WH6EOF": "08",
|
||||
"WH6FAM/3": "08",
|
||||
"WH6FPS": "08",
|
||||
"WH6FZ": "08",
|
||||
"WH6GEU": "08",
|
||||
"WH6GIH": "08",
|
||||
"WH6IL": "08",
|
||||
"WH6IO": "08",
|
||||
"WH6KQ": "08",
|
||||
"WH6OB": "08",
|
||||
|
@ -52698,6 +52714,7 @@
|
|||
"KH6CS": "08",
|
||||
"KH6CT": "08",
|
||||
"KH6DOT": "08",
|
||||
"KH6EB": "08",
|
||||
"KH6ED": "08",
|
||||
"KH6FHS": "08",
|
||||
"KH6HHS": "08",
|
||||
|
@ -52898,6 +52915,7 @@
|
|||
"KP3BL": "08",
|
||||
"KP3BP": "08",
|
||||
"KP3DF": "08",
|
||||
"KP3O": "08",
|
||||
"KP3RC": "08",
|
||||
"KP3SK": "08",
|
||||
"KP3SW": "08",
|
||||
|
@ -53714,6 +53732,7 @@
|
|||
"KH7SE": "07",
|
||||
"KH8CG": "07",
|
||||
"KH9AE": "07",
|
||||
"KI4SET": "07",
|
||||
"KI5DQL": "07",
|
||||
"KI5MKH": "07",
|
||||
"KI6FPL": "07",
|
||||
|
@ -54002,6 +54021,7 @@
|
|||
"WH6DZU": "07",
|
||||
"WH6ECJ": "07",
|
||||
"WH6EIN": "07",
|
||||
"WH6EJK": "07",
|
||||
"WH6EKI": "07",
|
||||
"WH6EMW": "07",
|
||||
"WH6ERS": "07",
|
||||
|
@ -54022,6 +54042,7 @@
|
|||
"WH6KC": "07",
|
||||
"WH6KK": "07",
|
||||
"WH6L/5": "07",
|
||||
"WH6UD": "07",
|
||||
"WH7DW": "07",
|
||||
"WH7IN": "07",
|
||||
"WH7R": "07",
|
||||
|
@ -54274,6 +54295,7 @@
|
|||
"KH2FI/6": "06",
|
||||
"KH2H": "06",
|
||||
"KH2IW": "06",
|
||||
"KH2JB": "06",
|
||||
"KH2JX": "06",
|
||||
"KH2LU": "06",
|
||||
"KH2LW": "06",
|
||||
|
@ -54572,6 +54594,7 @@
|
|||
"WH0JA": "06",
|
||||
"WH0JSN": "06",
|
||||
"WH0M": "06",
|
||||
"WH2A": "06",
|
||||
"WH2ABM": "06",
|
||||
"WH2ABS": "06",
|
||||
"WH2ALN": "06",
|
||||
|
@ -54633,6 +54656,7 @@
|
|||
"WH6PX": "06",
|
||||
"WH6QA": "06",
|
||||
"WH6RF": "06",
|
||||
"WH6SL": "06",
|
||||
"WH6TD": "06",
|
||||
"WH6TK": "06",
|
||||
"WH6TT": "06",
|
||||
|
@ -54682,6 +54706,7 @@
|
|||
"WL7WL": "06",
|
||||
"WL7YQ/6": "06",
|
||||
"WP2AAT": "06",
|
||||
"WP2F": "06",
|
||||
"WP2Q": "06",
|
||||
"WP3OV": "06",
|
||||
"WP4CUJ": "06",
|
||||
|
@ -54784,6 +54809,7 @@
|
|||
"AL4Q/7": "06",
|
||||
"AL4R": "06",
|
||||
"AL5B": "06",
|
||||
"AL5C": "06",
|
||||
"AL5IN": "06",
|
||||
"AL5W": "06",
|
||||
"AL6U": "06",
|
||||
|
@ -54907,6 +54933,8 @@
|
|||
"KB6ZVP": "06",
|
||||
"KB7DEL": "06",
|
||||
"KB7HWK": "06",
|
||||
"KB7MET": "06",
|
||||
"KB7MEU": "06",
|
||||
"KB7QEE": "06",
|
||||
"KB7RQP": "06",
|
||||
"KB7VUR": "06",
|
||||
|
@ -54958,6 +54986,7 @@
|
|||
"KF5LBQ": "06",
|
||||
"KF6KAG": "06",
|
||||
"KF6LQF": "06",
|
||||
"KF7AZ": "06",
|
||||
"KF7IJL": "06",
|
||||
"KF7KAD": "06",
|
||||
"KG6EFD": "06",
|
||||
|
@ -55260,6 +55289,7 @@
|
|||
"KL4AO": "06",
|
||||
"KL4BQ": "06",
|
||||
"KL4FX": "06",
|
||||
"KL4HA": "06",
|
||||
"KL4IP": "06",
|
||||
"KL4KF": "06",
|
||||
"KL4NG": "06",
|
||||
|
@ -55474,6 +55504,7 @@
|
|||
"KL7RM": "06",
|
||||
"KL7RN": "06",
|
||||
"KL7RS": "06",
|
||||
"KL7RV": "06",
|
||||
"KL7S": "06",
|
||||
"KL7SK": "06",
|
||||
"KL7SP": "06",
|
||||
|
@ -55821,6 +55852,7 @@
|
|||
"WH6GJI": "06",
|
||||
"WH6GMC": "06",
|
||||
"WH6GQ": "06",
|
||||
"WH6GVX": "06",
|
||||
"WH6HQ": "06",
|
||||
"WH6KO": "06",
|
||||
"WH6LH": "06",
|
||||
|
@ -55929,6 +55961,7 @@
|
|||
"WL7P": "06",
|
||||
"WL7PJ": "06",
|
||||
"WL7QC": "06",
|
||||
"WL7QF": "06",
|
||||
"WL7QX": "06",
|
||||
"WL7RV/140": "06",
|
||||
"WL7SD": "06",
|
||||
|
@ -56085,7 +56118,6 @@
|
|||
"WH6E": "08",
|
||||
"WH6E/8": "08",
|
||||
"WH6EBA": "08",
|
||||
"WH6EJD": "08",
|
||||
"WH6EWB": "08",
|
||||
"WH6KN": "08",
|
||||
"WH6MW": "08",
|
||||
|
@ -56306,6 +56338,7 @@
|
|||
"AL2C": "08",
|
||||
"AL2F/4": "08",
|
||||
"AL4B": "08",
|
||||
"AL4US": "08",
|
||||
"AL7CX": "08",
|
||||
"AL7EU": "08",
|
||||
"AL7JN": "08",
|
||||
|
@ -56316,6 +56349,7 @@
|
|||
"AL7QO": "08",
|
||||
"K4FRZ": "08",
|
||||
"K4SKY": "08",
|
||||
"K4W": "08",
|
||||
"K4XSS": "08",
|
||||
"K6LN": "08",
|
||||
"K7VCG": "08",
|
||||
|
@ -56392,6 +56426,7 @@
|
|||
"KL3PV": "08",
|
||||
"KL3RA": "08",
|
||||
"KL3SA": "08",
|
||||
"KL3TI": "08",
|
||||
"KL3XJ": "08",
|
||||
"KL4EJ": "08",
|
||||
"KL4KA": "08",
|
||||
|
@ -56545,6 +56580,7 @@
|
|||
"WL7DP": "07",
|
||||
"WL7HP/7": "07",
|
||||
"WL7I": "07",
|
||||
"AK4RA": "08",
|
||||
"AL7LU": "08",
|
||||
"KB9OEC": "08",
|
||||
"KC8MII/AT": "08",
|
||||
|
@ -56710,6 +56746,7 @@
|
|||
"KL3QS": "04",
|
||||
"KL3SM": "04",
|
||||
"KL3VN": "04",
|
||||
"KL3VO": "04",
|
||||
"KL4IY": "04",
|
||||
"KL4JN": "04",
|
||||
"KL4TP": "04",
|
||||
|
@ -57069,7 +57106,6 @@
|
|||
"WA1BDA": "05",
|
||||
"WA1WCC/100RCA": "05",
|
||||
"WA1WCC/IMD": "05",
|
||||
"WB1BR": "05",
|
||||
"WD0FPY/1/LH": "05",
|
||||
"WH0EWX": "05",
|
||||
"WH2B": "05",
|
||||
|
@ -57223,6 +57259,7 @@
|
|||
"N2QMT": "05",
|
||||
"N2SEX/LH": "05",
|
||||
"N2VXF": "05",
|
||||
"N2W": "05",
|
||||
"N6SIW": "05",
|
||||
"ND2Y": "05",
|
||||
"NH2DC": "05",
|
||||
|
@ -57264,6 +57301,7 @@
|
|||
"WH6DLD": "05",
|
||||
"WH6DNT": "05",
|
||||
"WH6EHT": "05",
|
||||
"WH6FAR": "05",
|
||||
"WH6FRH": "05",
|
||||
"WH6GWN": "05",
|
||||
"WH6UO": "05",
|
||||
|
@ -57305,7 +57343,9 @@
|
|||
"WP4NBS": "05",
|
||||
"WP4NZF": "05",
|
||||
"WP4OCO": "05",
|
||||
"WP4OKS": "05",
|
||||
"WP4OPY": "05",
|
||||
"WP4OWV": "05",
|
||||
"WP4PZB": "05",
|
||||
"WP4R": "05",
|
||||
"WP4RPD": "05",
|
||||
|
@ -57354,6 +57394,7 @@
|
|||
"KG5FVY": "05",
|
||||
"KG6RN": "05",
|
||||
"KH2EI": "05",
|
||||
"KH2IT": "05",
|
||||
"KH2JH": "05",
|
||||
"KH2SX": "05",
|
||||
"KH6CUJ": "05",
|
||||
|
@ -57462,12 +57503,14 @@
|
|||
"WH6EEL": "05",
|
||||
"WH6EEN": "05",
|
||||
"WH6EIJ": "05",
|
||||
"WH6EJD": "05",
|
||||
"WH6EOF": "05",
|
||||
"WH6FAM/3": "05",
|
||||
"WH6FPS": "05",
|
||||
"WH6FZ": "05",
|
||||
"WH6GEU": "05",
|
||||
"WH6GIH": "05",
|
||||
"WH6IL": "05",
|
||||
"WH6IO": "05",
|
||||
"WH6KQ": "05",
|
||||
"WH6OB": "05",
|
||||
|
@ -57761,6 +57804,7 @@
|
|||
"KH6CS": "05",
|
||||
"KH6CT": "05",
|
||||
"KH6DOT": "05",
|
||||
"KH6EB": "05",
|
||||
"KH6ED": "05",
|
||||
"KH6FHS": "05",
|
||||
"KH6HHS": "05",
|
||||
|
@ -57961,6 +58005,7 @@
|
|||
"KP3BL": "05",
|
||||
"KP3BP": "05",
|
||||
"KP3DF": "05",
|
||||
"KP3O": "05",
|
||||
"KP3RC": "05",
|
||||
"KP3SK": "05",
|
||||
"KP3SW": "05",
|
||||
|
@ -58777,6 +58822,7 @@
|
|||
"KH7SE": "04",
|
||||
"KH8CG": "04",
|
||||
"KH9AE": "04",
|
||||
"KI4SET": "04",
|
||||
"KI5DQL": "04",
|
||||
"KI5MKH": "04",
|
||||
"KI6FPL": "04",
|
||||
|
@ -59065,6 +59111,7 @@
|
|||
"WH6DZU": "04",
|
||||
"WH6ECJ": "04",
|
||||
"WH6EIN": "04",
|
||||
"WH6EJK": "04",
|
||||
"WH6EKI": "04",
|
||||
"WH6EMW": "04",
|
||||
"WH6ERS": "04",
|
||||
|
@ -59085,6 +59132,7 @@
|
|||
"WH6KC": "04",
|
||||
"WH6KK": "04",
|
||||
"WH6L/5": "04",
|
||||
"WH6UD": "04",
|
||||
"WH7DW": "04",
|
||||
"WH7IN": "04",
|
||||
"WH7R": "04",
|
||||
|
@ -59337,6 +59385,7 @@
|
|||
"KH2FI/6": "03",
|
||||
"KH2H": "03",
|
||||
"KH2IW": "03",
|
||||
"KH2JB": "03",
|
||||
"KH2JX": "03",
|
||||
"KH2LU": "03",
|
||||
"KH2LW": "03",
|
||||
|
@ -59635,6 +59684,7 @@
|
|||
"WH0JA": "03",
|
||||
"WH0JSN": "03",
|
||||
"WH0M": "03",
|
||||
"WH2A": "03",
|
||||
"WH2ABM": "03",
|
||||
"WH2ABS": "03",
|
||||
"WH2ALN": "03",
|
||||
|
@ -59696,6 +59746,7 @@
|
|||
"WH6PX": "03",
|
||||
"WH6QA": "03",
|
||||
"WH6RF": "03",
|
||||
"WH6SL": "03",
|
||||
"WH6TD": "03",
|
||||
"WH6TK": "03",
|
||||
"WH6TT": "03",
|
||||
|
@ -59745,6 +59796,7 @@
|
|||
"WL7WL": "03",
|
||||
"WL7YQ/6": "03",
|
||||
"WP2AAT": "03",
|
||||
"WP2F": "03",
|
||||
"WP2Q": "03",
|
||||
"WP3OV": "03",
|
||||
"WP4CUJ": "03",
|
||||
|
@ -59847,6 +59899,7 @@
|
|||
"AL4Q/7": "03",
|
||||
"AL4R": "03",
|
||||
"AL5B": "03",
|
||||
"AL5C": "03",
|
||||
"AL5IN": "03",
|
||||
"AL5W": "03",
|
||||
"AL6U": "03",
|
||||
|
@ -59970,6 +60023,8 @@
|
|||
"KB6ZVP": "03",
|
||||
"KB7DEL": "03",
|
||||
"KB7HWK": "03",
|
||||
"KB7MET": "03",
|
||||
"KB7MEU": "03",
|
||||
"KB7QEE": "03",
|
||||
"KB7RQP": "03",
|
||||
"KB7VUR": "03",
|
||||
|
@ -60021,6 +60076,7 @@
|
|||
"KF5LBQ": "03",
|
||||
"KF6KAG": "03",
|
||||
"KF6LQF": "03",
|
||||
"KF7AZ": "03",
|
||||
"KF7IJL": "03",
|
||||
"KF7KAD": "03",
|
||||
"KG6EFD": "03",
|
||||
|
@ -60323,6 +60379,7 @@
|
|||
"KL4AO": "03",
|
||||
"KL4BQ": "03",
|
||||
"KL4FX": "03",
|
||||
"KL4HA": "03",
|
||||
"KL4IP": "03",
|
||||
"KL4KF": "03",
|
||||
"KL4NG": "03",
|
||||
|
@ -60537,6 +60594,7 @@
|
|||
"KL7RM": "03",
|
||||
"KL7RN": "03",
|
||||
"KL7RS": "03",
|
||||
"KL7RV": "03",
|
||||
"KL7S": "03",
|
||||
"KL7SK": "03",
|
||||
"KL7SP": "03",
|
||||
|
@ -60884,6 +60942,7 @@
|
|||
"WH6GJI": "03",
|
||||
"WH6GMC": "03",
|
||||
"WH6GQ": "03",
|
||||
"WH6GVX": "03",
|
||||
"WH6HQ": "03",
|
||||
"WH6KO": "03",
|
||||
"WH6LH": "03",
|
||||
|
@ -60992,6 +61051,7 @@
|
|||
"WL7P": "03",
|
||||
"WL7PJ": "03",
|
||||
"WL7QC": "03",
|
||||
"WL7QF": "03",
|
||||
"WL7QX": "03",
|
||||
"WL7RV/140": "03",
|
||||
"WL7SD": "03",
|
||||
|
@ -61148,7 +61208,6 @@
|
|||
"WH6E": "04",
|
||||
"WH6E/8": "04",
|
||||
"WH6EBA": "04",
|
||||
"WH6EJD": "04",
|
||||
"WH6EWB": "04",
|
||||
"WH6KN": "04",
|
||||
"WH6MW": "04",
|
||||
|
@ -61369,6 +61428,7 @@
|
|||
"AL2C": "04",
|
||||
"AL2F/4": "04",
|
||||
"AL4B": "04",
|
||||
"AL4US": "04",
|
||||
"AL7CX": "04",
|
||||
"AL7EU": "04",
|
||||
"AL7JN": "04",
|
||||
|
@ -61379,6 +61439,7 @@
|
|||
"AL7QO": "04",
|
||||
"K4FRZ": "04",
|
||||
"K4SKY": "04",
|
||||
"K4W": "04",
|
||||
"K4XSS": "04",
|
||||
"K6LN": "04",
|
||||
"K7VCG": "04",
|
||||
|
@ -61455,6 +61516,7 @@
|
|||
"KL3PV": "04",
|
||||
"KL3RA": "04",
|
||||
"KL3SA": "04",
|
||||
"KL3TI": "04",
|
||||
"KL3XJ": "04",
|
||||
"KL4EJ": "04",
|
||||
"KL4KA": "04",
|
||||
|
@ -61608,6 +61670,7 @@
|
|||
"WL7DP": "04",
|
||||
"WL7HP/7": "04",
|
||||
"WL7I": "04",
|
||||
"AK4RA": "05",
|
||||
"AL7LU": "05",
|
||||
"KB9OEC": "05",
|
||||
"KC8MII/AT": "05",
|
||||
|
@ -62845,7 +62908,9 @@
|
|||
"confirmed_bands": {},
|
||||
"worked_modes": {},
|
||||
"confirmed_modes": {},
|
||||
"direct": [],
|
||||
"direct": [
|
||||
"TX8GC"
|
||||
],
|
||||
"prefixITU": {},
|
||||
"prefixCQ": {},
|
||||
"directITU": {},
|
||||
|
@ -66565,6 +66630,7 @@
|
|||
"B7/BA7NQ",
|
||||
"B7/BD1TX",
|
||||
"B7CRA",
|
||||
"B9/BD8ALD",
|
||||
"B9/BH1NGG",
|
||||
"B90IARU",
|
||||
"B9CRA",
|
||||
|
@ -70052,6 +70118,7 @@
|
|||
"VK5GG/BA8MM": "43",
|
||||
"DL2JRM/BY8SKM": "43",
|
||||
"XX9AH/BG8ST": "43",
|
||||
"B9/BD8ALD": "43",
|
||||
"B9/BH1NGG": "43",
|
||||
"BG0GE/9": "43",
|
||||
"BD4HF/9": "43",
|
||||
|
@ -70086,6 +70153,7 @@
|
|||
"BG1PIP/0": "23",
|
||||
"BG4WUA/0": "23",
|
||||
"BY1WXD/0": "23",
|
||||
"B9/BD8ALD": "24",
|
||||
"B9/BH1NGG": "24",
|
||||
"BG0GE/9": "24",
|
||||
"BD4HF/9": "23",
|
||||
|
@ -72643,14 +72711,6 @@
|
|||
"TA7KB/LH",
|
||||
"TA9J/LH",
|
||||
"TC0SV/LH",
|
||||
"TC100AGE",
|
||||
"TC100HQ",
|
||||
"TC100OLD",
|
||||
"TC100TA",
|
||||
"TC100TC",
|
||||
"TC100TR",
|
||||
"TC100YEAR",
|
||||
"TC10O",
|
||||
"TC2ELH/LH",
|
||||
"TC50TRAC/01A",
|
||||
"TC50TRAC/01K",
|
||||
|
@ -75445,6 +75505,7 @@
|
|||
"ZS1FRC/LH",
|
||||
"ZS1OAK/LH",
|
||||
"ZS1OAR/LH",
|
||||
"ZS1RBI/L",
|
||||
"ZS1SKR/LH",
|
||||
"ZS1YVP/LH",
|
||||
"ZS2CR/YL",
|
||||
|
@ -76816,8 +76877,7 @@
|
|||
"TX5W",
|
||||
"TX5XG",
|
||||
"TX5Z",
|
||||
"TX6G",
|
||||
"VERSION"
|
||||
"TX6G"
|
||||
],
|
||||
"prefixITU": {},
|
||||
"prefixCQ": {},
|
||||
|
|
File diff suppressed because one or more lines are too long
Plik binarny nie jest wyświetlany.
Plik binarny nie jest wyświetlany.
Plik diff jest za duży
Load Diff
|
@ -0,0 +1,651 @@
|
|||
var GT = {};
|
||||
|
||||
importScripts("protos.js");
|
||||
importScripts("gtCommon.js");
|
||||
|
||||
GT.workerFunctions =
|
||||
{
|
||||
init: initGlobals,
|
||||
clear: clearQSO,
|
||||
parse: onAdiLoadComplete
|
||||
};
|
||||
|
||||
onmessage = (event) =>
|
||||
{
|
||||
if ("type" in event.data)
|
||||
{
|
||||
if (event.data.type in GT.workerFunctions)
|
||||
{
|
||||
GT.workerFunctions[event.data.type](event.data);
|
||||
}
|
||||
else console.log("adifWorker: unknown event type : " + event.data.type);
|
||||
}
|
||||
else console.log("adifWorker: no event type");
|
||||
};
|
||||
|
||||
function initGlobals(task)
|
||||
{
|
||||
GT.dxccInfo = task.dxccInfo; // null geo
|
||||
for (const key in GT.dxccInfo)
|
||||
{
|
||||
GT.dxccInfo[key].geo = null;
|
||||
}
|
||||
GT.dxccToCountryCode = task.dxccToCountryCode;
|
||||
GT.directCallToDXCC = task.directCallToDXCC;
|
||||
GT.directCallToITUzone = task.directCallToITUzone;
|
||||
GT.directCallToCQzone = task.directCallToCQzone;
|
||||
GT.prefixToITUzone = task.prefixToITUzone;
|
||||
GT.prefixToCQzone = task.prefixToCQzone;
|
||||
GT.prefixToMap = task.prefixToMap;
|
||||
GT.gridToState = task.gridToState;
|
||||
GT.modes = task.modes;
|
||||
GT.modes_phone = task.modes_phone;
|
||||
GT.QSOhash = task.QSOhash;
|
||||
|
||||
var returnTask = {};
|
||||
returnTask.type = "loaded";
|
||||
postMessage(returnTask);
|
||||
}
|
||||
|
||||
function clearQSO(task)
|
||||
{
|
||||
GT.QSOhash = {};
|
||||
|
||||
var returnTask = {};
|
||||
returnTask.type = "cleared"
|
||||
returnTask.clearFiles = task.clearFiles;
|
||||
returnTask.nextFunc = task.nextFunc;
|
||||
postMessage(returnTask);
|
||||
}
|
||||
|
||||
const myTextEncoder = new TextEncoder();
|
||||
const myTextDecoder = new TextDecoder();
|
||||
|
||||
function onAdiLoadComplete(task)
|
||||
{
|
||||
GT.appSettings = task.appSettings;
|
||||
GT.myQsoCalls = {};
|
||||
GT.myQsoGrids = {};
|
||||
|
||||
var liveLog = task.liveLog;
|
||||
var confirmed = false;
|
||||
var rows = 0;
|
||||
var lastHash = null;
|
||||
var validAdifFile = true;
|
||||
var eQSLfile = false;
|
||||
var clublogFile = false;
|
||||
var lotwTimestampUpdated = false;
|
||||
|
||||
if (task.rawAdiBuffer.indexOf("PSKReporter") > -1) validAdifFile = false;
|
||||
if (task.rawAdiBuffer.indexOf("Received eQSLs") > -1) eQSLfile = true;
|
||||
if (task.rawAdiBuffer.indexOf("clublog.adif") > -1 || task.rawAdiBuffer.indexOf("ADIF export from Club Log") > -1) clublogFile = true;
|
||||
|
||||
var eorRegEx = new RegExp("<EOR>", "i");
|
||||
|
||||
if (validAdifFile == true && task.rawAdiBuffer.length > 1)
|
||||
{
|
||||
var startPos = 0;
|
||||
var endPos = task.rawAdiBuffer.length;
|
||||
while (startPos != endPos)
|
||||
{
|
||||
let eor = task.rawAdiBuffer.substring(startPos).search(eorRegEx);
|
||||
if (eor != -1)
|
||||
{
|
||||
let row = task.rawAdiBuffer.substring(startPos, startPos + eor);
|
||||
startPos += eor + 5; // skip <EOR>
|
||||
let object = parseADIFRecordStrict(row);
|
||||
let confSource = null;
|
||||
let lotwConfirmed = false;
|
||||
confirmed = false;
|
||||
if (object.APP_LOTW_RXQSO)
|
||||
{
|
||||
var dRXQSO = Date.parse(object.APP_LOTW_RXQSO);
|
||||
|
||||
if ((isNaN(dRXQSO) == false) && dRXQSO > 0 && dRXQSO > task.lotw_qso)
|
||||
{
|
||||
// add a second
|
||||
dRXQSO += 1000;
|
||||
task.lotw_qso = dRXQSO;
|
||||
lotwTimestampUpdated = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (object.APP_LOTW_RXQSL)
|
||||
{
|
||||
var dRXQSL = Date.parse(object.APP_LOTW_RXQSL);
|
||||
if ((isNaN(dRXQSL) == false) && dRXQSL > 0 && dRXQSL > task.lotw_qsl)
|
||||
{
|
||||
// add a second
|
||||
dRXQSL += 1000;
|
||||
task.lotw_qsl = dRXQSL;
|
||||
lotwTimestampUpdated = true;
|
||||
}
|
||||
lotwConfirmed = true;
|
||||
}
|
||||
|
||||
var finalDEcall = "";
|
||||
if (object.STATION_CALLSIGN)
|
||||
{
|
||||
finalDEcall = object.STATION_CALLSIGN.replace("_", "/");
|
||||
}
|
||||
if (finalDEcall == "")
|
||||
{
|
||||
finalDEcall = GT.appSettings.myCall;
|
||||
}
|
||||
GT.myQsoCalls[finalDEcall] = true;
|
||||
|
||||
if (GT.appSettings.workingCallsignEnable && !(finalDEcall in GT.appSettings.workingCallsigns))
|
||||
{
|
||||
// not in the working callsigns, move to next
|
||||
continue;
|
||||
}
|
||||
|
||||
var finalTime = 0;
|
||||
|
||||
if (object.QSO_DATE && object.TIME_ON)
|
||||
{
|
||||
var dateTime = new Date(
|
||||
Date.UTC(
|
||||
object.QSO_DATE.substr(0, 4),
|
||||
parseInt(object.QSO_DATE.substr(4, 2)) - 1,
|
||||
object.QSO_DATE.substr(6, 2),
|
||||
object.TIME_ON.substr(0, 2),
|
||||
object.TIME_ON.substr(2, 2),
|
||||
object.TIME_ON.substr(4, 2)
|
||||
)
|
||||
);
|
||||
|
||||
finalTime = parseInt(dateTime.getTime() / 1000);
|
||||
}
|
||||
|
||||
if (GT.appSettings.workingDateEnable && finalTime < GT.appSettings.workingDate)
|
||||
{
|
||||
// Not after our working date
|
||||
continue;
|
||||
}
|
||||
|
||||
var myGrid = (object.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 = (object.CALL || "").replace("_", "/");
|
||||
var finalGrid = (object.GRIDSQUARE || "").toUpperCase();
|
||||
var vuccGrids = (object.VUCC_GRIDS || "").toUpperCase();
|
||||
var finalVucc = [];
|
||||
var finalRSTsent = (object.RST_SENT || "");
|
||||
var finalRSTrecv = (object.RST_RCVD || "");
|
||||
var finalBand = (object.BAND || "").toLowerCase();
|
||||
if (finalBand == "" || finalBand == "oob")
|
||||
{
|
||||
finalBand = formatBand(Number(object.FREQ || 0));
|
||||
}
|
||||
|
||||
var finalPropMode = (object.PROP_MODE || "").toUpperCase();
|
||||
var finalSatName = (object.SAT_NAME || "").toUpperCase();
|
||||
var finalCont = (object.CONT || "").toUpperCase();
|
||||
if (finalCont.length == 0)
|
||||
{
|
||||
finalCont = null;
|
||||
}
|
||||
var finalCnty = (object.CNTY || "").toUpperCase();
|
||||
if (finalCnty.length == 0)
|
||||
{
|
||||
finalCnty = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
// GT references internally with NO spaces, this is important
|
||||
finalCnty = replaceAll(finalCnty, " ", "");
|
||||
}
|
||||
var finalMode = (object.MODE || "").toUpperCase();
|
||||
var subMode = (object.SUBMODE || "").toUpperCase();
|
||||
if (subMode == "FT4" && (finalMode == "MFSK" || finalMode == "DATA"))
|
||||
{
|
||||
// Internal assigment only
|
||||
finalMode = "FT4"
|
||||
}
|
||||
if (subMode == "Q65" && (finalMode == "MFSK" || finalMode == "DATA"))
|
||||
{
|
||||
// Internal assigment only
|
||||
finalMode = "Q65"
|
||||
}
|
||||
if (subMode == "JS8" && finalMode == "MFSK")
|
||||
{
|
||||
// Internal assigment only
|
||||
finalMode = "JS8";
|
||||
}
|
||||
|
||||
var finalMsg = (object.COMMENT || "");
|
||||
var finalQslMsg = (object.QSLMSG || "");
|
||||
var finalQslMsgIntl = (object.QSLMSG_INTL || "");
|
||||
if (finalQslMsg.length > 1)
|
||||
{
|
||||
finalMsg = finalQslMsg;
|
||||
}
|
||||
if (finalQslMsgIntl.length > 1 && finalMsg == "")
|
||||
{
|
||||
finalMsg = finalQslMsgIntl;
|
||||
}
|
||||
|
||||
var finalDxcc = Number(object.DXCC || 0);
|
||||
if (finalDxcc == 0)
|
||||
{
|
||||
finalDxcc = Number(callsignToDxcc(finalDXcall));
|
||||
}
|
||||
|
||||
if (!(finalDxcc in GT.dxccInfo))
|
||||
{
|
||||
finalDxcc = Number(callsignToDxcc(finalDXcall));
|
||||
}
|
||||
|
||||
var finalState = (object.STATE || "").toUpperCase();
|
||||
if (finalState.length == 0) finalState = null;
|
||||
else if (finalDxcc > 0)
|
||||
{
|
||||
finalState = GT.dxccToCountryCode[finalDxcc] + "-" + finalState;
|
||||
}
|
||||
|
||||
var finalCqZone = (object.CQZ || "");
|
||||
if (finalCqZone.length == 1)
|
||||
{
|
||||
finalCqZone = "0" + finalCqZone;
|
||||
}
|
||||
|
||||
if (parseInt(finalCqZone) < 1 || parseInt(finalCqZone) > 40)
|
||||
{
|
||||
finalCqZone = "";
|
||||
}
|
||||
finalCqZone = String(finalCqZone);
|
||||
var finalItuZone = (object.ITUZ || "");
|
||||
if (finalItuZone.length == 1) finalItuZone = "0" + finalItuZone;
|
||||
|
||||
if (parseInt(finalItuZone) < 1 || parseInt(finalItuZone) > 90)
|
||||
{
|
||||
finalItuZone = "";
|
||||
}
|
||||
finalItuZone = String(finalItuZone);
|
||||
|
||||
var finalIOTA = (object.IOTA || "").toUpperCase();
|
||||
|
||||
var qrzConfirmed = (object.APP_QRZLOG_STATUS || "").toUpperCase();
|
||||
var lotwConfirmed1 = (object.QSL_RCVD || "").toUpperCase();
|
||||
var lotw_qsl_rcvd = (object.LOTW_QSL_RCVD || "").toUpperCase();
|
||||
var eqsl_qsl_rcvd = (object.EQSL_QSL_RCVD || "").toUpperCase();
|
||||
|
||||
if (qrzConfirmed == "C" || lotw_qsl_rcvd == "Y" || lotw_qsl_rcvd == "V" || lotwConfirmed1 == "Y" || eqsl_qsl_rcvd == "Y" || eqsl_qsl_rcvd == "V" || eQSLfile == true)
|
||||
{
|
||||
confirmed = true;
|
||||
if (qrzConfirmed == "C")
|
||||
{
|
||||
confSource = "Q";
|
||||
}
|
||||
else if (eQSLfile == true)
|
||||
{
|
||||
confSource = "e";
|
||||
}
|
||||
else if (lotwConfirmed == true)
|
||||
{
|
||||
confSource = "L";
|
||||
}
|
||||
else if (clublogFile == true)
|
||||
{
|
||||
confSource = "C";
|
||||
}
|
||||
else
|
||||
{
|
||||
confSource = "O";
|
||||
}
|
||||
}
|
||||
|
||||
finalGrid = finalGrid.substr(0, 6);
|
||||
if (!validateGridFromString(finalGrid)) finalGrid = "";
|
||||
if (finalGrid == "" && vuccGrids != "")
|
||||
{
|
||||
finalVucc = vuccGrids.split(",");
|
||||
finalGrid = finalVucc[0];
|
||||
finalVucc.shift();
|
||||
}
|
||||
var isDigital = false;
|
||||
var isPhone = false;
|
||||
if (finalMode in GT.modes)
|
||||
{
|
||||
isDigital = GT.modes[finalMode];
|
||||
}
|
||||
if (finalMode in GT.modes_phone)
|
||||
{
|
||||
isPhone = GT.modes_phone[finalMode];
|
||||
}
|
||||
// TODO: Revisit when we support more than one park ID
|
||||
var finalPOTA = (object.POTA || "").toUpperCase();
|
||||
if (finalPOTA.length == 0)
|
||||
{
|
||||
finalPOTA = null;
|
||||
}
|
||||
|
||||
if (finalDXcall != "")
|
||||
{
|
||||
lastHash = addQSO(
|
||||
finalGrid,
|
||||
finalDXcall,
|
||||
finalDEcall,
|
||||
finalRSTsent,
|
||||
finalTime,
|
||||
finalMsg,
|
||||
finalMode,
|
||||
finalBand,
|
||||
confirmed,
|
||||
finalRSTrecv,
|
||||
finalDxcc,
|
||||
finalState,
|
||||
finalCont,
|
||||
finalCnty,
|
||||
finalCqZone,
|
||||
finalItuZone,
|
||||
finalVucc,
|
||||
finalPropMode,
|
||||
isDigital,
|
||||
isPhone,
|
||||
finalIOTA,
|
||||
finalSatName,
|
||||
finalPOTA,
|
||||
confSource
|
||||
);
|
||||
}
|
||||
rows++;
|
||||
}
|
||||
else
|
||||
{
|
||||
break; // we're done
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Cam from a live event, we handly differently
|
||||
if (liveLog == true && rows == 1 && lastHash != null && confirmed == false)
|
||||
{
|
||||
var returnTask = {};
|
||||
returnTask.type = "parsedLive";
|
||||
returnTask.details = GT.QSOhash[lastHash];
|
||||
}
|
||||
else
|
||||
{
|
||||
var returnTask = {};
|
||||
returnTask.type = "parsed";
|
||||
returnTask.QSOhash = GT.QSOhash;
|
||||
returnTask.myQsoCalls = GT.myQsoCalls;
|
||||
returnTask.myQsoGrids = GT.myQsoGrids;
|
||||
returnTask.lotw_qso = task.lotw_qso;
|
||||
returnTask.lotw_qsl = task.lotw_qsl;
|
||||
returnTask.lotwTimestampUpdated = lotwTimestampUpdated;
|
||||
returnTask.nextFunc = task.nextFunc;
|
||||
}
|
||||
|
||||
postMessage(returnTask);
|
||||
}
|
||||
|
||||
function addQSO(
|
||||
finalGrid,
|
||||
finalDXcall,
|
||||
finalDEcall,
|
||||
finalRSTsent,
|
||||
finalTime,
|
||||
ifinalMsg,
|
||||
mode,
|
||||
band,
|
||||
confirmed,
|
||||
finalRSTrecv,
|
||||
finalDxcc,
|
||||
finalState,
|
||||
finalCont,
|
||||
finalCnty,
|
||||
finalCqZone,
|
||||
finalItuZone,
|
||||
finalVucc = [],
|
||||
finalPropMode = "",
|
||||
finalDigital = false,
|
||||
finalPhone = false,
|
||||
finalIOTA = "",
|
||||
finalSatName = "",
|
||||
finalPOTA = null,
|
||||
confSource = null
|
||||
)
|
||||
{
|
||||
let hash = "";
|
||||
let finalMsg = ifinalMsg.trim();
|
||||
if (finalMsg.length > 40) finalMsg = finalMsg.substring(0, 40) + "...";
|
||||
|
||||
let details = null;
|
||||
let timeMod = finalTime - ((finalTime % 60) + 30);
|
||||
hash = unique(mode + band + finalDXcall + timeMod);
|
||||
|
||||
if (hash in GT.QSOhash)
|
||||
{
|
||||
details = GT.QSOhash[hash];
|
||||
let canWrite = (details.confirmed == false || GT.appSettings.qslAuthority == "0" || GT.appSettings.qslAuthority == confSource || !(GT.appSettings.qslAuthority in details.confSrcs));
|
||||
if (GT.appSettings.qslAuthority == "1" && confirmed == true)
|
||||
{
|
||||
// Only unconfirmed can change the grid, state, county
|
||||
// This is for DO9KW
|
||||
canWrite = false;
|
||||
}
|
||||
if (finalGrid.length > 0 && finalGrid != details.grid)
|
||||
{
|
||||
// only touch the grid if it's larger than the last grid && the 4wide is the same
|
||||
if (details.grid.length < 6 && (details.grid.substr(0, 4) == finalGrid.substr(0, 4) || details.grid.length == 0))
|
||||
{
|
||||
details.grid = finalGrid;
|
||||
}
|
||||
else if (details.grid.length != 0 && confirmed == true && canWrite == true)
|
||||
{
|
||||
details.grid = finalGrid;
|
||||
}
|
||||
}
|
||||
|
||||
if (finalRSTsent.length > 0) details.RSTsent = finalRSTsent;
|
||||
if (finalRSTrecv.length > 0) details.RSTrecv = finalRSTrecv;
|
||||
if (finalCqZone.length > 0) details.cqz = finalCqZone;
|
||||
if (finalItuZone.length > 0) details.ituz = finalItuZone;
|
||||
if (details.state != null && finalState != null && details.state != finalState && confirmed == true && canWrite == true)
|
||||
{
|
||||
details.state = finalState;
|
||||
}
|
||||
else if (details.state == null && finalState != null)
|
||||
{
|
||||
details.state = finalState;
|
||||
}
|
||||
if (confirmed == true && finalDxcc > 0) details.dxcc = finalDxcc;
|
||||
if (finalDxcc < 1 && details.dxcc > 0) finalDxcc = details.dxcc;
|
||||
if (finalCont == null && details.cont) finalCont = details.cont;
|
||||
if (details.cnty != null && finalCnty != null && details.cnty != finalCnty && confirmed == true && canWrite == true)
|
||||
{
|
||||
details.cnty = finalCnty;
|
||||
}
|
||||
else if (details.cnty == null && finalCnty != null)
|
||||
{
|
||||
details.cnty = finalCnty;
|
||||
}
|
||||
if (finalPropMode.length > 0) details.propMode = finalPropMode;
|
||||
if (finalVucc.length > 0) details.vucc_grids = finalVucc;
|
||||
if (finalIOTA.length > 0) details.IOTA = finalIOTA;
|
||||
if (finalSatName.length > 0) details.satName = finalSatName;
|
||||
if (finalPOTA) details.pota = finalPOTA;
|
||||
if (confirmed == true)
|
||||
{
|
||||
details.confirmed = true;
|
||||
details.confSrcs[confSource] = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
details = {};
|
||||
details.grid = finalGrid;
|
||||
details.RSTsent = finalRSTsent;
|
||||
details.RSTrecv = finalRSTrecv;
|
||||
details.msg = "-";
|
||||
details.band = band;
|
||||
details.mode = mode;
|
||||
details.DEcall = finalDXcall;
|
||||
details.DXcall = finalDEcall;
|
||||
details.cqz = finalCqZone;
|
||||
details.ituz = finalItuZone;
|
||||
details.delta = -1;
|
||||
details.time = finalTime;
|
||||
details.state = finalState;
|
||||
details.zipcode = null;
|
||||
details.qso = true;
|
||||
details.px = null;
|
||||
details.zone = null;
|
||||
details.cont = null;
|
||||
details.cnty = finalCnty;
|
||||
details.vucc_grids = finalVucc;
|
||||
details.propMode = finalPropMode;
|
||||
details.digital = finalDigital;
|
||||
details.phone = finalPhone;
|
||||
details.IOTA = finalIOTA;
|
||||
details.satName = finalSatName;
|
||||
details.pota = finalPOTA;
|
||||
details.worked = true;
|
||||
details.confirmed = confirmed;
|
||||
details.confSrcs = {};
|
||||
|
||||
if (confirmed == true)
|
||||
{
|
||||
details.confSrcs[confSource] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (finalDxcc < 1) finalDxcc = callsignToDxcc(finalDXcall);
|
||||
details.dxcc = finalDxcc;
|
||||
|
||||
if (details.dxcc > 0 && details.px == null)
|
||||
{
|
||||
details.px = getWpx(finalDXcall);
|
||||
if (details.px) { details.zone = Number(details.px.charAt(details.px.length - 1)); }
|
||||
}
|
||||
|
||||
var fourGrid = details.grid.substr(0, 4);
|
||||
|
||||
details.cont = finalCont;
|
||||
if (finalDxcc > 0)
|
||||
{
|
||||
details.cont = GT.dxccInfo[finalDxcc].continent;
|
||||
if (details.dxcc == 390 && details.zone == 1) details.cont = "EU";
|
||||
}
|
||||
|
||||
if (details.cnty && confirmed == true)
|
||||
{
|
||||
details.qual = true;
|
||||
}
|
||||
|
||||
if (details.state == null && fourGrid.length > 0)
|
||||
{
|
||||
if (fourGrid in GT.gridToState && GT.gridToState[fourGrid].length == 1)
|
||||
{
|
||||
details.state = GT.gridToState[fourGrid][0];
|
||||
}
|
||||
}
|
||||
|
||||
if (!details.cqz || details.cqz.length == 0)
|
||||
{
|
||||
details.cqz = cqZoneFromCallsign(finalDXcall, details.dxcc);
|
||||
}
|
||||
if (!details.ituz || details.ituz.length == 0)
|
||||
{
|
||||
details.ituz = ituZoneFromCallsign(finalDXcall, details.dxcc);
|
||||
}
|
||||
|
||||
if (finalMsg.length > 0) details.msg = finalMsg;
|
||||
|
||||
details.hash = hash;
|
||||
|
||||
GT.QSOhash[hash] = details;
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
GT.strictAdif = {
|
||||
APP_LOTW_RXQSO: false,
|
||||
APP_LOTW_RXQSL: false,
|
||||
STATION_CALLSIGN: false,
|
||||
QSO_DATE: false,
|
||||
TIME_ON: false,
|
||||
MY_GRIDSQUARE: false,
|
||||
CALL: false,
|
||||
GRIDSQUARE: false,
|
||||
VUCC_GRIDS: false,
|
||||
RST_SENT: false,
|
||||
RST_RCVD: false,
|
||||
BAND: false,
|
||||
FREQ: false,
|
||||
PROP_MODE: false,
|
||||
SAT_NAME: false,
|
||||
CONT: false,
|
||||
CNTY: false,
|
||||
MODE: false,
|
||||
SUBMODE: false,
|
||||
COMMENT: true,
|
||||
QSLMSG: true,
|
||||
QSLMSG_INTL: true,
|
||||
DXCC: false,
|
||||
STATE: false,
|
||||
CQZ: false,
|
||||
ITUZ: false,
|
||||
IOTA: false,
|
||||
APP_QRZLOG_STATUS: false,
|
||||
QSL_RCVD: false,
|
||||
LOTW_QSL_RCVD: false,
|
||||
EQSL_QSL_RCVD: false,
|
||||
POTA: false,
|
||||
OPERATOR: false,
|
||||
APP_PSKREP_SNR: false
|
||||
};
|
||||
|
||||
function parseADIFRecordStrict(line)
|
||||
{
|
||||
var record = {};
|
||||
while (line.length > 0)
|
||||
{
|
||||
while (line.charAt(0) != "<" && line.length > 0)
|
||||
{
|
||||
line = line.substr(1);
|
||||
}
|
||||
if (line.length > 0)
|
||||
{
|
||||
line = line.substr(1);
|
||||
var where = line.indexOf(":");
|
||||
var nextChev = line.indexOf(">");
|
||||
if (where != -1 && nextChev > where)
|
||||
{
|
||||
var fieldName = line.substr(0, where).toUpperCase();
|
||||
line = line.substr(fieldName.length + 1);
|
||||
var fieldLength = parseInt(line);
|
||||
var end = line.indexOf(">");
|
||||
if (end > 0 && fieldName in GT.strictAdif)
|
||||
{
|
||||
line = line.substr(end + 1);
|
||||
var fieldValue;
|
||||
if (GT.strictAdif[fieldName] == true)
|
||||
{
|
||||
fieldValue = myTextDecoder.decode(myTextEncoder.encode(line.substr(0)).slice(0, fieldLength));
|
||||
}
|
||||
else
|
||||
{
|
||||
fieldValue = line.substr(0, fieldLength);
|
||||
}
|
||||
line = line.substr(fieldValue.length);
|
||||
record[fieldName] = fieldValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return record;
|
||||
}
|
|
@ -399,7 +399,7 @@ function addAlert(value, type, notify, repeat, filename, shortname)
|
|||
{
|
||||
var newKey = unique(value + type + notify + repeat + filename);
|
||||
|
||||
if (!GT.alerts.hasOwnProperty(newKey))
|
||||
if (!(newKey in GT.alerts))
|
||||
{
|
||||
var alertItem = Object();
|
||||
alertItem.value = value;
|
||||
|
@ -532,10 +532,7 @@ function checkAlerts(
|
|||
else if (grid && nalert.type == 2)
|
||||
{
|
||||
// gridsquare
|
||||
if (
|
||||
!(DEcallsign + band + mode in GT.tracker.worked.call) &&
|
||||
grid.indexOf(nalert.value) == 0
|
||||
)
|
||||
if (!(DEcallsign + band + mode in GT.tracker.worked.call) && grid.indexOf(nalert.value) == 0)
|
||||
{
|
||||
handleAlert(nalert, DEcallsign, originalMessage, callsignRecord, grid);
|
||||
hadAlert = true;
|
||||
|
@ -553,10 +550,7 @@ function checkAlerts(
|
|||
else if (nalert.type == 5)
|
||||
{
|
||||
// callsign partial
|
||||
if (
|
||||
!(DEcallsign + band + mode in GT.tracker.worked.call) &&
|
||||
DEcallsign.indexOf(nalert.value) == 0
|
||||
)
|
||||
if (!(DEcallsign + band + mode in GT.tracker.worked.call) && DEcallsign.indexOf(nalert.value) == 0)
|
||||
{
|
||||
handleAlert(nalert, DEcallsign, originalMessage, callsignRecord);
|
||||
hadAlert = true;
|
||||
|
@ -596,20 +590,15 @@ function handleAlert(nAlert, target, lastMessage, callsignRecord, grid)
|
|||
nAlert.lastMessage = lastMessage;
|
||||
nAlert.lastTime = timeNowSec();
|
||||
|
||||
if (callsignRecord != null)
|
||||
if (nAlert.notify == 3 && callsignRecord != null && grid.length == 4)
|
||||
{
|
||||
if (
|
||||
typeof callsignRecord.rect != "undefined" &&
|
||||
callsignRecord.rect != null &&
|
||||
nAlert.notify == 3
|
||||
)
|
||||
var LL = squareToCenter(grid);
|
||||
|
||||
if (!isNaN(LL.a))
|
||||
{
|
||||
// Fix me
|
||||
GT.map
|
||||
.getView()
|
||||
.setCenter(
|
||||
ol.extent.getCenter(callsignRecord.rect.getGeometry().getExtent())
|
||||
);
|
||||
.setCenter(ol.proj.transform([LL.o, LL.a], "EPSG:4326", "EPSG:3857"));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -638,9 +627,9 @@ function handleAlert(nAlert, target, lastMessage, callsignRecord, grid)
|
|||
nAlert.fired++;
|
||||
}
|
||||
|
||||
function playAlertMediaFile(filename, overrideMute)
|
||||
function playAlertMediaFile(filename)
|
||||
{
|
||||
if (GT.appSettings.alertMute && !overrideMute) return;
|
||||
if (GT.appSettings.alertMute == 1) return;
|
||||
|
||||
// check if this is an alert stored with an older version of GT
|
||||
// which has a full file path given.
|
||||
|
|
|
@ -134,9 +134,9 @@ var GreatCircle = function (start, end, properties)
|
|||
{
|
||||
throw new Error(
|
||||
"it appears " +
|
||||
start.view() +
|
||||
this.start +
|
||||
" and " +
|
||||
end.view() +
|
||||
this.end +
|
||||
" are 'antipodal', e.g diametrically opposite, thus there is no single route but rather infinite"
|
||||
);
|
||||
}
|
||||
|
|
|
@ -12,9 +12,10 @@ GT.eqslFile = "";
|
|||
GT.eqslWhenDate = 0;
|
||||
GT.eqslLoadTimer = null;
|
||||
|
||||
GT.ulsCallsigns = Object();
|
||||
GT.ulsCallsignsCount = 0;
|
||||
GT.ulsWhenDate = 0;
|
||||
GT.ulsLoadTimer = null;
|
||||
GT.ulsFile = "";
|
||||
|
||||
GT.cacCallsigns = Object();
|
||||
GT.cacFile = "";
|
||||
|
@ -67,6 +68,7 @@ function callsignServicesInit()
|
|||
GT.oqrsFile = GT.NWappData + "cloqrs-callsigns.json";
|
||||
GT.cacFile = GT.NWappData + "canada-callsigns.txt";
|
||||
GT.ausFile = GT.NWappData + "aus-callsigns.txt";
|
||||
GT.ulsFile = GT.NWappData + "uls-callsigns.txt";
|
||||
|
||||
if (GT.callsignLookups.lotwUseEnable)
|
||||
{
|
||||
|
@ -224,6 +226,7 @@ function processLotwCallsigns(result, flag)
|
|||
}
|
||||
|
||||
GT.callsignLookups.lotwLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.lotwLoadTimer != null) nodeTimers.clearTimeout(GT.lotwLoadTimer);
|
||||
|
@ -286,7 +289,6 @@ function parseCacCallsigns(data)
|
|||
}
|
||||
}
|
||||
fs.writeFileSync(GT.cacFile, data, "UTF-8");
|
||||
updateQSO();
|
||||
}
|
||||
|
||||
function processCacCallsigns(buffer, flag)
|
||||
|
@ -295,6 +297,7 @@ function processCacCallsigns(buffer, flag)
|
|||
parseCacCallsigns(data);
|
||||
|
||||
GT.callsignLookups.cacLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.cacLoadTimer != null) nodeTimers.clearTimeout(GT.cacLoadTimer);
|
||||
|
@ -355,7 +358,9 @@ function ausLoadCallsigns()
|
|||
{
|
||||
var now = timeNowSec();
|
||||
if (now - GT.callsignLookups.ausLastUpdate > 86400 * 7)
|
||||
{ GT.callsignLookups.ausLastUpdate = 0; }
|
||||
{
|
||||
GT.callsignLookups.ausLastUpdate = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
var ausWhenTimer = 86400 * 7 - (now - GT.callsignLookups.ausLastUpdate);
|
||||
|
@ -397,7 +402,6 @@ function parseAusCallsigns(data)
|
|||
}
|
||||
}
|
||||
fs.writeFileSync(GT.ausFile, data, "UTF-8");
|
||||
updateQSO();
|
||||
}
|
||||
|
||||
function processAusCallsigns(buffer, flag)
|
||||
|
@ -406,6 +410,7 @@ function processAusCallsigns(buffer, flag)
|
|||
parseAusCallsigns(data);
|
||||
|
||||
GT.callsignLookups.ausLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.ausLoadTimer != null) nodeTimers.clearTimeout(GT.ausLoadTimer);
|
||||
|
@ -553,6 +558,7 @@ function processoqrsCallsigns(buffer, flag)
|
|||
GT.oqrsCallsigns = JSON.parse(buffer);
|
||||
|
||||
GT.callsignLookups.oqrsLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.oqrsLoadTimer != null) nodeTimers.clearTimeout(GT.oqrsLoadTimer);
|
||||
|
@ -663,6 +669,7 @@ function processeqslCallsigns(buffer, flag)
|
|||
GT.eqslCallsigns[lines[x].trim()] = true;
|
||||
}
|
||||
GT.callsignLookups.eqslLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
var now = timeNowSec();
|
||||
if (GT.eqslLoadTimer != null) nodeTimers.clearTimeout(GT.eqslLoadTimer);
|
||||
|
@ -679,26 +686,25 @@ function processeqslCallsigns(buffer, flag)
|
|||
|
||||
function ulsLoadCallsigns()
|
||||
{
|
||||
if (GT.ulsLoadTimer != null)
|
||||
{
|
||||
nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
GT.ulsLoadTimer = null;
|
||||
}
|
||||
|
||||
var now = timeNowSec();
|
||||
if (now - GT.callsignLookups.ulsLastUpdate > 86400 * 7) ulsDownload();
|
||||
else
|
||||
{
|
||||
var ulsWhenTimer = 86400 * 7 - (now - GT.callsignLookups.ulsLastUpdate);
|
||||
GT.ulsWhenDate = now + ulsWhenTimer;
|
||||
GT.ulsLoadTimer = nodeTimers.setTimeout(ulsDownload, ulsWhenTimer * 1000);
|
||||
updateCallsignCount();
|
||||
if (!fs.existsSync(GT.ulsFile))
|
||||
{
|
||||
GT.callsignLookups.ulsLastUpdate = 0;
|
||||
ulsDownload();
|
||||
}
|
||||
else
|
||||
{
|
||||
loadULSFile();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function updateQSO()
|
||||
function stateCheck()
|
||||
{
|
||||
if (GT.ulsCallsignsCount > 0 && GT.callsignLookups.ulsUseEnable)
|
||||
if (GT.callsignLookups.ulsUseEnable)
|
||||
{
|
||||
for (let hash in GT.QSOhash)
|
||||
{
|
||||
|
@ -708,7 +714,6 @@ function updateQSO()
|
|||
let lookupCall = false;
|
||||
if ((details.cnty == null || details.state == null))
|
||||
{
|
||||
// Do County Lookup
|
||||
lookupCall = true;
|
||||
}
|
||||
else if (details.cnty != null)
|
||||
|
@ -728,9 +733,9 @@ function updateQSO()
|
|||
}
|
||||
}
|
||||
}
|
||||
if (lookupCall)
|
||||
if (lookupCall == true)
|
||||
{
|
||||
lookupKnownCallsign(details, true);
|
||||
lookupKnownCallsign(details);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -756,29 +761,13 @@ function updateQSO()
|
|||
}
|
||||
}
|
||||
}
|
||||
refreshQSOs();
|
||||
}
|
||||
}
|
||||
|
||||
function updateCallsignCount()
|
||||
{
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
tx.executeSql("SELECT count(*) as cnt FROM calls", [],
|
||||
function (tx, results)
|
||||
{
|
||||
var len = results.rows.length, i;
|
||||
if (len == 1)
|
||||
{
|
||||
GT.ulsCallsignsCount = results.rows[0].cnt;
|
||||
ulsCountTd.innerHTML = GT.ulsCallsignsCount;
|
||||
|
||||
updateQSO();
|
||||
}
|
||||
},
|
||||
null
|
||||
);
|
||||
});
|
||||
GT.ulsCallsignsCount = Object.keys(GT.ulsCallsigns).length;
|
||||
ulsCountTd.innerHTML = GT.ulsCallsignsCount;
|
||||
}
|
||||
|
||||
function ulsSettingsDisplay()
|
||||
|
@ -796,8 +785,6 @@ function ulsSettingsDisplay()
|
|||
|
||||
if (!GT.callsignLookups.ulsUseEnable)
|
||||
{
|
||||
if (GT.ulsLoadTimer != null) nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
GT.ulsLoadTimer = null;
|
||||
GT.ulsCallsignsCount = 0;
|
||||
ulsCountTd.innerHTML = GT.ulsCallsignsCount;
|
||||
}
|
||||
|
@ -806,7 +793,7 @@ function ulsSettingsDisplay()
|
|||
function ulsValuesChanged()
|
||||
{
|
||||
GT.callsignLookups.ulsUseEnable = ulsUseEnable.checked;
|
||||
|
||||
|
||||
if (GT.callsignLookups.ulsUseEnable == true)
|
||||
{
|
||||
ulsLoadCallsigns();
|
||||
|
@ -814,11 +801,11 @@ function ulsValuesChanged()
|
|||
else
|
||||
{
|
||||
resetULSDatabase();
|
||||
ulsSettingsDisplay();
|
||||
ulsCountTd.innerHTML = 0;
|
||||
}
|
||||
saveCallsignSettings();
|
||||
|
||||
ulsSettingsDisplay();
|
||||
goProcessRoster();
|
||||
if (GT.rosterInitialized) GT.callRosterWindowHandle.window.resize();
|
||||
}
|
||||
|
@ -827,241 +814,106 @@ function ulsDownload()
|
|||
{
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Downloading...</i></b>";
|
||||
ulsCountTd.innerHTML = 0;
|
||||
getChunkedBuffer(
|
||||
getBuffer(
|
||||
"https://storage.googleapis.com/gt_app/callsigns/callsigns.txt",
|
||||
processulsCallsigns,
|
||||
ulsDownloadHandler,
|
||||
null,
|
||||
"http",
|
||||
80
|
||||
);
|
||||
}
|
||||
|
||||
function getChunkedBuffer(file_url, callback, flag, mode, port, cookie, errorHandler)
|
||||
{
|
||||
var url = require("url");
|
||||
var http = require(mode);
|
||||
var fileBuffer = null;
|
||||
var options = null;
|
||||
if (cookie != null)
|
||||
{
|
||||
options = {
|
||||
host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api
|
||||
port: port,
|
||||
followAllRedirects: true,
|
||||
path: url.parse(file_url).path, // eslint-disable-line node/no-deprecated-api
|
||||
headers: {
|
||||
Cookie: cookie
|
||||
}
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
options = {
|
||||
host: url.parse(file_url).host, // eslint-disable-line node/no-deprecated-api
|
||||
port: port,
|
||||
followAllRedirects: true,
|
||||
path: url.parse(file_url).path // eslint-disable-line node/no-deprecated-api
|
||||
};
|
||||
}
|
||||
http.get(options, function (res)
|
||||
{
|
||||
var fsize = res.headers["content-length"];
|
||||
var fread = 0;
|
||||
var cookies = null;
|
||||
if (typeof res.headers["set-cookie"] != "undefined")
|
||||
{
|
||||
cookies = res.headers["set-cookie"];
|
||||
}
|
||||
res
|
||||
.on("data", function (data)
|
||||
{
|
||||
var isEnd = false;
|
||||
fread += data.length;
|
||||
if (fread == fsize) isEnd = true;
|
||||
if (fileBuffer == null)
|
||||
{
|
||||
fileBuffer = callback(data, flag, cookies, true, isEnd);
|
||||
}
|
||||
else
|
||||
{
|
||||
fileBuffer = callback(fileBuffer + data, flag, cookies, false, isEnd); // eslint-disable-line node/no-callback-literal
|
||||
}
|
||||
})
|
||||
.on("end", function () {})
|
||||
.on("error", function (e)
|
||||
{
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Error downloading</i></b>";
|
||||
console.error("Got error: " + e.message);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
GT.ulsDatabase = openDatabase(
|
||||
"ulsDB",
|
||||
"1.0",
|
||||
"US Callsigns",
|
||||
50 * 1024 * 1024
|
||||
);
|
||||
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
tx.executeSql("CREATE TABLE IF NOT EXISTS calls (callsign TEXT PRIMARY KEY, zip, state)");
|
||||
});
|
||||
|
||||
function resetULSDatabase()
|
||||
{
|
||||
GT.callsignLookups.ulsLastUpdate = 0;
|
||||
GT.ulsCallsignsCount = 0;
|
||||
GT.ulsCallsigns = {};
|
||||
|
||||
saveCallsignSettings();
|
||||
}
|
||||
|
||||
function processulsCallsigns(data, flag, cookies, starting, finished)
|
||||
function ulsDownloadHandler(data)
|
||||
{
|
||||
var buffer = String(data);
|
||||
var returnBuffer = "";
|
||||
fs.writeFileSync(GT.ulsFile, data);
|
||||
|
||||
GT.callsignLookups.ulsLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
|
||||
loadULSFile();
|
||||
}
|
||||
|
||||
function loadULSFile()
|
||||
{
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Processing...</i></b>";
|
||||
fs.readFile(GT.ulsFile, "utf-8", processulsCallsigns);
|
||||
}
|
||||
|
||||
function processulsCallsigns(error, buffer)
|
||||
{
|
||||
if (error)
|
||||
{
|
||||
console.log("File Read Error: " + error);
|
||||
}
|
||||
|
||||
if (buffer && buffer.length > 0)
|
||||
{
|
||||
var lines = null;
|
||||
GT.ulsCallsigns = {};
|
||||
|
||||
if (buffer[buffer.length - 1] == "\n")
|
||||
var startPos = 0;
|
||||
var endPos = buffer.length;
|
||||
while (startPos != endPos)
|
||||
{
|
||||
lines = buffer.split("\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
var lastIndex = buffer.lastIndexOf("\n");
|
||||
returnBuffer = buffer.substring(lastIndex);
|
||||
lines = buffer.substring(0, lastIndex).split("\n");
|
||||
}
|
||||
|
||||
if (lines.length > 0)
|
||||
{
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
let eol = buffer.substring(startPos).indexOf("\n");
|
||||
if (eol > -1)
|
||||
{
|
||||
if (starting == true)
|
||||
{
|
||||
if (GT.ulsLoadTimer != null)
|
||||
{
|
||||
nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
}
|
||||
GT.ulsLoadTimer = null;
|
||||
GT.ulsWhenDate = 0;
|
||||
GT.ulsCallsignsCount = 0;
|
||||
ulsUpdatedTd.innerHTML = "<b><i>Processing...</i></b>";
|
||||
tx.executeSql("delete from calls");
|
||||
}
|
||||
for (var x in lines)
|
||||
{
|
||||
if (lines[x].length)
|
||||
{
|
||||
++GT.ulsCallsignsCount;
|
||||
tx.executeSql("INSERT INTO calls (rowid, callsign, zip, state) VALUES (" + GT.ulsCallsignsCount + ",\"" + lines[x].substr(7) + "\",\"" + lines[x].substr(0, 5) + "\",\"" + lines[x].substr(5, 2) + "\")");
|
||||
if (GT.ulsCallsignsCount % 10000 == 0)
|
||||
{
|
||||
tx.executeSql(
|
||||
"SELECT count(*) as cnt FROM calls",
|
||||
[],
|
||||
function (rx, results)
|
||||
{
|
||||
var len = results.rows.length;
|
||||
if (len == 1)
|
||||
{
|
||||
ulsCountTd.innerHTML = results.rows[0].cnt;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
lines = null;
|
||||
});
|
||||
let row = buffer.substring(startPos, startPos + eol);
|
||||
GT.ulsCallsigns[row.substring(7)] = row.substring(0, 7);
|
||||
startPos += eol + 1; // skip \n
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (finished == true)
|
||||
updateCallsignCount();
|
||||
ulsSettingsDisplay();
|
||||
|
||||
if (GT.ulsLoadTimer != null)
|
||||
{
|
||||
var now = timeNowSec();
|
||||
|
||||
if (GT.ulsLoadTimer != null)
|
||||
{
|
||||
nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
}
|
||||
|
||||
var ulsWhenTimer = 86400 * 7;
|
||||
GT.ulsWhenDate = ulsWhenTimer + now;
|
||||
GT.ulsLoadTimer = nodeTimers.setTimeout(ulsDownload, ulsWhenTimer * 1000);
|
||||
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
{
|
||||
tx.executeSql(
|
||||
"SELECT count(*) as cnt FROM calls",
|
||||
[],
|
||||
function (rx, results)
|
||||
{
|
||||
var len = results.rows.length,
|
||||
i;
|
||||
if (len == 1)
|
||||
{
|
||||
GT.ulsCallsignsCount = results.rows[0].cnt;
|
||||
ulsCountTd.innerHTML = GT.ulsCallsignsCount;
|
||||
GT.callsignLookups.ulsLastUpdate = timeNowSec();
|
||||
saveCallsignSettings();
|
||||
ulsSettingsDisplay();
|
||||
updateQSO();
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
nodeTimers.clearTimeout(GT.ulsLoadTimer);
|
||||
GT.ulsLoadTimer = null;
|
||||
}
|
||||
|
||||
return Buffer(returnBuffer); // eslint-disable-line node/no-deprecated-api
|
||||
var whenTimer = (86400 * 7) - (timeNowSec() - GT.callsignLookups.ulsLastUpdate);
|
||||
GT.ulsLoadTimer = nodeTimers.setTimeout(ulsDownload, whenTimer * 1000);
|
||||
}
|
||||
|
||||
function lookupKnownCallsign(object, writeState = false)
|
||||
function lookupKnownCallsign(object)
|
||||
{
|
||||
GT.ulsDatabase.transaction(function (tx)
|
||||
if (object.DEcall in GT.ulsCallsigns)
|
||||
{
|
||||
let qry = "SELECT * FROM calls where callsign = \"" + object.DEcall + "\"";
|
||||
tx.executeSql(
|
||||
qry,
|
||||
[],
|
||||
function (tx, results)
|
||||
if (object.state == null)
|
||||
{
|
||||
object.state = "US-" + GT.ulsCallsigns[object.DEcall].substring(5);
|
||||
}
|
||||
object.zipcode = GT.ulsCallsigns[object.DEcall].substring(0, 5);
|
||||
|
||||
if (object.cnty == null && object.zipcode in GT.zipToCounty)
|
||||
{
|
||||
var counties = GT.zipToCounty[object.zipcode];
|
||||
if (counties.length > 1)
|
||||
{
|
||||
if (results.rows.length == 1)
|
||||
{
|
||||
if (object.state == null)
|
||||
{
|
||||
object.state = "US-" + results.rows[0].state;
|
||||
if (writeState)
|
||||
{
|
||||
refreshQSOs();
|
||||
}
|
||||
}
|
||||
object.zipcode = String(results.rows[0].zip);
|
||||
if (object.cnty == null && object.zipcode in GT.zipToCounty)
|
||||
{
|
||||
var counties = GT.zipToCounty[object.zipcode];
|
||||
if (counties.length > 1)
|
||||
{
|
||||
object.qual = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
object.qual = true;
|
||||
}
|
||||
object.cnty = counties[0];
|
||||
save = true;
|
||||
|
||||
if (writeState)
|
||||
{
|
||||
refreshQSOs();
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
null
|
||||
);
|
||||
});
|
||||
object.qual = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
object.qual = true;
|
||||
}
|
||||
object.cnty = counties[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function downloadCtyDat()
|
||||
|
|
|
@ -143,12 +143,10 @@ var def_adifLogSettings = {
|
|||
buttonAdifCheckBox: false,
|
||||
buttonClubCheckBox: false,
|
||||
buttonLOTWCheckBox: false,
|
||||
buttonQRZCheckBox: false,
|
||||
buttonPsk24CheckBox: false
|
||||
buttonQRZCheckBox: false
|
||||
},
|
||||
startup: {
|
||||
loadAdifCheckBox: false,
|
||||
loadPsk24CheckBox: false,
|
||||
loadQRZCheckBox: false,
|
||||
loadLOTWCheckBox: false,
|
||||
loadClubCheckBox: false,
|
||||
|
@ -188,8 +186,8 @@ var def_adifLogSettings = {
|
|||
},
|
||||
downloads: {},
|
||||
lastFetch: {
|
||||
lotw_qso: "1970-01-01",
|
||||
lotw_qsl: "1970-01-01"
|
||||
lotw_qso: 0,
|
||||
lotw_qsl: 0
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -324,7 +322,6 @@ var def_qso = {
|
|||
px: null,
|
||||
qso: true,
|
||||
qual: false,
|
||||
rect: null,
|
||||
RSTrecv: "",
|
||||
RSTsent: "",
|
||||
satName: "",
|
||||
|
@ -332,7 +329,7 @@ var def_qso = {
|
|||
time: 0,
|
||||
vucc_grids: [],
|
||||
worked: false,
|
||||
wspr: null,
|
||||
zipcode: null,
|
||||
zone: null
|
||||
zone: null,
|
||||
hash: null
|
||||
};
|
||||
|
|
1502
package.nw/lib/gt.js
1502
package.nw/lib/gt.js
Plik diff jest za duży
Load Diff
|
@ -0,0 +1,552 @@
|
|||
// GridTracker Copyright © 2024 GridTracker.org
|
||||
// All rights reserved.
|
||||
// See LICENSE for more information.
|
||||
// gtCommon.js is common functions used by gt.js , adifWorker.js, trackerWorker.js and others
|
||||
// var GT must be initiliazed before loading this script.
|
||||
|
||||
function validateGridFromString(inputText)
|
||||
{
|
||||
var validGrid = false;
|
||||
if (inputText.length == 4 || inputText.length == 6)
|
||||
{
|
||||
var LETTERS = inputText.substr(0, 2);
|
||||
var NUMBERS = inputText.substr(2, 2);
|
||||
if (/^[A-R]+$/.test(LETTERS) && /^[0-9]+$/.test(NUMBERS))
|
||||
{
|
||||
validGrid = true;
|
||||
}
|
||||
if (validGrid && inputText.length == 6)
|
||||
{
|
||||
var LETTERS_SUB = inputText.substr(4, 2);
|
||||
if (!(/^[A-Xa-x]+$/.test(LETTERS_SUB)))
|
||||
{
|
||||
validGrid = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return validGrid;
|
||||
}
|
||||
|
||||
function cqZoneFromCallsign(insign, dxcc)
|
||||
{
|
||||
var callsign = insign;
|
||||
|
||||
if (!/\d/.test(callsign) || !/[a-zA-Z]/.test(callsign))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (callsign in GT.directCallToCQzone) { return GT.directCallToCQzone[callsign]; }
|
||||
|
||||
for (var x = callsign.length; x > 0; x--)
|
||||
{
|
||||
if (callsign.substr(0, x) in GT.prefixToCQzone)
|
||||
{
|
||||
return GT.prefixToCQzone[callsign.substr(0, x)];
|
||||
}
|
||||
}
|
||||
|
||||
if (dxcc > 0)
|
||||
{
|
||||
return GT.dxccInfo[dxcc].cqzone;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function ituZoneFromCallsign(insign, dxcc)
|
||||
{
|
||||
var callsign = insign;
|
||||
|
||||
if (!/\d/.test(callsign) || !/[a-zA-Z]/.test(callsign))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (callsign in GT.directCallToITUzone) { return GT.directCallToITUzone[callsign]; }
|
||||
|
||||
for (var x = callsign.length; x > 0; x--)
|
||||
{
|
||||
if (callsign.substr(0, x) in GT.prefixToITUzone)
|
||||
{
|
||||
return GT.prefixToITUzone[callsign.substr(0, x)];
|
||||
}
|
||||
}
|
||||
|
||||
if (dxcc > 0)
|
||||
{
|
||||
return GT.dxccInfo[dxcc].ituzone;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function getWpx(callsign)
|
||||
{
|
||||
var prefix = null;
|
||||
|
||||
if (callsign.includes("/"))
|
||||
// Handle in the future?
|
||||
{ return null; }
|
||||
if (!/\d/.test(callsign))
|
||||
// Insert 0, never seen this
|
||||
{ return null; }
|
||||
|
||||
var end = callsign.length;
|
||||
var foundPrefix = false;
|
||||
var prefixEnd = 1;
|
||||
while (prefixEnd != end)
|
||||
{
|
||||
if (/\d/.test(callsign.charAt(prefixEnd)))
|
||||
{
|
||||
while (prefixEnd + 1 != end && /\d/.test(callsign.charAt(prefixEnd + 1))) { prefixEnd++; }
|
||||
foundPrefix = true;
|
||||
break;
|
||||
}
|
||||
prefixEnd++;
|
||||
}
|
||||
|
||||
if (foundPrefix) prefix = callsign.substr(0, prefixEnd + 1);
|
||||
|
||||
return String(prefix);
|
||||
}
|
||||
|
||||
GT.ancPrefixes = ["P", "M", "MM", "AM", "A", "NWS"];
|
||||
|
||||
function callsignToDxcc(insign)
|
||||
{
|
||||
var callsign = insign;
|
||||
|
||||
if (!/\d/.test(callsign) || !/[a-zA-Z]/.test(callsign))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (callsign in GT.directCallToDXCC) { return Number(GT.directCallToDXCC[callsign]); }
|
||||
|
||||
if (callsign.includes("/"))
|
||||
{
|
||||
var parts = callsign.split("/");
|
||||
var end = parts.length - 1;
|
||||
if (GT.ancPrefixes.includes(parts[end]))
|
||||
{
|
||||
if (parts[end].toUpperCase() == "MM")
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
parts.pop();
|
||||
end = parts.length - 1;
|
||||
}
|
||||
if (end)
|
||||
{
|
||||
if (isNaN(parts[end]))
|
||||
{
|
||||
if (parts[1].length > parts[0].length)
|
||||
{
|
||||
callsign = parts[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (callsignToDxcc(parts[1]) != -1) callsign = parts[1];
|
||||
else callsign = parts[0];
|
||||
}
|
||||
}
|
||||
else callsign = parts[0];
|
||||
}
|
||||
else callsign = parts[0];
|
||||
|
||||
if (callsign in GT.directCallToDXCC) { return Number(GT.directCallToDXCC[callsign]); }
|
||||
}
|
||||
|
||||
for (var x = callsign.length; x > 0; x--)
|
||||
{
|
||||
if (callsign.substr(0, x) in GT.prefixToMap)
|
||||
{
|
||||
return Number(GT.dxccInfo[GT.prefixToMap[callsign.substr(0, x)]].dxcc);
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
function initQSOdata()
|
||||
{
|
||||
GT.tracker = {};
|
||||
GT.tracker.worked = {};
|
||||
GT.tracker.confirmed = {};
|
||||
|
||||
GT.tracker.worked.call = {};
|
||||
GT.tracker.worked.grid = {};
|
||||
GT.tracker.worked.dxcc = {};
|
||||
GT.tracker.worked.cqz = {};
|
||||
GT.tracker.worked.ituz = {};
|
||||
GT.tracker.worked.state = {};
|
||||
GT.tracker.worked.px = {};
|
||||
GT.tracker.worked.cnty = {};
|
||||
GT.tracker.worked.cont = {};
|
||||
GT.tracker.worked.pota = {};
|
||||
|
||||
GT.tracker.confirmed.call = {};
|
||||
GT.tracker.confirmed.grid = {};
|
||||
GT.tracker.confirmed.dxcc = {};
|
||||
GT.tracker.confirmed.cqz = {};
|
||||
GT.tracker.confirmed.ituz = {};
|
||||
GT.tracker.confirmed.state = {};
|
||||
GT.tracker.confirmed.px = {};
|
||||
GT.tracker.confirmed.cnty = {};
|
||||
GT.tracker.confirmed.cont = {};
|
||||
GT.tracker.confirmed.pota = {};
|
||||
}
|
||||
|
||||
function trackQSO(details, currentYear)
|
||||
{
|
||||
let qsoDate = new Date(1970, 0, 1); qsoDate.setSeconds(details.time);
|
||||
let isCurrentYear = (qsoDate.getFullYear() == currentYear);
|
||||
let dayAsString = String(parseInt(details.time / 86400));
|
||||
let fourGrid = details.grid.substr(0, 4);
|
||||
let isDigi = details.digital;
|
||||
let isPhone = details.phone;
|
||||
|
||||
GT.tracker.worked.call[details.DEcall + details.band + details.mode] = true;
|
||||
GT.tracker.worked.call[details.DEcall] = true;
|
||||
GT.tracker.worked.call[details.DEcall + details.mode] = true;
|
||||
GT.tracker.worked.call[details.DEcall + details.band] = true;
|
||||
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.call[details.DEcall + "dg"] = true;
|
||||
GT.tracker.worked.call[details.DEcall + details.band + "dg"] = true;
|
||||
}
|
||||
|
||||
if (fourGrid != "")
|
||||
{
|
||||
GT.tracker.worked.grid[fourGrid] = true;
|
||||
GT.tracker.worked.grid[fourGrid + details.mode] = true;
|
||||
GT.tracker.worked.grid[fourGrid + details.band] = true;
|
||||
GT.tracker.worked.grid[fourGrid + details.band + details.mode] = true
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.grid[fourGrid + "dg"] = true;
|
||||
GT.tracker.worked.grid[fourGrid + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.ituz)
|
||||
{
|
||||
GT.tracker.worked.ituz[details.ituz + "|" + details.band + details.mode] = true;
|
||||
GT.tracker.worked.ituz[details.ituz + "|"] = true;
|
||||
GT.tracker.worked.ituz[details.ituz + "|" + details.mode] = true;
|
||||
GT.tracker.worked.ituz[details.ituz + "|" + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.ituz[details.ituz + "|dg"] = true;
|
||||
GT.tracker.worked.ituz[details.ituz + "|" + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.cqz)
|
||||
{
|
||||
GT.tracker.worked.cqz[details.cqz + "|" + details.band + details.mode] = true;
|
||||
GT.tracker.worked.cqz[details.cqz + "|"] = true;
|
||||
GT.tracker.worked.cqz[details.cqz + "|" + details.mode] = true;
|
||||
GT.tracker.worked.cqz[details.cqz + "|" + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.cqz[details.cqz + "|dg"] = true;
|
||||
GT.tracker.worked.cqz[details.cqz + "|" + details.band + "dg"] = true;
|
||||
}
|
||||
if (isCurrentYear)
|
||||
{
|
||||
GT.tracker.worked.cqz[`${details.cqz}-${currentYear}`] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.dxcc > 0)
|
||||
{
|
||||
var sDXCC = String(details.dxcc);
|
||||
GT.tracker.worked.dxcc[sDXCC + "|" + details.band + details.mode] = true;
|
||||
GT.tracker.worked.dxcc[sDXCC + "|"] = true;
|
||||
GT.tracker.worked.dxcc[sDXCC + "|" + details.mode] = true;
|
||||
GT.tracker.worked.dxcc[sDXCC + "|" + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.dxcc[sDXCC + "|dg"] = true;
|
||||
GT.tracker.worked.dxcc[sDXCC + "|" + details.band + "dg"] = true;
|
||||
}
|
||||
if (isPhone == true)
|
||||
{
|
||||
GT.tracker.worked.dxcc[sDXCC + "|ph"] = true;
|
||||
}
|
||||
if (isCurrentYear)
|
||||
{
|
||||
GT.tracker.worked.dxcc[`${sDXCC}-${currentYear}`] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.px)
|
||||
{
|
||||
GT.tracker.worked.px[details.px + details.band + details.mode] = true;
|
||||
// store the last one
|
||||
GT.tracker.worked.px[details.px] = details.hash;
|
||||
GT.tracker.worked.px[details.px + details.mode] = true;
|
||||
GT.tracker.worked.px[details.px + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.px[details.px + "dg"] = true;
|
||||
GT.tracker.worked.px[details.px + details.band + "dg"] = true;
|
||||
}
|
||||
if (isPhone == true)
|
||||
{
|
||||
GT.tracker.worked.px[details.px + "ph"] = true;
|
||||
GT.tracker.worked.px[details.px + details.band + "ph"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.cont)
|
||||
{
|
||||
GT.tracker.worked.cont[details.cont + details.band + details.mode] = true;
|
||||
// store the last one
|
||||
GT.tracker.worked.cont[details.cont] = details.hash;
|
||||
GT.tracker.worked.cont[details.cont + details.mode] = true;
|
||||
GT.tracker.worked.cont[details.cont + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.cont[details.cont + "dg"] = true;
|
||||
GT.tracker.worked.cont[details.cont + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.state)
|
||||
{
|
||||
GT.tracker.worked.state[details.state] = true;
|
||||
GT.tracker.worked.state[details.state + details.mode] = true;
|
||||
GT.tracker.worked.state[details.state + details.band] = true;
|
||||
GT.tracker.worked.state[details.state + details.band + details.mode] = true;
|
||||
|
||||
if (isDigi)
|
||||
{
|
||||
GT.tracker.worked.state[details.state + "dg"] =
|
||||
GT.tracker.worked.state[details.state + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.cnty)
|
||||
{
|
||||
GT.tracker.worked.cnty[details.cnty] = true;
|
||||
GT.tracker.worked.cnty[details.cnty + details.mode] = true;
|
||||
GT.tracker.worked.cnty[details.cnty + details.band] = true;
|
||||
GT.tracker.worked.cnty[details.cnty + details.band + details.mode] = true;
|
||||
|
||||
if (isDigi)
|
||||
{
|
||||
GT.tracker.worked.cnty[details.cnty + "dg"] = true;
|
||||
GT.tracker.worked.cnty[details.cnty + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.pota)
|
||||
{
|
||||
GT.tracker.worked.pota[dayAsString + details.DEcall + details.pota] = true;
|
||||
GT.tracker.worked.pota[dayAsString + details.DEcall + details.pota + details.mode] = true;
|
||||
GT.tracker.worked.pota[dayAsString + details.DEcall + details.pota + details.band] = true;
|
||||
GT.tracker.worked.pota[dayAsString + details.DEcall + details.pota + details.band + details.mode] = true;
|
||||
|
||||
GT.tracker.worked.pota[dayAsString + details.pota + details.band + details.mode] = true;
|
||||
|
||||
GT.tracker.worked.pota[details.pota] = true;
|
||||
GT.tracker.worked.pota[details.pota + details.mode] = true;
|
||||
GT.tracker.worked.pota[details.pota + details.band] = true;
|
||||
GT.tracker.worked.pota[details.pota + details.band + details.mode] = true;
|
||||
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.worked.pota[dayAsString + details.DEcall + details.pota + "dg"] = true;
|
||||
GT.tracker.worked.pota[dayAsString + details.DEcall + details.pota + details.band + "dg"] = true;
|
||||
|
||||
GT.tracker.worked.pota[details.pota + "dg"] = true;
|
||||
GT.tracker.worked.pota[details.pota + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.confirmed == true)
|
||||
{
|
||||
GT.tracker.confirmed.call[details.DEcall + details.band + details.mode] = true;
|
||||
GT.tracker.confirmed.call[details.DEcall] = true;
|
||||
GT.tracker.confirmed.call[details.DEcall + details.mode] = true;
|
||||
GT.tracker.confirmed.call[details.DEcall + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.call[details.DEcall + "dg"] = true;
|
||||
GT.tracker.confirmed.call[details.DEcall + details.band + "dg"] = true;
|
||||
}
|
||||
|
||||
if (fourGrid != "")
|
||||
{
|
||||
GT.tracker.confirmed.grid[fourGrid + details.band + details.mode] = true;
|
||||
GT.tracker.confirmed.grid[fourGrid] = true;
|
||||
GT.tracker.confirmed.grid[fourGrid + details.mode] = true;
|
||||
GT.tracker.confirmed.grid[fourGrid + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.grid[fourGrid + "dg"] = true;
|
||||
GT.tracker.confirmed.grid[fourGrid + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
if (details.ituz && details.ituz.length > 0)
|
||||
{
|
||||
GT.tracker.confirmed.ituz[details.ituz + "|" + details.band + details.mode] = true;
|
||||
GT.tracker.confirmed.ituz[details.ituz + "|"] = true;
|
||||
GT.tracker.confirmed.ituz[details.ituz + "|" + details.mode] = true;
|
||||
GT.tracker.confirmed.ituz[details.ituz + "|" + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.ituz[details.ituz + "|dg"] = true;
|
||||
GT.tracker.confirmed.ituz[details.ituz + "|" + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
if (details.cqz && details.cqz.length > 0)
|
||||
{
|
||||
GT.tracker.confirmed.cqz[details.cqz + "|" + details.band + details.mode] = true;
|
||||
GT.tracker.confirmed.cqz[details.cqz + "|"] = true;
|
||||
GT.tracker.confirmed.cqz[details.cqz + "|" + details.mode] = true;
|
||||
GT.tracker.confirmed.cqz[details.cqz + "|" + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.cqz[details.cqz + "|dg"] = true;
|
||||
GT.tracker.confirmed.cqz[details.cqz + "|" + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.dxcc > 0)
|
||||
{
|
||||
var sDXCC = String(details.dxcc);
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|" + details.band + details.mode] = true;
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|"] = true;
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|" + details.mode] = true;
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|" + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|dg"] = true;
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|" + details.band + "dg"] = true;
|
||||
}
|
||||
if (isPhone == true)
|
||||
{
|
||||
GT.tracker.confirmed.dxcc[sDXCC + "|ph"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.state)
|
||||
{
|
||||
GT.tracker.confirmed.state[details.state] = true;
|
||||
GT.tracker.confirmed.state[details.state + details.mode] = true;
|
||||
GT.tracker.confirmed.state[details.state + details.band] = true;
|
||||
GT.tracker.confirmed.state[details.state + details.band + details.mode] = true;
|
||||
|
||||
if (isDigi)
|
||||
{
|
||||
GT.tracker.confirmed.state[details.state + "dg"] = true;
|
||||
GT.tracker.confirmed.state[details.state + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.cnty)
|
||||
{
|
||||
GT.tracker.confirmed.cnty[details.cnty] = true;
|
||||
GT.tracker.confirmed.cnty[details.cnty + details.mode] = true;
|
||||
GT.tracker.confirmed.cnty[details.cnty + details.band] = true;
|
||||
GT.tracker.confirmed.cnty[details.cnty + details.band + details.mode] = true;
|
||||
|
||||
if (isDigi)
|
||||
{
|
||||
GT.tracker.confirmed.cnty[details.cnty + "dg"] = true;
|
||||
GT.tracker.confirmed.cnty[details.cnty + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.px)
|
||||
{
|
||||
GT.tracker.confirmed.px[details.px + details.band + details.mode] = true;
|
||||
// store the last one
|
||||
GT.tracker.confirmed.px[details.px] = details.hash;
|
||||
GT.tracker.confirmed.px[details.px + details.mode] = true;
|
||||
GT.tracker.confirmed.px[details.px + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.px[details.px + "dg"] = true;
|
||||
GT.tracker.confirmed.px[details.px + details.band + "dg"] = true;
|
||||
}
|
||||
if (isPhone == true)
|
||||
{
|
||||
GT.tracker.confirmed.px[details.px + "ph"] = true;
|
||||
GT.tracker.confirmed.px[details.px + details.band + "ph"] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (details.cont)
|
||||
{
|
||||
GT.tracker.confirmed.cont[details.cont + details.band + details.mode] = true;
|
||||
// store the last one
|
||||
GT.tracker.confirmed.cont[details.cont] = details.hash;
|
||||
GT.tracker.confirmed.cont[details.cont + details.mode] = true;
|
||||
GT.tracker.confirmed.cont[details.cont + details.band] = true;
|
||||
if (isDigi == true)
|
||||
{
|
||||
GT.tracker.confirmed.cont[details.cont + "dg"] = true;
|
||||
GT.tracker.confirmed.cont[details.cont + details.band + "dg"] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* eslint-disable */
|
||||
|
||||
function bitwise(str){
|
||||
var hash = 0;
|
||||
if (str.length == 0) return hash;
|
||||
for (var i = 0; i < str.length; i++) {
|
||||
var ch = str.charCodeAt(i);
|
||||
hash = ((hash<<5)-hash) + ch;
|
||||
hash = hash & hash; // Convert to 32bit integer
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
// convert 10 binary to customized binary, max is 62
|
||||
function binaryTransfer(integer, binary) {
|
||||
binary = binary || 62;
|
||||
var stack = [];
|
||||
var num;
|
||||
var result = '';
|
||||
var sign = integer < 0 ? '-' : '';
|
||||
|
||||
function table (num) {
|
||||
var t = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
return t[num];
|
||||
}
|
||||
|
||||
integer = Math.abs(integer);
|
||||
|
||||
while (integer >= binary) {
|
||||
num = integer % binary;
|
||||
integer = Math.floor(integer / binary);
|
||||
stack.push(table(num));
|
||||
}
|
||||
|
||||
if (integer > 0) {
|
||||
stack.push(table(integer));
|
||||
}
|
||||
|
||||
for (var i = stack.length - 1; i >= 0; i--) {
|
||||
result += stack[i];
|
||||
}
|
||||
|
||||
return sign + result;
|
||||
}
|
||||
/**
|
||||
* why choose 61 binary, because we need the last element char to replace the minus sign
|
||||
* eg: -aGtzd will be ZaGtzd
|
||||
*/
|
||||
function unique (text) {
|
||||
var id = binaryTransfer(bitwise(text), 61);
|
||||
return id.replace('-', 'Z');
|
||||
}
|
|
@ -171,8 +171,8 @@ function gtClosedSocket()
|
|||
GT.gtState = ChatState.none;
|
||||
}
|
||||
|
||||
// Connect 15 seconds after startup
|
||||
GT.lastConnectAttempt = parseInt(Date.now() / 1000) - 15;
|
||||
// Connect 30 seconds after startup
|
||||
GT.lastConnectAttempt = parseInt(Date.now() / 1000) - 30;
|
||||
|
||||
function gtCanConnect()
|
||||
{
|
||||
|
|
|
@ -27,8 +27,7 @@ function changeLocale()
|
|||
{
|
||||
GT.appSettings.locale = languageLocale.value;
|
||||
renderI18n(GT.appSettings.locale);
|
||||
saveAppSettings();
|
||||
chrome.runtime.reload();
|
||||
saveAndCloseApp(true);
|
||||
}
|
||||
|
||||
function loadChildWindowI18n()
|
||||
|
|
|
@ -15,8 +15,6 @@ CR.blockedGrid = {};
|
|||
CR.blockedCQz = {};
|
||||
CR.blockedITUz = {};
|
||||
CR.scriptReport = {};
|
||||
CR.worked = {};
|
||||
CR.confirmed = {};
|
||||
CR.modes = {};
|
||||
CR.modes_phone = {};
|
||||
CR.currentUSCallsigns = null;
|
||||
|
@ -338,20 +336,17 @@ function writeRosterSettings()
|
|||
|
||||
function isKnownCallsignDXCC(dxcc)
|
||||
{
|
||||
if (dxcc in CR.callsignDatabaseDXCC) return true;
|
||||
return false;
|
||||
return (dxcc in CR.callsignDatabaseDXCC);
|
||||
}
|
||||
|
||||
function isKnownCallsignUS(dxcc)
|
||||
{
|
||||
if (dxcc in CR.callsignDatabaseUS) return true;
|
||||
return false;
|
||||
return (dxcc in CR.callsignDatabaseUS);
|
||||
}
|
||||
|
||||
function isKnownCallsignUSplus(dxcc)
|
||||
{
|
||||
if (dxcc in CR.callsignDatabaseUSplus) return true;
|
||||
return false;
|
||||
return (dxcc in CR.callsignDatabaseUSplus);
|
||||
}
|
||||
|
||||
function timeNowSec()
|
||||
|
@ -1431,8 +1426,6 @@ CR.tracker = {};
|
|||
|
||||
function updateWorked()
|
||||
{
|
||||
CR.worked = window.opener.GT.tracker.worked;
|
||||
CR.confirmed = window.opener.GT.tracker.confirmed;
|
||||
CR.modes = window.opener.GT.modes;
|
||||
CR.modes_phone = window.opener.GT.modes_phone;
|
||||
CR.tracker = window.opener.GT.tracker;
|
||||
|
|
|
@ -31,20 +31,20 @@ function prepareRosterSettings()
|
|||
|
||||
if (CR.rosterSettings.huntNeed == "mixed")
|
||||
{
|
||||
rosterSettings.huntIndex = CR.confirmed;
|
||||
rosterSettings.workedIndex = CR.worked;
|
||||
rosterSettings.huntIndex = CR.tracker.confirmed;
|
||||
rosterSettings.workedIndex = CR.tracker.worked;
|
||||
rosterSettings.layeredMode = LAYERED_MODE_FOR[String(CR.rosterSettings.reference)];
|
||||
}
|
||||
else if (CR.rosterSettings.huntNeed == "worked")
|
||||
{
|
||||
rosterSettings.huntIndex = CR.worked;
|
||||
rosterSettings.huntIndex = CR.tracker.worked;
|
||||
rosterSettings.workedIndex = false;
|
||||
rosterSettings.layeredMode = false;
|
||||
}
|
||||
else if (CR.rosterSettings.huntNeed == "confirmed")
|
||||
{
|
||||
rosterSettings.huntIndex = CR.confirmed;
|
||||
rosterSettings.workedIndex = CR.worked;
|
||||
rosterSettings.huntIndex = CR.tracker.confirmed;
|
||||
rosterSettings.workedIndex = CR.tracker.worked;
|
||||
rosterSettings.layeredMode = false;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -213,12 +213,12 @@ function processRosterFiltering(callRoster, rosterSettings)
|
|||
}
|
||||
|
||||
let hash = hashMaker(call, callObj, CR.rosterSettings.reference);
|
||||
if (rosterSettings.callMode == "worked" && hash in CR.worked.call)
|
||||
if (rosterSettings.callMode == "worked" && hash in CR.tracker.worked.call)
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
}
|
||||
if (rosterSettings.callMode == "confirmed" && hash in CR.confirmed.call)
|
||||
if (rosterSettings.callMode == "confirmed" && hash in CR.tracker.confirmed.call)
|
||||
{
|
||||
entry.tx = false;
|
||||
continue;
|
||||
|
|
|
@ -124,13 +124,13 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
let hash = callsign + workHashSuffix;
|
||||
|
||||
// Call worked in current logbook settings, regardless of hunting mode
|
||||
if (hash in CR.worked.call)
|
||||
if (hash in CR.tracker.worked.call)
|
||||
{
|
||||
callObj.callFlags.worked = true;
|
||||
didWork = true;
|
||||
callConf = `${unconf}${call}${inversionAlpha};`;
|
||||
|
||||
if (hash in CR.confirmed.call)
|
||||
if (hash in CR.tracker.confirmed.call)
|
||||
{
|
||||
callObj.callFlags.confirmed = true;
|
||||
callPointer = "text-decoration: line-through; ";
|
||||
|
@ -502,12 +502,12 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
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))
|
||||
if (!(hash in CR.tracker.worked.pota))
|
||||
{
|
||||
shouldAlert = true;
|
||||
callObj.reason.push("pota");
|
||||
callObj.hunting.pota = "hunted";
|
||||
if (parkHash in CR.worked.pota)
|
||||
if (parkHash in CR.tracker.worked.pota)
|
||||
{
|
||||
potaConf = `${unconf}${pota}${inversionAlpha};`;
|
||||
}
|
||||
|
@ -517,7 +517,7 @@ function processRosterHunting(callRoster, rosterSettings, awardTracker)
|
|||
pota = bold;
|
||||
}
|
||||
}
|
||||
else if (parkHash in CR.worked.pota)
|
||||
else if (parkHash in CR.tracker.worked.pota)
|
||||
{
|
||||
potaConf = `${unconf}${pota}${inversionAlpha};`;
|
||||
}
|
||||
|
|
|
@ -20,8 +20,6 @@ function sendAlerts(callRoster, rosterSettings)
|
|||
CR.scriptReport[call].distance = (callObj.distance > 0) ? parseInt(callObj.distance * MyCircle.validateRadius(window.opener.distanceUnit.value)) : 0;
|
||||
|
||||
delete CR.scriptReport[call].DEcall;
|
||||
CR.scriptReport[call].rect = null;
|
||||
delete CR.scriptReport[call].rect;
|
||||
delete CR.scriptReport[call].style;
|
||||
delete CR.scriptReport[call].wspr;
|
||||
delete CR.scriptReport[call].qso;
|
||||
|
|
|
@ -195,6 +195,10 @@ function Resize()
|
|||
|
||||
function reloadInfo(bandOrMode)
|
||||
{
|
||||
if (workedBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showWorkedBox();
|
||||
}
|
||||
if (statBoxDiv.style.display == "block")
|
||||
{
|
||||
window.opener.showStatBox(false);
|
||||
|
|
|
@ -157,6 +157,38 @@ html, body {
|
|||
font-size: larger;
|
||||
}
|
||||
|
||||
.absoluteCenterDiv {
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background-color: #000000;
|
||||
-webkit-border-radius: 6px;
|
||||
vertical-align: top;
|
||||
font-size: larger;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.busyDiv {
|
||||
border: 1px solid rgb(153, 153, 153);
|
||||
-webkit-border-radius: 4px;
|
||||
background: linear-gradient(90deg, #ff6600, blue);
|
||||
background-size: 200% 200%;
|
||||
animation: AnimationQsoQsl 1s ease infinite;
|
||||
text-shadow: black 0 0 6px;
|
||||
}
|
||||
|
||||
@keyframes AnimationQsoQsl {
|
||||
0% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
50% {
|
||||
background-position: 100% 50%;
|
||||
}
|
||||
100% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
}
|
||||
.myFlagtipEnd {
|
||||
vertical-align: top;
|
||||
-webkit-border-radius: 6px;
|
||||
|
@ -271,25 +303,6 @@ html, body {
|
|||
outline: none;
|
||||
}
|
||||
|
||||
.QsoQslActive {
|
||||
background: linear-gradient(90deg, yellow, blue);
|
||||
background-size: 200% 200%;
|
||||
animation: AnimationQsoQsl 1s ease infinite;
|
||||
text-shadow: black 0 0 6px;
|
||||
}
|
||||
|
||||
@keyframes AnimationQsoQsl {
|
||||
0% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
50% {
|
||||
background-position: 100% 50%;
|
||||
}
|
||||
100% {
|
||||
background-position: 0% 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.roundBorderDEInfo {
|
||||
border: 1px solid white;
|
||||
-webkit-border-radius: 6px;
|
||||
|
|
|
@ -84,60 +84,6 @@ function latLonToGridSquare(param1,param2, width = 4){
|
|||
}
|
||||
}
|
||||
|
||||
function bitwise(str){
|
||||
var hash = 0;
|
||||
if (str.length == 0) return hash;
|
||||
for (var i = 0; i < str.length; i++) {
|
||||
var ch = str.charCodeAt(i);
|
||||
hash = ((hash<<5)-hash) + ch;
|
||||
hash = hash & hash; // Convert to 32bit integer
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
// convert 10 binary to customized binary, max is 62
|
||||
function binaryTransfer(integer, binary) {
|
||||
binary = binary || 62;
|
||||
var stack = [];
|
||||
var num;
|
||||
var result = '';
|
||||
var sign = integer < 0 ? '-' : '';
|
||||
|
||||
function table (num) {
|
||||
var t = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
return t[num];
|
||||
}
|
||||
|
||||
integer = Math.abs(integer);
|
||||
|
||||
while (integer >= binary) {
|
||||
num = integer % binary;
|
||||
integer = Math.floor(integer / binary);
|
||||
stack.push(table(num));
|
||||
}
|
||||
|
||||
if (integer > 0) {
|
||||
stack.push(table(integer));
|
||||
}
|
||||
|
||||
for (var i = stack.length - 1; i >= 0; i--) {
|
||||
result += stack[i];
|
||||
}
|
||||
|
||||
return sign + result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* why choose 61 binary, because we need the last element char to replace the minus sign
|
||||
* eg: -aGtzd will be ZaGtzd
|
||||
*/
|
||||
function unique (text) {
|
||||
var id = binaryTransfer(bitwise(text), 61);
|
||||
return id.replace('-', 'Z');
|
||||
}
|
||||
|
||||
|
||||
var MyCircle = {
|
||||
|
||||
validateRadius: function(unit) {
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
var GT = {};
|
||||
|
||||
importScripts("protos.js");
|
||||
importScripts("gtCommon.js");
|
||||
|
||||
GT.workerFunctions =
|
||||
{
|
||||
process: processQSOs
|
||||
};
|
||||
|
||||
onmessage = (event) =>
|
||||
{
|
||||
if ("type" in event.data)
|
||||
{
|
||||
if (event.data.type in GT.workerFunctions)
|
||||
{
|
||||
GT.workerFunctions[event.data.type](event.data);
|
||||
}
|
||||
else console.log("trackerWorker: unknown event type : " + event.data.type);
|
||||
}
|
||||
else console.log("trackerWorker: no event type");
|
||||
};
|
||||
|
||||
function processQSOs(task)
|
||||
{
|
||||
initQSOdata();
|
||||
var currentYear = new Date().getFullYear();
|
||||
for (let hash in task.QSOhash)
|
||||
{
|
||||
trackQSO(task.QSOhash[hash], currentYear);
|
||||
}
|
||||
var task = {};
|
||||
task.type = "processed";
|
||||
task.tracker = GT.tracker;
|
||||
postMessage(task);
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "GridTracker",
|
||||
"product_string_do_not_use": "gridtracker",
|
||||
"version": "1.24.0104",
|
||||
"version": "1.24.0131",
|
||||
"betaVersion": "",
|
||||
"description": "GridTracker: An Amateur Radio Companion",
|
||||
"author": "GridTracker.org",
|
||||
|
|
Ładowanie…
Reference in New Issue