Compare commits

...

317 Commits

Author SHA1 Message Date
Uwe Risse
994e3f1c3d Update also NEWS file. 2022-07-19 17:28:57 +02:00
Joe Taylor
3c98c9df41 Final update to Release Notes, for coming 2.6.0-rc2 candidate release. 2022-07-19 11:04:01 -04:00
Joe Taylor
2e4a6c3c32 If DX grid is blank, set DX astro params to zero. Do this in astrosub.f90, not asstro.cpp! 2022-07-17 16:12:59 -04:00
Joe Taylor
c296bca73a Minor code cleanup. 2022-07-16 09:50:09 -04:00
Joe Taylor
215208636c Merge branch 'contest-log-window' 2022-07-16 09:46:15 -04:00
Joe Taylor
c60aa83aa5 ActiveStations lineEdits for Rate, Score, and Band changes should be ReadOnly. 2022-07-16 09:43:55 -04:00
Brian Moran
8bd3dd65bb use correct method for getting row count from the DB; use signals/slots to inform the CabrilloLogWindow the qso_count has changed 2022-07-15 20:42:57 -07:00
Brian Moran
aa16455320 Merge branch 'develop' of bitbucket.org:k1jt/wsjtx into contest-log-window 2022-07-15 17:15:59 -07:00
Uwe Risse
8e4f293127 Fix a typo, set release date to July 21, and copy text from release notes to NEWS file. 2022-07-15 21:05:38 +02:00
Brian Moran
af3e06144c refresh QSO # when the underlying data changes 2022-07-15 11:24:57 -07:00
Joe Taylor
a4792074e4 Edits to User Guide and Release Notes. 2022-07-15 14:21:06 -04:00
Joe Taylor
47a89bc2c9 A few more edits to Release Notes. 2022-07-15 13:56:04 -04:00
Joe Taylor
fadda93f2f Merge branch 'develop' 2022-07-15 13:01:34 -04:00
Joe Taylor
320ddc0338 Merge branch 'develop' of bitbucket.org:k1jt/wsjtx into develop 2022-07-15 12:42:00 -04:00
Uwe Risse
5759f06d6d One more item for the rc2 release notes and NEWS. 2022-07-15 18:25:46 +02:00
Uwe Risse
a5f963233b Update release notes and NEWS for v2.6.0-rc2. 2022-07-15 18:18:49 +02:00
Joe Taylor
e5bf51abf6 Update number of logged contest QSOs only if Contet Log has been made visible. 2022-07-15 10:49:26 -04:00
Joe Taylor
e1fde92ea2 Try adding a lineEdit to display number of QSOs in the contest log. Not quite right, yet. 2022-07-14 12:42:55 -04:00
Brian Moran
fffc88de69 merge 2022-07-13 21:47:20 -07:00
Brian Moran
f20687f9fb Merge branch 'develop' of bitbucket.org:k1jt/wsjtx into contest-log-window 2022-07-13 21:36:22 -07:00
Brian Moran
a1106aff46 no qso #. When date sorted, move to top or bottom 2022-07-13 21:36:07 -07:00
Joe Taylor
cd0a0e6db4 Fix a typo. 2022-07-13 14:57:24 -04:00
Brian Moran
c85ed8cc7d show contacts by ID, scroll to insertion when sorted by tha column up or down 2022-07-11 15:56:55 -07:00
Uwe Risse
68a534221b Fix a typo. 2022-07-11 19:04:05 +02:00
Uwe Risse
d81a3d799c Set the 4m FT8 default frequency for Region 1 to 70,154 MHz. 2022-07-09 12:48:26 +02:00
Uwe Risse
31696388b9 Revert "Set the 4m FT8 default frequency for Region 1 to 70,154 MHz."
This reverts commit 43cd871413.
2022-07-09 12:45:46 +02:00
Uwe Risse
9d90ede3de Revert "Fix a problem with backward compatibility, part 1."
This reverts commit 4822b94350.
2022-07-09 12:43:49 +02:00
Uwe Risse
dd384d0765 Revert "Fix a problem with backward compatibility, part 2."
This reverts commit 4545195a32.
2022-07-09 12:43:39 +02:00
Uwe Risse
4545195a32 Fix a problem with backward compatibility, part 2. 2022-07-09 12:39:12 +02:00
Uwe Risse
4822b94350 Fix a problem with backward compatibility, part 1. 2022-07-09 12:38:26 +02:00
Uwe Risse
566d01aa23 Some possible text modules for the rc2 release notes. 2022-07-08 14:37:43 +02:00
Uwe Risse
da282209f1 Remember Tx and Rx audio frequencies when coming back from any mode which sets AF to 1500 Hz (MSK144, FST4W, Echo, WSPR, FreqCal). 2022-07-08 11:56:02 +02:00
Uwe Risse
f84ba8a0d0 Make submode switching more robust, and fix a long-standing bug where the Tx audio frequency spin box remained red when coming from some Q65 submodes. 2022-07-07 18:11:29 +02:00
Joe Taylor
1f575bbe67 Merge branch 'develop' of bitbucket.org:k1jt/wsjtx into develop 2022-07-05 14:01:54 -04:00
Joe Taylor
8b767b4c75 Satisfy the fussy compiler on macOS. 2022-07-05 14:01:22 -04:00
Uwe Risse
599cf1b7d6 Remember settings for T/R period and Submode by mode. 2022-07-05 10:55:00 +02:00
Uwe Risse
c97c53db89 Fix VFOB not getting set on some rigs (e.g. IC7610 & IC7100). 2022-07-04 19:53:03 +02:00
Joe Taylor
9adb1c8256 Minor edits to display of Keyboard Shortcuts. 2022-07-01 12:04:22 -04:00
Joe Taylor
bc635f0cd7 Make OK button the default on the LogQSO dialog window. 2022-07-01 11:56:22 -04:00
Joe Taylor
3caaf785bd Change version number to 2.6.0-rc2. 2022-06-23 09:51:30 -04:00
Joe Taylor
951d17b20c Correct the if statement controlling display of DX station fields. 2022-06-23 09:20:52 -04:00
Joe Taylor
0ef914fb5c Let Echo-mode "Measure" function use the computed fspread for DX grid. 2022-06-22 14:34:50 -04:00
Joe Taylor
345e539074 Use "(Call_1 or CQ)" in Table 2, Section 12.1 of User Guide. 2022-06-21 14:27:06 -04:00
Uwe Risse
219c04f5a4 Optimize mode button layout for 4K screens. 2022-06-19 16:37:56 +02:00
Uwe Risse
e575005291 Fix a compatibility issue. 2022-06-19 11:04:49 +02:00
Uwe Risse
6744bc5468 Change release date to June 20, 2022. 2022-06-13 20:58:38 +02:00
Joe Taylor
121091c14e Merge branch 'develop' of bitbucket.org:k1jt/wsjtx into develop 2022-06-03 11:53:35 -04:00
Joe Taylor
3beeb06dec Always send 73 after receiving RR73, even in contest mode. 2022-06-03 11:52:25 -04:00
Uwe Risse
6ca7523adf Fix a typo. 2022-06-03 13:27:19 +02:00
Uwe Risse
f77eb1ddf8 Align the second tooltip with the first one for "FT Roundup...". 2022-06-03 11:57:31 +02:00
Joe Taylor
bdf33b6ab3 Include a missing image file. 2022-06-02 15:33:29 -04:00
Joe Taylor
b968fe2b76 Merge branch 'develop' of bitbucket.org:k1jt/wsjtx into develop 2022-06-02 14:19:35 -04:00
Joe Taylor
14bf6d5ec1 More updates to the User Guide. 2022-06-02 14:18:52 -04:00
Uwe Risse
43cd871413 Set the 4m FT8 default frequency for Region 1 to 70,154 MHz. 2022-06-02 19:54:28 +02:00
Joe Taylor
014a8e5104 Add a brief statement about MAP65 to the WSJT-X User Guide. 2022-06-02 13:47:25 -04:00
Joe Taylor
0aeee4cdf8 User Guide additions. 2022-06-02 13:37:22 -04:00
Joe Taylor
a3d57024d5 Edits and additions to User Guide. 2022-06-02 13:15:20 -04:00
Joe Taylor
9667fd837b Starting on some User Guide additions and edits. This is work in progress! 2022-06-02 07:46:23 -04:00
Joe Taylor
ba03e471bc Correct some wording in Release Notes. 2022-06-01 16:40:17 -04:00
Joe Taylor
372b43df26 New screen shot for Settings | Advanced. 2022-06-01 15:41:13 -04:00
Joe Taylor
0fa2cf2166 Change references from "ARRL RTTY Roundup" to "FT Roundup". 2022-06-01 15:32:24 -04:00
Joe Taylor
95282f062e Change visible references from "RTTY Roundup" to "FT Roundup". Clean up the Settings | Advanced page. 2022-06-01 14:48:44 -04:00
Joe Taylor
c5fe615a7b Further edits to NEWS and Release_Notes.txt. 2022-06-01 13:57:28 -04:00
Joe Taylor
d6299e8a78 Add label and ToolTip to the control for scaling digital I/Q data. 2022-06-01 10:57:14 -04:00
Uwe Risse
d4beab04bf Correct a typo. 2022-06-01 10:54:53 +02:00
Uwe Risse
fa111e6e87 Remove checkboxes for "Clear DX Call / DX Grid after QSO" and update Release_Notes and NEWS. 2022-06-01 10:14:18 +02:00
Joe Taylor
f1497fbabb Further preparations for making a release candidate WSJT-X 2.6.0-rc1. 2022-05-31 11:12:45 -04:00
Joe Taylor
4664aec597 Merge branch 'develop' of bitbucket.org:k1jt/wsjtx into develop 2022-05-31 09:42:52 -04:00
Joe Taylor
53bb5268ca Edits to the user Guide: explicit link to the wsjt-devel subscribe page. 2022-05-31 09:40:59 -04:00
Uwe Risse
8164e27909 Some more text for Release_Notes and NEWS. 2022-05-31 15:35:55 +02:00
Uwe Risse
ce13ca8800 Preparations for the release of WSJT-X v2.6.0-rc1. 2022-05-30 13:55:01 +02:00
Uwe Risse
148066135e Update Release_Notes and NEWS to v2.6.0-rc1. 2022-05-30 13:29:40 +02:00
Uwe Risse
cac0ea44ea Optimize method and use it also for displaying bands in BlankLine. 2022-05-08 10:13:29 +02:00
Uwe Risse
c7e7062b8a Ensure that m_freqNominalPeriod and m_currentBandPeriod are also initialized when rig is none or when there was no band change. 2022-05-07 18:35:43 +02:00
Uwe Risse
a6e6b91cee Prevent using the wrong decode highlighting scheme after a band change. 2022-05-07 15:50:51 +02:00
Uwe Risse
f5291f280e Prevent writing of wrong frequencies to all.txt for late decodes and spotting wrong bands to PSK Reporter. 2022-05-07 14:40:14 +02:00
Joe Taylor
bbb280b4f3 Set font used in Active Stations window equal to that in the decoded text windows. 2022-05-05 13:35:27 -04:00
Uwe Risse
b9b3d1d6f5 A slightly better solution to fix the 55 Hz problem with OmniRig v1.19 and later. 2022-05-03 15:46:17 +02:00
Uwe Risse
eef441ec87 Add some documentation. 2022-05-03 13:45:02 +02:00
Uwe Risse
855daf92c4 Fix 55 Hz problem with Omnirig v1.19 and later (until we have a better solution). 2022-05-02 22:06:45 +02:00
Uwe Risse
a469b67afb Repeated highlighting of DX Call to override JTAlert coloring. 2022-05-02 15:54:42 +02:00
Joe Taylor
b100a11835 Activate the ClrAvg button for Echo mode. 2022-04-25 15:54:13 -04:00
Steven Franke
c073fefa74 Merge branch 'arrl-digi-dx' into develop 2022-04-25 07:24:03 -05:00
Steven Franke
062f3a8037 Merge branch 'feat-a7-UR' into develop 2022-04-25 07:23:06 -05:00
Uwe Risse
f5ec31d3a1 Align tooltip formatting. 2022-04-23 12:18:21 +02:00
Uwe Risse
df502242f2 Treat CQ xxxx and CQ xxx like CQ and CQ xx. 2022-04-23 12:02:50 +02:00
Joe Taylor
7cdd2da5d5 Fix CMakeLists.txt so that CPack works. 2022-04-22 17:31:32 -04:00
Joe Taylor
7d8d0b8b94 Integrate the new Echo SNR algorithm into WSJT-X. 2022-04-22 15:34:12 -04:00
Joe Taylor
581ef8b6e5 Final (?) version of test_snr, with echo_snr() moved into wsjt Fortran library. 2022-04-22 13:07:23 -04:00
Joe Taylor
87dcde7564 Move calculation of echo snr into a separate subroutine. 2022-04-22 11:43:28 -04:00
Joe Taylor
03b680dee5 Fix CMakeLists.txt to build program test_snr. 2022-04-22 11:04:56 -04:00
Joe Taylor
3b361b6d24 Tweak subroutine averms(). Add test program test_snr to exercise new algorithm for echo snr. 2022-04-22 11:02:47 -04:00
Joe Taylor
d0dd88de40 Add /echocom2/echo_spread to astro0.f90. 2022-04-22 11:00:42 -04:00
Steven Franke
64a124ff20 Make wspr mode work properly with 3 character callsigns like N1D. 2022-04-22 07:56:02 -05:00
Steven Franke
7021477e21 Merge branch 'arrl-digi-dx' of bitbucket.org:k1jt/wsjtx into arrl-digi-dx 2022-04-22 07:50:15 -05:00
Steven Franke
4331594e4a Make wspr mode work properly with 3 character callsigns like N1D. 2022-04-22 07:50:03 -05:00
Joe Taylor
d1c7efb1aa Protect against bounds error when MAP65 users select too wide a display bandwidth. 2022-04-13 09:56:55 -04:00
Joe Taylor
1da80c0631 Don't include "73" in the test for bProcessMsgNormally. 2022-04-12 13:43:42 -04:00
Joe Taylor
d45d0b6b8f Correct the tests for receiving "R ", etc., in autosequencing logic. 2022-04-12 12:56:04 -04:00
Joe Taylor
ab72238132 Fix the updateRate() logic, and the logic for "ProcessMsgNormally". (Is it right, yet??) 2022-04-11 13:08:16 -04:00
Joe Taylor
cf27347656 Clean up the display of contest names on the 'labDXped' label. 2022-04-11 11:55:05 -04:00
Joe Taylor
400957af0c Revert "Fix some logical issues with auto-sequening with ActiveStations window. Enable ARRL_DIGI label display."
This reverts commit 36d11fc561.
2022-04-11 11:04:46 -04:00
Joe Taylor
708342f40a Revert "Correct the way "Rate" is being updated."
This reverts commit 9b8b604a8c.
2022-04-11 11:03:43 -04:00
Joe Taylor
afa020558f Revert "Fix the position of call to UpdateRate()."
This reverts commit fc4a70cf9c.
2022-04-11 11:03:16 -04:00
Joe Taylor
fc4a70cf9c Fix the position of call to UpdateRate(). 2022-04-11 09:44:14 -04:00
Joe Taylor
9b8b604a8c Correct the way "Rate" is being updated. 2022-04-09 15:04:56 -04:00
Joe Taylor
36d11fc561 Fix some logical issues with auto-sequening with ActiveStations window. Enable ARRL_DIGI label display. 2022-04-09 14:37:24 -04:00
Joe Taylor
70959a9796 Add a spinner control for scaling of I/Q input level. 2022-04-08 11:21:04 -04:00
Joe Taylor
1930271350 Remove a diagnostic qDebug() statement. 2022-04-06 16:05:40 -04:00
Joe Taylor
6e344fdec8 Ermanno, IK7EZN, addition to information sent to azel.dat. 2022-04-06 14:54:23 -04:00
Joe Taylor
a78f5d06c4 Correct the calculation of Age after 0h UTC wrap-around. 2022-04-06 12:21:22 -04:00
Uwe Risse
cb03c837d0 Revert "Prevent the display of lines with negative age values."
This reverts commit 2d906247d7.
2022-04-06 10:08:30 +02:00
Uwe Risse
36e54bf3a0 Revert "Add an option to disable the Tune watchdog."
This reverts commit 0b951a05e7.
2022-04-06 10:06:43 +02:00
Uwe Risse
2d906247d7 Prevent the display of lines with negative age values. 2022-04-05 18:08:27 +02:00
Uwe Risse
cf9233b650 Automatically set the width of the mode buttons depending on the font size. 2022-04-05 11:14:34 +02:00
Uwe Risse
55bc403f83 Add an option to disable the Tune watchdog (part 2). 2022-04-04 17:29:47 +02:00
Uwe Risse
dd81db1e95 Add an option to disable the Tune watchdog. 2022-04-04 17:24:35 +02:00
Uwe Risse
ec1e521ba7 Set minimum width to 0 on MacOS, and limit maximum width to 40 also on Linux. 2022-04-04 17:07:50 +02:00
Uwe Risse
8a6a8e8bdf Limit width of the mode buttons to 40 only for Windows. 2022-04-04 16:18:10 +02:00
Uwe Risse
1068988bf1 Allow a width of 32 to 40 for the mode buttons. 2022-04-04 14:01:33 +02:00
Uwe Risse
74ae5f98de Prevent H button from beeing highlighted when not in Hound mode. 2022-04-04 10:44:06 +02:00
Joe Taylor
30047ecfeb Another try at getting proper value for m_latestDecodeTime. 2022-04-02 13:41:59 -04:00
Joe Taylor
dbeec73e86 Revert "Use current time rather than latest decode time for computing "age". Needs more testing!"
This reverts commit 3a8991ab80.
2022-04-02 13:25:25 -04:00
Joe Taylor
3a8991ab80 Use current time rather than latest decode time for computing "age". Needs more testing! 2022-04-02 11:18:18 -04:00
Joe Taylor
95f75c8e49 Fix the logic for what happens when we receive R+rpt after sending RR73. 2022-04-01 10:01:45 -04:00
Joe Taylor
432a501bf6 Re-enable display of country names if ActiveStations window is closed. 2022-03-30 14:23:44 -04:00
Joe Taylor
e9f1cbf375 Add and adjust some Tool Tips in Active Stations window. 2022-03-29 10:55:03 -04:00
Joe Taylor
a9e29327b7 Set a warning color when BandChanges is 8 or higher. 2022-03-28 17:45:03 -04:00
Joe Taylor
675a768de1 Set RxFreq spoinner to freq of selected reply to my CQ. 2022-03-28 17:30:00 -04:00
Joe Taylor
4fb06dda43 Don't put a report into the DxGrid box. Reply to report with R+report. 2022-03-28 17:25:17 -04:00
Joe Taylor
218479f093 Add commas or dots, where appropriate, for display of score. 2022-03-28 11:07:37 -04:00
Joe Taylor
f32f2393ea Copy info to "DX Grid" only if it's a valid grid locator. 2022-03-28 10:48:06 -04:00
Joe Taylor
d399b172a4 Repair the logic for selecting best responder to my CQ. 2022-03-28 10:35:36 -04:00
Joe Taylor
b219b59296 Fix the logic for replying to a CQ responder who sends report instead of grid. 2022-03-27 10:21:22 -04:00
Joe Taylor
2d3914eb2d Reset displayed score when Cabrillo log is reset. 2022-03-27 09:35:28 -04:00
Joe Taylor
c909eb0845 Display accumulated contest score on first display of ActiveStations window. 2022-03-27 09:29:16 -04:00
Joe Taylor
91a39dd0a1 Correct the calculation of points. 2022-03-27 09:14:34 -04:00
k9an
6414a8624b Make minimum SNR -24 dB for a7 decodes. 2022-03-26 18:44:59 -05:00
Joe Taylor
b317ea241b Finish implementing updates to score, rate, and band changes. Needs testing! 2022-03-26 17:27:26 -04:00
Joe Taylor
f43c1e97ae Add labels for Band Changes, Rate, and Score to the ActiveStations window. 2022-03-26 16:15:04 -04:00
Joe Taylor
3c3c450839 Fix the logic about display of calls already worked on band. Update ActiveStations when cbReadyOnly is toggled. 2022-03-26 10:42:01 -04:00
Joe Taylor
02961a2ccc Do not display in ActiveStations calls already worked on current band. 2022-03-25 10:11:20 -04:00
Joe Taylor
c5b6a6ae45 Don't display stations already worked on current band. 2022-03-23 16:12:12 -04:00
Joe Taylor
1cee98162a Test the ActiveStations pointer before using it. Add some Tool Tips. 2022-03-23 15:39:32 -04:00
Joe Taylor
4957face2f Display points if in FT4 or FT8 and ActiveStations is visible. 2022-03-22 14:35:42 -04:00
Joe Taylor
190dca5501 Do not display the "........" bands indicators. 2022-03-22 13:27:24 -04:00
Joe Taylor
be2ce2a6c4 Remove stray 'a7' flags from decodes when displaying points. 2022-03-22 13:03:51 -04:00
Joe Taylor
ffe8927a30 Cleanup of "workedB4" interaction with ActiveStations. 2022-03-22 12:41:08 -04:00
Joe Taylor
f3ee013e43 Working toward display of points in left decode window. 2022-03-22 11:22:56 -04:00
Joe Taylor
f47596b2eb Make the "Ready only" box sticky on program restart. 2022-03-21 15:52:25 -04:00
Joe Taylor
d6208b43e2 Several cleanups and fixes for ActiveStations features. 2022-03-21 15:43:58 -04:00
Joe Taylor
ae217cb2d9 Fix the extraction-of-callsign error caused by movinf asterisk. 2022-03-20 14:25:23 -04:00
Joe Taylor
aa9cc8e885 Move asterisk; add "Ready on;y" checkbox; some code cleanup. 2022-03-20 14:16:20 -04:00
Uwe Risse
edd7fadd5a Some changes to the mode buttons. 2022-03-20 18:30:55 +01:00
Joe Taylor
aceac2ccb5 Insert asterisk only if age==0. 2022-03-20 09:11:52 -04:00
Joe Taylor
07ab7de018 Fix the handling of ActiveStation line with pre-pended asterisk. 2022-03-20 08:59:58 -04:00
Joe Taylor
653ea56a77 Display all current calls with grids. Add asterisk for those ready to call. 2022-03-19 19:42:29 -04:00
Joe Taylor
6ca1b14477 Remove a diagnostic print. 2022-03-19 16:54:09 -04:00
Joe Taylor
304a04328a Erase ActiveStations only once per Rx sequence. 2022-03-19 16:53:13 -04:00
Joe Taylor
db33624da1 Erase ActiveStations window when decoding starts. 2022-03-19 16:37:19 -04:00
Joe Taylor
f6c608b227 Don't try to erase if widget was not started! 2022-03-19 16:15:51 -04:00
Joe Taylor
ab48d77d0f Display calls in ActiveStations only when they are "ready to call". Erase on band change. 2022-03-19 16:05:30 -04:00
Joe Taylor
fd7caa8cd6 Fix the setting of TxFirst after click on ActiveStations window. 2022-03-19 14:29:52 -04:00
Joe Taylor
bc92cd54f3 Fix the connect() statement in ActiveStations. 2022-03-19 14:06:46 -04:00
Joe Taylor
f3e838cdc6 Max Pts ==> Max Dist, and allow with non-contest messages. 2022-03-19 09:07:06 -04:00
Joe Taylor
e366b0a6af Don'r display in ActiveStations a call already worked on this band. 2022-03-18 14:52:09 -04:00
Joe Taylor
48312bc620 Moew work on ActiveStations window features. 2022-03-18 14:18:49 -04:00
Joe Taylor
6e193ab0e1 Add bands worked and other stuff to ActiveStations display. 2022-03-18 11:55:44 -04:00
Joe Taylor
2c0d05e05d More work in progress on funcrions in ActiveStations window. 2022-03-18 10:39:08 -04:00
Joe Taylor
5668e74f61 More work on the ActiveStations features. 2022-03-17 16:43:58 -04:00
Joe Taylor
f3bac687ba Clean up the ActiveStations window. 2022-03-17 12:09:16 -04:00
Joe Taylor
15e33d22af More work in progress on the ActiveStations window. 2022-03-17 09:36:59 -04:00
Joe Taylor
ceb13110c5 Use monospace font in ActiveStations window. 2022-03-16 15:33:21 -04:00
Joe Taylor
e732c5ba62 Work in progress on the ActiveStations window. 2022-03-16 14:37:25 -04:00
Joe Taylor
38e65b747a Display active stations in decreasing order of points. 2022-03-16 13:05:20 -04:00
Joe Taylor
689b040cc5 Make ARRL_Digi_Update() into a separate function. 2022-03-16 11:50:37 -04:00
Joe Taylor
9761c10648 Make ARRL_Digi_Display() [executed at end of decodeDone()] a separate function. 2022-03-16 11:35:40 -04:00
Joe Taylor
04836a447d Much of the code for helping S+P in ARRL_DIGI contest is now in place. More to come! 2022-03-16 11:26:11 -04:00
Joe Taylor
38174ed6dc Use "ARRL_DIGI" rather than "NA_VHF". Needs testing! 2022-03-14 15:59:49 -04:00
Joe Taylor
d96a1a1173 Starting to implement QMaps for activeStations and recentStations. 2022-03-14 14:18:53 -04:00
Joe Taylor
c8574b5890 Make display of Active Stations window sticky on program restart. 2022-03-14 10:12:22 -04:00
Joe Taylor
66d1497558 Revert "Starting the transition from RTTY Roundup to ARRL International Digital Contest."
This reverts commit 114aeda3f8.
2022-03-14 09:59:09 -04:00
Joe Taylor
22b86544be Revert "Change some labels from "RTTY Roundup" to "ARRL Digi". *** May not keep this! ***"
This reverts commit b12b1dec39.
2022-03-14 09:56:07 -04:00
Joe Taylor
b12b1dec39 Change some labels from "RTTY Roundup" to "ARRL Digi". *** May not keep this! *** 2022-03-13 21:44:31 -04:00
Joe Taylor
e529ad8df9 Change name for new window: ARRL_Digi ==> Active Stations 2022-03-12 09:55:50 -05:00
Joe Taylor
114aeda3f8 Starting the transition from RTTY Roundup to ARRL International Digital Contest. 2022-03-12 09:51:50 -05:00
Joe Taylor
e8c08c24a5 Change the source file names from arrl_digi.* to activeStations.* 2022-03-11 15:12:32 -05:00
Joe Taylor
f180d30126 More changes toward an "Active Stations" window. 2022-03-11 15:03:16 -05:00
Joe Taylor
4e96e58d57 Starting to change arrl_digi to activeStations. 2022-03-11 14:58:13 -05:00
Joe Taylor
f26b1c424f Starting to make it an "Active Stations" window. 2022-03-11 14:46:58 -05:00
Joe Taylor
658f23b813 Starting to implement a new "ARRL_Digi" window. 2022-03-11 13:11:39 -05:00
Joe Taylor
bc9e8f89bc Remove the SNR adjustment for Q65 averaged decodes. It does not seem to work as expected. 2022-03-08 11:48:54 -05:00
Joe Taylor
d6bcf9767a Replace a missing function declaration. 2022-03-08 11:48:18 -05:00
Joe Taylor
df445297d2 Merge branch 'arrl-digi-dx' of bitbucket.org:k1jt/wsjtx into arrl-digi-dx 2022-03-07 11:47:47 -05:00
Steven Franke
283d7d32e4 Fix a bounds error. 2022-03-07 11:46:29 -05:00
Uwe Risse
0b951a05e7 Add an option to disable the Tune watchdog. 2022-03-07 10:50:21 +01:00
Uwe Risse
e081c15716 Fix a typo in the ToolTip text 2022-03-06 17:45:59 +01:00
Uwe Risse
4e7d282980 Code cleanup. Remove one more line to prevent a compilation error. 2022-03-06 14:49:35 +01:00
Joe Taylor
c952bee07e Allow "CQ: Max Pts" only in "NA VHF, ARRL Digi-DX" contest mode. 2022-03-04 16:22:18 -05:00
Joe Taylor
1af4e46793 Code cleanup. We're not using any text highlighting in the CQ: comboBox. 2022-03-04 14:25:29 -05:00
Joe Taylor
ce5ecaf99d Tweak the ToolTip text. 2022-03-03 15:00:38 -05:00
Joe Taylor
7d66232ec7 Add a ToolTip for the new ComboBox selecting CQ rsponse type. 2022-03-03 14:44:28 -05:00
Joe Taylor
5e9645091d Perhaps "CQ: Max Pts" is working, now? Time for some tests. 2022-03-03 14:21:03 -05:00
Joe Taylor
16d97aad3b Now builds OK,but mods for "CQ: Max Pts"not yet finished. 2022-03-02 14:12:07 -05:00
Steven Franke
561240763c Fix a bounds error. 2022-03-02 11:15:59 -06:00
Joe Taylor
c5bc704342 Starting a test implementation of "CQ: Max Pts". More to come! 2022-03-02 07:51:51 -05:00
Steven Franke
33d3955086 Make SNR calculation for a7 decodes consistent with that of regular decodes. 2022-02-26 11:06:37 -06:00
Joe Taylor
5471cb3534 Don't attempt a7 decodes for messages with /, <, or directed CQ. 2022-02-18 14:57:56 -05:00
Joe Taylor
8e6f027c5e Oops! I committed the wrong version. 2022-02-17 10:22:18 -05:00
Joe Taylor
5e1795ff5c Fix the issue with using 'QQ0XYZ' in ft8_a7.f90. 2022-02-17 10:17:47 -05:00
Joe Taylor
5dc70b18db Reject a7 decodes of the form "CQ <std_call>" with no grid. 2022-02-15 16:28:19 -05:00
Uwe Risse
2545103ba5 Fix implicit-const-int-float-conversion error (by JG1UAA) 2022-02-11 11:00:21 +01:00
Uwe Risse
2e3cec2201 Fix "unable to find library -lwsjt_fort_omp" on OpenMP-unsupported-platform (by JG1UAA) 2022-02-11 10:52:20 +01:00
Joe Taylor
cab1bb8aed Use BIND(C) for gen65.f90, and pass strings in/out as character*1 arrays. Please test on macOS! 2022-01-31 19:18:46 -05:00
Uwe Risse
22b580af56 Use the sixth mode button for JT65 instead of FST4. 2022-01-30 17:40:26 +01:00
Joe Taylor
5b97226b33 Reinstate the cmake option for WSJT_QDEBUG_IN_RELEASE. I like having it. 2022-01-27 15:00:00 -05:00
Joe Taylor
7a6f0344da Merge branch 'feat-a7-UR' of bitbucket.org:k1jt/wsjtx into feat-a7-UR 2022-01-27 11:00:54 -05:00
Joe Taylor
d023c80109 Fix all calls from GUI to Fortran with hidden string-length arguments. 2022-01-27 10:58:04 -05:00
Joe Taylor
56414dda30 Remove jtmsg.f90 from CMakeLists.txt, it's no longer used. 2022-01-27 10:55:19 -05:00
Steven Franke
a9f895ca6b Fix the failure to auto-sequence when a decode contains a low-confidence a-priori designator, such as "? a3". 2022-01-27 09:29:36 -06:00
Steven Franke
78cd7824ae Fix the failure to auto-sequence when a decode contains a low-confidence a-priori designator, such as "? a3". 2022-01-27 09:23:32 -06:00
Steven Franke
1ca81f4610 Revert "Repair a defect where Auto Seq failed for messages with apriori code."
This reverts commit 5118e64fde.
2022-01-27 09:23:00 -06:00
Joe Taylor
d3020efdef Remove prototype declaration for a function no longer used. 2022-01-27 10:19:14 -05:00
Joe Taylor
540d16302e Merge branch 'feat-a7-UR' of bitbucket.org:k1jt/wsjtx into feat-a7-UR 2022-01-27 09:01:34 -05:00
Uwe Risse
5118e64fde Repair a defect where Auto Seq failed for messages with apriori code. 2022-01-26 18:29:08 +01:00
Joe Taylor
fd6ebff4d9 Better User Guide instructions for starting WSJT-X with interface in a different language. 2022-01-26 10:32:26 -05:00
Joe Taylor
76a1dd3c44 Add Russian (ru) to the list of available user-interface languages. 2022-01-26 10:32:15 -05:00
Joe Taylor
9c58135868 Add Russian translation for user interface. Thanks to Victor Kosobokov, R3BB. 2022-01-26 10:32:00 -05:00
Joe Taylor
0c98c2d2ff Better User Guide instructions for starting WSJT-X with interface in a different language. 2022-01-26 10:21:19 -05:00
Joe Taylor
81b4659de9 Add Russian (ru) to the list of available user-interface languages. 2022-01-26 10:05:49 -05:00
Joe Taylor
b10aa136d4 Add Russian translation for user interface. Thanks to Victor Kosobokov, R3BB. 2022-01-26 09:57:38 -05:00
Uwe Risse
1ff74b2cd5 Allow auto reply for non-CQ messages when Hold Tx Freq is enabled 2022-01-24 20:17:48 +01:00
Uwe Risse
0309b4f826 Prevent self-spotting when running multiple instances 2022-01-24 17:50:43 +01:00
Uwe Risse
35df81a858 Revert "Prevent self spotting when running multiple instances"
This reverts commit 96974e0537.
2022-01-24 17:48:58 +01:00
Uwe Risse
8545cdb96d Change QThread from HighPriority to TimeCriticalPriority 2022-01-23 09:19:28 +01:00
Uwe Risse
fde103da2d Revert "Fix the dropped audio problems on Windows"
This reverts commit 194ad5c7b4.
2022-01-23 09:14:39 +01:00
Uwe Risse
194ad5c7b4 Fix the dropped audio problems on Windows 2022-01-22 09:43:15 +01:00
Uwe Risse
5c09e55351 Correct highlighting of messages with myCall and 73 2022-01-21 16:49:03 +01:00
Uwe Risse
5c1b7a8d8f Adjustments for correct highlighting of messages with 73 2022-01-21 16:45:48 +01:00
Uwe Risse
c84aac0c62 Correct a minor inconsistency 2022-01-18 17:37:49 +01:00
Joe Taylor
12cbf366fe Merge branch 'feat-a7-UR' of bitbucket.org:k1jt/wsjtx into feat-a7-UR 2022-01-18 11:17:07 -05:00
Joe Taylor
a3fa2cef88 Correction to User Guide addition: use bold-face where needed. 2022-01-18 11:16:03 -05:00
Uwe Risse
4b6886cdd0 Add options to the writing of ALL.TXT 2022-01-18 17:10:41 +01:00
Joe Taylor
7081f9cf9b In User Guide, clarify that using F4 to re-transmit Tx4 requires "Alternate F1-F6 bindings". 2022-01-18 11:09:53 -05:00
Uwe Risse
151f0f0ab3 Set Tune watchdog to 120 seconds 2022-01-18 10:18:10 +01:00
Uwe Risse
47b5cc21f2 Merge remote-tracking branch 'origin/feat-UR' into feat-a7-UR
* origin/feat-UR:
  Add optional highlighting of messages with 73 or RR73
2022-01-17 21:08:48 +01:00
Uwe Risse
ea3a6b272a Merge commit '947ab4eb2570b984c2bd950ff1b518ce25d84965' into feat-a7-UR
* commit '947ab4eb2570b984c2bd950ff1b518ce25d84965':
  Add features Highlight DX Call / DX Grid and Clear DX Call / DX Grid after QSO
2022-01-17 21:08:38 +01:00
Uwe Risse
f7dd8a86a8 Merge commit 'fb4eb56508e24da65fac00e6a5892a768a4df20b' into feat-a7-UR
* commit 'fb4eb56508e24da65fac00e6a5892a768a4df20b':
  Minor tooltip cleanup
2022-01-17 21:08:20 +01:00
Uwe Risse
de2ba14ca0 Merge commit '11b23ae9cd4ec961b9a35571d428a6f27b2eef18' into feat-a7-UR
* commit '11b23ae9cd4ec961b9a35571d428a6f27b2eef18':
  A more balanced stretching
2022-01-17 21:07:56 +01:00
Joe Taylor
6266b8d80e Merge branch 'feat-a7-UR' of bitbucket.org:k1jt/wsjtx into feat-a7-UR 2022-01-11 16:01:19 -05:00
Joe Taylor
c26aa9160b Go back to original settings for sync threshold and decode acceptance criteria. 2022-01-11 11:55:26 -05:00
Joe Taylor
fc40770960 Revert "Improve ft8 decoder sensitivity for Normal and Deep settings"
This reverts commit 3e49dfacc5.
2022-01-11 11:54:36 -05:00
Uwe Risse
3a765e3b12 Add optional highlighting of messages with 73 or RR73 2022-01-11 14:35:15 +01:00
Uwe Risse
947ab4eb25 Add features Highlight DX Call / DX Grid and Clear DX Call / DX Grid after QSO 2022-01-11 10:51:48 +01:00
Uwe Risse
fb4eb56508 Minor tooltip cleanup 2022-01-10 20:16:54 +01:00
Uwe Risse
11b23ae9cd A more balanced stretching 2022-01-10 19:59:28 +01:00
Uwe Risse
39fecf92c9 Fix a typo (needed for compilation) 2022-01-10 19:54:04 +01:00
Joe Taylor
9d7f323231 Merge branch 'feat-UR' into feat-a7-UR 2022-01-10 11:39:53 -05:00
Uwe Risse
d992c9bbaf Correct layoutColumnStretch 2022-01-10 15:30:22 +01:00
Uwe Risse
39b63f4190 Add mode buttons to the mainwindow 2022-01-10 13:54:48 +01:00
Uwe Risse
9ffa81e59a Add tune watchdog (60s) 2022-01-10 11:26:03 +01:00
Uwe Risse
96974e0537 Prevent self spotting when running multiple instances 2022-01-10 11:20:55 +01:00
Uwe Risse
b68e90ae88 Slightly reduce number of false decodes 2022-01-10 11:04:11 +01:00
Uwe Risse
ab89d70b6a Improve ft8 decoder sensitivity 2022-01-10 10:41:23 +01:00
Uwe Risse
3e49dfacc5 Improve ft8 decoder sensitivity for Normal and Deep settings 2022-01-10 10:34:08 +01:00
Joe Taylor
5797e51fe3 Protect against a blank message. 2022-01-09 09:46:33 -05:00
Joe Taylor
d774733636 Set build_type to devel (RC 0), not RC 1. 2022-01-08 15:09:28 -05:00
Joe Taylor
500e565d77 For now, at least, revert to NFILT=4000 in subtractft8.f90. 2022-01-08 14:20:55 -05:00
Joe Taylor
99861082f2 Merge branch 'feat-ft8-q3' of bitbucket.org:k1jt/wsjtx into feat-ft8-q3 2022-01-08 10:18:03 -05:00
Joe Taylor
a3dedc81de Merge branch 'develop' into feat-ft8-q3 2022-01-07 13:07:18 -05:00
Joe Taylor
6b2df37137 Merge branch 'develop' into feat-ft8-q3 2022-01-07 11:38:10 -05:00
Joe Taylor
98b3cd9a05 W3SZ patch: Initialize AP params and set npasses=2 before first call to q65_dec0(). 2022-01-07 09:59:15 -06:00
Steven Franke
1a794c7ce9 Change version number to 2.6.0-rc1. 2022-01-07 09:53:59 -06:00
Joe Taylor
82d9ae9629 Merge branch 'master' into feat-ft8-q3 2022-01-06 11:03:32 -05:00
Uwe Risse
d28164e92a Set version number to 2.5.4 2021-12-28 10:31:58 +01:00
Uwe Risse
e2f601a01c Update Release Notes for release 2.5.4. 2021-12-28 10:23:46 +01:00
Uwe Risse
204672375b Fix the nonstandard callsign bug in v.2.5.3 2021-12-28 10:11:57 +01:00
Uwe Risse
7e8a405dc6 Revert "Fix the nonstandard callsign bug in v2.5.3."
This reverts commit b68c544ef7.
2021-12-28 10:08:48 +01:00
Joe Taylor
b68c544ef7 Fix the nonstandard callsign bug in v2.5.3. 2021-12-27 12:26:22 -05:00
Joe Taylor
d99c6adf4d Allow MAP65 "Best-fit Delta phi" solution to be displayed to the user. 2021-12-27 12:24:42 -05:00
Joe Taylor
69f9ec89d4 Update Release Notes one more time. 2021-12-07 10:33:39 -05:00
Joe Taylor
48baf47a88 Update Release Notes for release 2.5.3. 2021-12-07 10:32:11 -05:00
Joe Taylor
53b280ea53 Update CTY.DAT, tnx to AD1C 2021-12-07 10:31:02 -05:00
Joe Taylor
a12a72836a Update User Guide for the $DXCALL macro facility. 2021-12-07 10:13:48 -05:00
Joe Taylor
f66858a813 Add a G4WJS memorial to the About window. 2021-12-07 10:11:09 -05:00
Joe Taylor
a91dbe87be More edits. 2021-12-06 17:35:57 -05:00
Joe Taylor
77704621aa Tributes to Bill Somerville, G4WJS. Needs further editing. 2021-12-06 16:22:04 -05:00
Joe Taylor
e1928f3206 Add ;$ characters to message_alphabet in Configuration.cpp; move $ to end in same regexp in mainwindow.cpp. 2021-12-06 16:00:28 -05:00
Joe Taylor
adcc8c4bd7 Add pre-edited tributes to Bill. 2021-12-06 12:41:41 -05:00
Joe Taylor
43c0752140 Add the $DXCALL macro capability. 2021-12-06 11:12:10 -05:00
Bill Somerville
3e43e57858
Ensure MAIN VFO is used for Rx on rigs that require it 2021-11-12 13:26:31 +00:00
Joe Taylor
6020552473 Varioous adjustments to a7 decoding for FT8. 2021-11-11 12:28:24 -05:00
Joe Taylor
c13407612e Temporary save of changes related to a7 decodes. 2021-11-10 10:44:56 -05:00
Bill Somerville
e93cd45d19
Release note update 2021-11-10 11:00:09 +00:00
Bill Somerville
d541286ba2
Repair a defect in reporting low confidence decodes & assoc issues 2021-11-10 10:55:22 +00:00
Bill Somerville
f68a4bb1a1
Bump revision 2021-11-10 10:53:05 +00:00
Joe Taylor
21f8303511 W3SZ patch: Initialize AP params and set npasses=2 before first call to q65_dec0(). 2021-11-09 11:00:55 -05:00
Bill Somerville
669b3d972e
Remove unintended debug trace 2021-11-07 00:24:22 +00:00
Joe Taylor
9aa4786f11 Re-organize some of the FT8 a7 code. 2021-11-05 15:57:24 -04:00
Joe Taylor
4a68d3c4cf Adjustments to FT8 a7 code. Still more to come ... 2021-11-05 09:21:49 -04:00
Joe Taylor
393265a0e0 Working code for FT8 'a7' decodes. Still needs some cleanup. 2021-11-04 11:55:15 -04:00
Joe Taylor
5b406effcf Minor code cleanup. 2021-11-02 16:07:52 -04:00
Joe Taylor
77c532b1a3 Always use Deep for manual Q65 decodes (lagain==true). 2021-11-02 15:28:59 -04:00
Joe Taylor
8097f25c9c Make "Fast/Normal/Deep" a sticky setting in Q65 mode. 2021-11-02 15:28:52 -04:00
Joe Taylor
7e078c805f Fix the issue noted by N9JIM by allowing decodes near frequencies already searched, but not displaying dupes. 2021-11-02 15:17:51 -04:00
Joe Taylor
994e00c5d2 Adjust the and-correction numbers for averaged Q65 decodes. 2021-11-01 10:22:41 -04:00
Joe Taylor
93ade73af7 Remove diagnostic writes. Include subtraction of a7 decodes. 2021-10-29 16:22:48 -04:00
Joe Taylor
c30b91cb69 Correct a format. 2021-10-29 15:31:22 -04:00
Joe Taylor
f13e318204 Improvements to a7 decoding for FT8. 2021-10-29 15:28:42 -04:00
Joe Taylor
48b1ad1e46 Send xdt and xsnr from ft8_dec7 to ft8_decode. 2021-10-28 15:19:40 -04:00
Joe Taylor
2b25c51169 First fully working version of 'a7' (q3-style) decoding for FT8. 2021-10-28 15:01:00 -04:00
Joe Taylor
5a0cb0f0a0 Fix a bug in gen_ft8wave.f90 that failed to update pulse and ctab when sample rate changes. 2021-10-28 11:47:00 -04:00
Joe Taylor
f51a7d4f7d Correct a longstanding error in values of "nw()" returned by subroutine split77(). 2021-10-27 12:09:23 -04:00
Joe Taylor
901e9dbc38 Working program test_ft8q3 and subroutine ft8q3(). 2021-10-26 16:40:14 -04:00
Joe Taylor
384899754f Add initial version of test_ft8q3.f90. 2021-10-26 12:31:24 -04:00
Joe Taylor
0ed62e4f80 Save test routine ft8q3.f90 -- first, as a main program. 2021-10-26 12:14:32 -04:00
Joe Taylor
a5be2fb4ef TEMPORARY: save downsampled data at f0=1500 Hz, for testing ft8q3. 2021-10-26 08:58:06 -04:00
97 changed files with 12051 additions and 1830 deletions

View File

@ -45,7 +45,7 @@ if (POLICY CMP0075)
endif ()
project (wsjtx
VERSION 2.5.2.0
VERSION 2.6.0.0
LANGUAGES C CXX Fortran
)
set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio")
@ -71,7 +71,7 @@ message (STATUS "******************************************************")
include (set_build_type)
# RC 0 or omitted is a development build, GA is a General Availability release build
set_build_type (RC GA)
set_build_type (RC 2)
set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}")
#
@ -126,7 +126,8 @@ option (WSJT_GENERATE_DOCS "Generate documentation files." ON)
option (WSJT_RIG_NONE_CAN_SPLIT "Allow split operation with \"None\" as rig.")
option (WSJT_TRACE_UDP "Debugging option that turns on UDP message protocol diagnostics.")
option (WSJT_BUILD_UTILS "Build simulators and code demonstrators." ON)
CMAKE_DEPENDENT_OPTION (WSJT_QDEBUG_IN_RELEASE "Leave Qt debugging statements in Release configuration." OFF
"NOT is_debug_build" OFF)
CMAKE_DEPENDENT_OPTION (WSJT_ENABLE_EXPERIMENTAL_FEATURES "Enable features not fully ready for public releases." ON
is_debug_build OFF)
CMAKE_DEPENDENT_OPTION (WSJT_CREATE_WINMAIN
@ -273,6 +274,7 @@ set (wsjtx_CXXSRCS
widgets/about.cpp
widgets/astro.cpp
widgets/messageaveraging.cpp
widgets/activeStations.cpp
widgets/colorhighlighting.cpp
WSPR/WsprTxScheduler.cpp
widgets/mainwindow.cpp
@ -336,6 +338,7 @@ set (wsjt_FSRCS
lib/timer_module.f90
lib/wavhdr.f90
lib/qra/q65/q65_encoding_modules.f90
lib/ft8/ft8_a7.f90
# remaining non-module sources
lib/addit.f90
@ -382,6 +385,7 @@ set (wsjt_FSRCS
lib/demod64a.f90
lib/determ.f90
lib/downsam9.f90
lib/echo_snr.f90
lib/encode232.f90
lib/encode4.f90
lib/encode_msk40.f90
@ -460,7 +464,6 @@ set (wsjt_FSRCS
lib/inter_wspr.f90
lib/jplsubs.f
lib/jt9fano.f90
lib/jtmsg.f90
lib/libration.f90
lib/lorentzian.f90
lib/fst4/lorentzian_fading.f90
@ -505,6 +508,7 @@ set (wsjt_FSRCS
lib/qra/q65/q65_set_list.f90
lib/refspectrum.f90
lib/savec2.f90
lib/save_dxbase.f90
lib/sec0.f90
lib/sec_midn.f90
lib/setup65.f90
@ -539,6 +543,7 @@ set (wsjt_FSRCS
lib/sync9.f90
lib/sync9f.f90
lib/sync9w.f90
lib/test_snr.f90
lib/timf2.f90
lib/tweak1.f90
lib/twkfreq.f90
@ -649,6 +654,7 @@ set (wsjtx_UISRCS
widgets/echograph.ui
widgets/fastgraph.ui
widgets/messageaveraging.ui
widgets/activeStations.ui
widgets/widegraph.ui
widgets/logqso.ui
Configuration.ui
@ -1126,6 +1132,9 @@ target_link_libraries (jt65sim wsjt_fort wsjt_cxx)
add_executable (sumsim lib/sumsim.f90)
target_link_libraries (sumsim wsjt_fort wsjt_cxx)
add_executable (test_snr lib/test_snr.f90)
target_link_libraries (test_snr wsjt_fort)
add_executable (q65sim lib/qra/q65/q65sim.f90)
target_link_libraries (q65sim wsjt_fort wsjt_cxx)
@ -1258,6 +1267,7 @@ set (LANGUAGES
ja # Japanese
#no # Norwegian
#pt # Portuguese
ru # Russian
#sv # Swedish
zh # Chinese
zh_HK # Chinese per Hong Kong
@ -1441,7 +1451,7 @@ set_target_properties (wsjtx PROPERTIES
)
target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS})
if (APPLE)
if ((NOT ${OPENMP_FOUND}) OR APPLE)
target_link_libraries (wsjtx wsjt_fort)
else ()
target_link_libraries (wsjtx wsjt_fort_omp)

View File

@ -208,7 +208,7 @@ namespace
int const combo_box_item_disabled (0);
// QRegExp message_alphabet {"[- A-Za-z0-9+./?]*"};
QRegularExpression message_alphabet {"[- @A-Za-z0-9+./?#<>]*"};
QRegularExpression message_alphabet {"[- @A-Za-z0-9+./?#<>;$]*"};
QRegularExpression RTTY_roundup_exchange_re {
R"(
(
@ -593,6 +593,7 @@ private:
bool highlight_by_mode_;
bool highlight_only_fields_;
bool include_WAE_entities_;
bool highlight_73_;
int LotW_days_since_upload_;
TransceiverFactory::ParameterPack rig_params_;
@ -645,6 +646,7 @@ private:
bool TX_messages_;
bool enable_VHF_features_;
bool decode_at_52s_;
bool Tune_watchdog_disabled_;
bool single_decode_;
bool twoPass_;
bool bSpecialOp_;
@ -670,6 +672,8 @@ private:
bool bLowSidelobes_;
bool pwrBandTxMemory_;
bool pwrBandTuneMemory_;
bool highlight_DXcall_;
bool highlight_DXgrid_;
QAudioDeviceInfo audio_input_device_;
QAudioDeviceInfo next_audio_input_device_;
@ -750,6 +754,7 @@ int Configuration::watchdog () const {return m_->watchdog_;}
bool Configuration::TX_messages () const {return m_->TX_messages_;}
bool Configuration::enable_VHF_features () const {return m_->enable_VHF_features_;}
bool Configuration::decode_at_52s () const {return m_->decode_at_52s_;}
bool Configuration::Tune_watchdog_disabled () const {return m_->Tune_watchdog_disabled_;}
bool Configuration::single_decode () const {return m_->single_decode_;}
bool Configuration::twoPass() const {return m_->twoPass_;}
bool Configuration::x2ToneSpacing() const {return m_->x2ToneSpacing_;}
@ -787,6 +792,9 @@ DecodeHighlightingModel const& Configuration::decode_highlighting () const {retu
bool Configuration::highlight_by_mode () const {return m_->highlight_by_mode_;}
bool Configuration::highlight_only_fields () const {return m_->highlight_only_fields_;}
bool Configuration::include_WAE_entities () const {return m_->include_WAE_entities_;}
bool Configuration::highlight_73 () const {return m_->highlight_73_;}
bool Configuration::highlight_DXcall () const {return m_->highlight_DXcall_;}
bool Configuration::highlight_DXgrid () const {return m_->highlight_DXgrid_;}
void Configuration::set_calibration (CalibrationParams params)
{
@ -893,7 +901,7 @@ QString Configuration::Field_Day_Exchange() const
{
return m_->FD_exchange_;
}
/*
void Configuration::setEU_VHF_Contest()
{
m_->bSpecialOp_=true;
@ -902,6 +910,7 @@ void Configuration::setEU_VHF_Contest()
m_->SelectedActivity_ = static_cast<int> (SpecialOperatingActivity::EU_VHF);
m_->write_settings();
}
*/
QString Configuration::RTTY_Exchange() const
{
@ -920,6 +929,30 @@ void Configuration::set_location (QString const& grid_descriptor)
m_->dynamic_grid_ = grid_descriptor.trimmed ();
}
void Configuration::setSpecial_Hound()
{
m_->bSpecialOp_=true;
m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_);
m_->ui_->rbHound->setChecked(true);
m_->SelectedActivity_ = static_cast<int> (SpecialOperatingActivity::HOUND);
m_->write_settings();
}
void Configuration::setSpecial_Fox()
{
m_->bSpecialOp_=true;
m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_);
m_->ui_->rbFox->setChecked(true);
m_->SelectedActivity_ = static_cast<int> (SpecialOperatingActivity::FOX);
m_->write_settings();
}
void Configuration::setSpecial_None()
{
m_->bSpecialOp_=false;
m_->ui_->gbSpecialOpActivity->setChecked(m_->bSpecialOp_);
m_->write_settings();
}
namespace
{
#if defined (Q_OS_MAC)
@ -984,6 +1017,7 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
, highlight_by_mode_ {false}
, highlight_only_fields_ {false}
, include_WAE_entities_ {false}
, highlight_73_ {false}
, LotW_days_since_upload_ {0}
, last_port_type_ {TransceiverFactory::Capabilities::none}
, rig_is_dummy_ {false}
@ -1122,6 +1156,7 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
ui_->special_op_activity_button_group->setId (ui_->rbField_Day, static_cast<int> (SpecialOperatingActivity::FIELD_DAY));
ui_->special_op_activity_button_group->setId (ui_->rbRTTY_Roundup, static_cast<int> (SpecialOperatingActivity::RTTY));
ui_->special_op_activity_button_group->setId (ui_->rbWW_DIGI, static_cast<int> (SpecialOperatingActivity::WW_DIGI));
ui_->special_op_activity_button_group->setId (ui_->rbARRL_Digi, static_cast<int> (SpecialOperatingActivity::ARRL_DIGI));
ui_->special_op_activity_button_group->setId (ui_->rbFox, static_cast<int> (SpecialOperatingActivity::FOX));
ui_->special_op_activity_button_group->setId (ui_->rbHound, static_cast<int> (SpecialOperatingActivity::HOUND));
@ -1320,6 +1355,7 @@ void Configuration::impl::initialize_models ()
ui_->TX_messages_check_box->setChecked (TX_messages_);
ui_->enable_VHF_features_check_box->setChecked(enable_VHF_features_);
ui_->decode_at_52s_check_box->setChecked(decode_at_52s_);
ui_->disable_Tune_watchdog_check_box->setChecked(Tune_watchdog_disabled_);
ui_->single_decode_check_box->setChecked(single_decode_);
ui_->cbTwoPass->setChecked(twoPass_);
ui_->gbSpecialOpActivity->setChecked(bSpecialOp_);
@ -1397,7 +1433,10 @@ void Configuration::impl::initialize_models ()
ui_->highlight_by_mode_check_box->setChecked (highlight_by_mode_);
ui_->only_fields_check_box->setChecked (highlight_only_fields_);
ui_->include_WAE_check_box->setChecked (include_WAE_entities_);
ui_->highlight_73_check_box->setChecked (highlight_73_);
ui_->LotW_days_since_upload_spin_box->setValue (LotW_days_since_upload_);
ui_->cbHighlightDXcall->setChecked(highlight_DXcall_);
ui_->cbHighlightDXgrid->setChecked(highlight_DXgrid_);
set_rig_invariants ();
}
@ -1492,6 +1531,7 @@ void Configuration::impl::read_settings ()
highlight_by_mode_ = settings_->value("HighlightByMode", false).toBool ();
highlight_only_fields_ = settings_->value("OnlyFieldsSought", false).toBool ();
include_WAE_entities_ = settings_->value("IncludeWAEEntities", false).toBool ();
highlight_73_ = settings_->value("Highlight73", false).toBool ();
LotW_days_since_upload_ = settings_->value ("LotWDaysSinceLastUpload", 365).toInt ();
lotw_users_.set_age_constraint (LotW_days_since_upload_);
@ -1531,6 +1571,7 @@ void Configuration::impl::read_settings ()
TX_messages_ = settings_->value ("Tx2QSO", true).toBool ();
enable_VHF_features_ = settings_->value("VHFUHF",false).toBool ();
decode_at_52s_ = settings_->value("Decode52",false).toBool ();
Tune_watchdog_disabled_ = settings_->value("TuneWatchdogDisabled",false).toBool ();
single_decode_ = settings_->value("SingleDecode",false).toBool ();
twoPass_ = settings_->value("TwoPass",true).toBool ();
bSpecialOp_ = settings_->value("SpecialOpActivity",false).toBool ();
@ -1554,6 +1595,8 @@ void Configuration::impl::read_settings ()
calibration_.slope_ppm = settings_->value ("CalibrationSlopePPM", 0.).toDouble ();
pwrBandTxMemory_ = settings_->value("pwrBandTxMemory",false).toBool ();
pwrBandTuneMemory_ = settings_->value("pwrBandTuneMemory",false).toBool ();
highlight_DXcall_ = settings_->value("highlight_DXcall",false).toBool ();
highlight_DXgrid_ = settings_->value("highlight_DXgrid",false).toBool ();
}
void Configuration::impl::find_audio_devices ()
@ -1626,6 +1669,7 @@ void Configuration::impl::write_settings ()
settings_->setValue ("HighlightByMode", highlight_by_mode_);
settings_->setValue ("OnlyFieldsSought", highlight_only_fields_);
settings_->setValue ("IncludeWAEEntities", include_WAE_entities_);
settings_->setValue ("Highlight73", highlight_73_);
settings_->setValue ("LotWDaysSinceLastUpload", LotW_days_since_upload_);
settings_->setValue ("toRTTY", log_as_RTTY_);
settings_->setValue ("dBtoComments", report_in_comments_);
@ -1662,6 +1706,7 @@ void Configuration::impl::write_settings ()
settings_->setValue ("SplitMode", QVariant::fromValue (rig_params_.split_mode));
settings_->setValue ("VHFUHF", enable_VHF_features_);
settings_->setValue ("Decode52", decode_at_52s_);
settings_->setValue ("TuneWatchdogDisabled", Tune_watchdog_disabled_);
settings_->setValue ("SingleDecode", single_decode_);
settings_->setValue ("TwoPass", twoPass_);
settings_->setValue ("SelectedActivity", SelectedActivity_);
@ -1685,6 +1730,8 @@ void Configuration::impl::write_settings ()
settings_->setValue ("pwrBandTuneMemory", pwrBandTuneMemory_);
settings_->setValue ("Region", QVariant::fromValue (region_));
settings_->setValue ("AutoGrid", use_dynamic_grid_);
settings_->setValue ("highlight_DXcall", highlight_DXcall_);
settings_->setValue ("highlight_DXgrid", highlight_DXgrid_);
settings_->sync ();
}
@ -2088,6 +2135,7 @@ void Configuration::impl::accept ()
azel_directory_.setPath (ui_->azel_path_display_label->text ());
enable_VHF_features_ = ui_->enable_VHF_features_check_box->isChecked ();
decode_at_52s_ = ui_->decode_at_52s_check_box->isChecked ();
Tune_watchdog_disabled_ = ui_->disable_Tune_watchdog_check_box->isChecked ();
single_decode_ = ui_->single_decode_check_box->isChecked ();
twoPass_ = ui_->cbTwoPass->isChecked ();
bSpecialOp_ = ui_->gbSpecialOpActivity->isChecked ();
@ -2163,6 +2211,7 @@ void Configuration::impl::accept ()
highlight_by_mode_ = ui_->highlight_by_mode_check_box->isChecked ();
highlight_only_fields_ = ui_->only_fields_check_box->isChecked ();
include_WAE_entities_ = ui_->include_WAE_check_box->isChecked ();
highlight_73_ = ui_->highlight_73_check_box->isChecked ();
LotW_days_since_upload_ = ui_->LotW_days_since_upload_spin_box->value ();
lotw_users_.set_age_constraint (LotW_days_since_upload_);
@ -2172,7 +2221,8 @@ void Configuration::impl::accept ()
dynamic_grid_.clear ();
}
use_dynamic_grid_ = ui_->use_dynamic_grid->isChecked();
highlight_DXcall_ = ui_->cbHighlightDXcall->isChecked();
highlight_DXgrid_ = ui_->cbHighlightDXgrid->isChecked();
write_settings (); // make visible to all
}

View File

@ -134,6 +134,7 @@ public:
bool split_mode () const;
bool enable_VHF_features () const;
bool decode_at_52s () const;
bool Tune_watchdog_disabled () const;
bool single_decode () const;
bool twoPass() const;
bool bFox() const;
@ -181,8 +182,14 @@ public:
bool highlight_by_mode () const;
bool highlight_only_fields () const;
bool include_WAE_entities () const;
bool highlight_73 () const;
void setSpecial_Hound();
void setSpecial_Fox();
void setSpecial_None();
bool highlight_DXcall () const;
bool highlight_DXgrid () const;
enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, WW_DIGI, FOX, HOUND};
enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, WW_DIGI, ARRL_DIGI, FOX, HOUND};
SpecialOperatingActivity special_op_id () const;
struct CalibrationParams

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>554</width>
<height>560</height>
<width>588</width>
<height>642</height>
</rect>
</property>
<property name="windowTitle">
@ -171,46 +171,6 @@
<string>Display</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="3" column="0">
<widget class="QCheckBox" name="TX_messages_check_box">
<property name="toolTip">
<string>Show outgoing transmitted messages in the Rx frequency window.</string>
</property>
<property name="text">
<string>&amp;Tx messages to Rx frequency window</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="DXCC_check_box">
<property name="toolTip">
<string>Show if decoded stations are new DXCC entities or worked before.</string>
</property>
<property name="text">
<string>Show &amp;DXCC, grid, and worked-before status</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="decodes_from_top_check_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.&lt;/p&gt;&lt;p&gt;This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Start new period decodes at top</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="ppfx_check_box">
<property name="text">
<string>Show principal prefix instead of country name</string>
</property>
</widget>
</item>
<item row="0" column="1" rowspan="4">
<layout class="QHBoxLayout" name="horizontalLayout_21">
<item>
@ -285,6 +245,60 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="cbHighlightDXgrid">
<property name="text">
<string>Highlight DX Grid in message</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="ppfx_check_box">
<property name="text">
<string>Show principal prefix instead of country name</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="cbHighlightDXcall">
<property name="text">
<string>Highlight DX Call in message</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="decodes_from_top_check_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check to have decodes for a new period start at the top of the Band Activity window and not scroll off the top when the window is full.&lt;/p&gt;&lt;p&gt;This is to aid selecting decodes to double-click while decoding is still in progress. Use the Band Activity vertical scroll bar to reveal decodes past the bottom of the window.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Start new period decodes at top</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="TX_messages_check_box">
<property name="toolTip">
<string>Show outgoing transmitted messages in the Rx frequency window.</string>
</property>
<property name="text">
<string>&amp;Tx messages to Rx frequency window</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="DXCC_check_box">
<property name="toolTip">
<string>Show if decoded stations are new DXCC entities or worked before.</string>
</property>
<property name="text">
<string>Show &amp;DXCC, grid, and worked-before status</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -489,6 +503,16 @@ quiet period when decoding is done.</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="disable_Tune_watchdog_check_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Disable the Tune watchdog.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Disable Tune watchdog</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -2302,6 +2326,23 @@ Right click for insert and delete options.</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="include_WAE_check_box">
<property name="text">
<string>Include extra WAE entities</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="only_fields_check_box">
<property name="toolTip">
<string>Check to for grid highlighting to only apply to unworked grid fields</string>
</property>
<property name="text">
<string>Only grid Fields sought</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="DecodeHighlightingListView" name="highlighting_list_view">
<property name="sizePolicy">
@ -2349,20 +2390,10 @@ Right click for insert and delete options.</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="include_WAE_check_box">
<item row="5" column="0">
<widget class="QCheckBox" name="highlight_73_check_box">
<property name="text">
<string>Include extra WAE entities</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="only_fields_check_box">
<property name="toolTip">
<string>Check to for grid highlighting to only apply to unworked grid fields</string>
</property>
<property name="text">
<string>Only grid Fields sought</string>
<string>Highlight also messages with 73 or RR73</string>
</property>
</widget>
</item>
@ -2483,78 +2514,10 @@ Right click for insert and delete options.</string>
<string>Advanced</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_9">
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox_6">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;User-selectable parameters for JT65 VHF/UHF/Microwave decoding.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="title">
<string>JT65 VHF/UHF/Microwave decoding parameters</string>
</property>
<layout class="QFormLayout" name="formLayout_11">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Random erasure patterns:</string>
</property>
<property name="buddy">
<cstring>sbNtrials</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="sbNtrials">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Maximum number of erasure patterns for stochastic soft-decision Reed Solomon decoder is 10^(n/2).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>12</number>
</property>
<property name="value">
<number>6</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Aggressive decoding level:</string>
</property>
<property name="buddy">
<cstring>sbAggressive</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="sbAggressive">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Higher levels will increase the probability of decoding, but will also increase probability of a false decode.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="maximum">
<number>10</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="cbTwoPass">
<property name="text">
<string>Two-pass decoding</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="gbSpecialOpActivity">
<property name="title">
<string>Special operating activity: Generation of FT4, FT8, and MSK144 messages</string>
<string>Special operating activity</string>
</property>
<property name="checkable">
<bool>true</bool>
@ -2563,47 +2526,6 @@ Right click for insert and delete options.</string>
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_15" columnstretch="1,0,0,0">
<item row="0" column="3">
<widget class="QRadioButton" name="rbHound">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;FT8 DXpedition mode: Hound operator calling the DX.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="accessibleName">
<string>Hound</string>
</property>
<property name="text">
<string>Hound</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="rbNA_VHF_Contest">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="accessibleName">
<string>NA VHF Contest</string>
</property>
<property name="text">
<string>NA VHF Contest</string>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="rbFox">
<property name="toolTip">
@ -2645,6 +2567,28 @@ Right click for insert and delete options.</string>
</attribute>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="rbNA_VHF_Contest">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;North American VHF/UHF/Microwave contests and others in which a 4-character grid locator is the required exchange.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="accessibleName">
<string>NA VHF Contest</string>
</property>
<property name="text">
<string>NA VHF</string>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
<item row="0" column="1" rowspan="3">
<spacer name="horizontalSpacer_11">
<property name="orientation">
@ -2658,74 +2602,24 @@ Right click for insert and delete options.</string>
</property>
</spacer>
</item>
<item row="2" column="3">
<layout class="QHBoxLayout" name="horizontalLayout_18" stretch="2,1,1">
<item>
<widget class="QRadioButton" name="rbRTTY_Roundup">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &amp;quot;DX&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="accessibleName">
<string>R T T Y Roundup</string>
</property>
<property name="text">
<string>RTTY Roundup messages</string>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_10">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QFormLayout" name="formLayout_17">
<item row="0" column="0">
<widget class="QLabel" name="labRTTY">
<property name="accessibleName">
<string>RTTY Roundup exchange</string>
</property>
<property name="text">
<string>RTTY RU Exch:</string>
</property>
<property name="buddy">
<cstring>RTTY_Exchange</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="RTTY_Exchange">
<property name="minimumSize">
<size>
<width>70</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &amp;quot;DX&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>NJ</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
<item row="0" column="3">
<widget class="QRadioButton" name="rbHound">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;FT8 DXpedition mode: Hound operator calling the DX.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="accessibleName">
<string>Hound</string>
</property>
<property name="text">
<string>Hound</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
<item row="1" column="3">
<layout class="QHBoxLayout" name="horizontalLayout_17" stretch="2,1,1">
@ -2818,6 +2712,88 @@ Right click for insert and delete options.</string>
</attribute>
</widget>
</item>
<item row="2" column="3">
<layout class="QHBoxLayout" name="horizontalLayout_18" stretch="2,1,1">
<item>
<widget class="QRadioButton" name="rbRTTY_Roundup">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;FT Roundup and similar contests. Exchange is US state, Canadian province, or &amp;quot;DX&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="accessibleName">
<string>R T T Y Roundup</string>
</property>
<property name="text">
<string>FT Roundup</string>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_10">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QFormLayout" name="formLayout_17">
<item row="0" column="0">
<widget class="QLabel" name="labRTTY">
<property name="accessibleName">
<string>RTTY Roundup exchange</string>
</property>
<property name="text">
<string>FT RU Exch:</string>
</property>
<property name="buddy">
<cstring>RTTY_Exchange</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="RTTY_Exchange">
<property name="minimumSize">
<size>
<width>70</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;FT Roundup and similar contests. Exchange is US state, Canadian province, or &amp;quot;DX&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>NJ</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="3" column="3">
<widget class="QRadioButton" name="rbARRL_Digi">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ARRL International Digital Contest&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>ARRL Digi Contest</string>
</property>
<attribute name="buttonGroup">
<string notr="true">special_op_activity_button_group</string>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
@ -2993,6 +2969,74 @@ Right click for insert and delete options.</string>
</layout>
</widget>
</item>
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox_6">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;User-selectable parameters for JT65 VHF/UHF/Microwave decoding.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="title">
<string>JT65 VHF/UHF/Microwave decoding parameters</string>
</property>
<layout class="QFormLayout" name="formLayout_11">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Random erasure patterns:</string>
</property>
<property name="buddy">
<cstring>sbNtrials</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="sbNtrials">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Maximum number of erasure patterns for stochastic soft-decision Reed Solomon decoder is 10^(n/2).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>12</number>
</property>
<property name="value">
<number>6</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Aggressive decoding level:</string>
</property>
<property name="buddy">
<cstring>sbAggressive</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="sbAggressive">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Higher levels will increase the probability of decoding, but will also increase probability of a false decode.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="maximum">
<number>10</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="cbTwoPass">
<property name="text">
<string>Two-pass decoding</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0" colspan="2">
<spacer name="verticalSpacer_8">
<property name="orientation">
@ -3234,12 +3278,12 @@ Right click for insert and delete options.</string>
</connections>
<buttongroups>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="special_op_activity_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="special_op_activity_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="split_mode_button_group"/>
</buttongroups>
</ui>

View File

@ -13,25 +13,32 @@ namespace
{
QRegularExpression tokens_re {R"(
^
(?:(?<dual>[A-Z0-9/]+)\sRR73;\s)?
(?:(?<dual>[A-Z0-9/]+)\sRR73;\s)? # dual reply DXpedition message
(?:
(?<word1>
(?:CQ|DE|QRZ)
(?:\s?DX|\s
(?:[A-Z]{1,4}|\d{3})
(?:[A-Z]{1,4}|\d{3}) # directional CQ
)
| [A-Z0-9/]+
|\.{3}
| [A-Z0-9/]+ # DX call
|\.{3} # unknown hash code
)\s
)
(?:
(?<word2>[A-Z0-9/]+)
(?<word2>[A-Z0-9/]+) # DE call
(?:\s
(?<word3>[-+A-Z0-9]+)
(?<word3>[-+A-Z0-9]+) # report
(?:\s
(?<word4>
(?:OOO | (?!RR73)[A-R]{2}[0-9]{2})
(?:
OOO # EME
| (?!RR73)[A-R]{2}[0-9]{2} # grid square (not RR73)
| 5[0-9]{5} # EU VHF Contest report & serial
)
)
(?:\s
(?<word5>[A-R]{2}[0-9]{2}[A-X]{2}) # EU VHF Contest grid locator
)?
)?
)?
)?
@ -48,13 +55,15 @@ DecodedText::DecodedText (QString const& the_string)
, is_standard_ {false}
{
// discard appended AP info
clean_string_.replace (QRegularExpression {R"(^(.*?)(?:\?\s)?(?:a|q)[0-9].*$)"}, "\\1");
clean_string_.replace (QRegularExpression {R"(^(.*?)(?:\?\s)?[aq][0-9].*$)"}, "\\1");
// qDebug () << "DecodedText: the_string:" << the_string << "Nbsp pos:" << the_string.indexOf (QChar::Nbsp);
if (message_.length() >= 1)
{
message0_ = message_.left(36);
message_ = message_.left(36).remove (QRegularExpression {"[<>]"});
// remove appended confidence (?) and ap designators before truncating the message
message_ = clean_string_.mid (column_qsoText + padding_).trimmed ();
message0_ = message_.left(37);
message_ = message_.left(37).remove (QRegularExpression {"[<>]"});
int i1 = message_.indexOf ('\r');
if (i1 > 0)
{
@ -85,13 +94,13 @@ QStringList DecodedText::messageWords () const
// extract up to the first four message words
QString t=message_;
if(t.left(4)=="TU; ") t=message_.mid(4,-1);
auto res = tokens_re.match(t).capturedTexts();
qDebug () << "captured texts:" << res;
return res;
return tokens_re.match(t).capturedTexts();
}
// simple word split for free text messages
auto words = message_.split (' ', SkipEmptyParts);
// add whole message as item 0 to mimic RE capture list
// add whole message and two empty strings as item 0 & 1 to mimic RE
// capture list
words.prepend (QString {});
words.prepend (message_);
return words;
}
@ -121,7 +130,7 @@ bool DecodedText::isTX() const
bool DecodedText::isLowConfidence () const
{
return QChar {'?'} == string_.mid (padding_ + column_qsoText + 21, 1);
return QChar {'?'} == string_.mid (padding_ + column_qsoText + 36, 1);
}
int DecodedText::frequencyOffset() const

169
NEWS
View File

@ -9,7 +9,159 @@
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
Copyright 2001 - 2021 by Joe Taylor, K1JT.
Copyright 2001 - 2022 by Joe Taylor, K1JT, and the WSJT Development Team
Release: WSJT-X 2.6.0-rc2
July 21, 2022
----------------------
WSJT-X 2.6.0 Release Candidate 2 brings a number of improvements as
well as some bug fixes.
- The "Measure" function in Echo mode now uses the computed Doppler
spread for DX grid, when available. This feature is especially
helpful for microwave EME tests, enabling accurate measurement of
SNR for a DX station.
- Settings for T/R period and Submode are now remembered by mode when
you switch directly between (for example) MSK144-15, Q65-60A,
JT65C, or FST4-120.
- Tx and Rx audio frequencies are remembered and restored when you
return from a mode that sets a default frequency of 1500 Hz
(MSK144, FST4W, Echo, WSPR, FreqCal) and then switching back to
FT4, FT8, Q65, JT65, or FST4.
- QSOs in the Contest Log can now be displayed in increasing or
decreasing order of logged time. By default the log is scrolled to
the latest logged QSO, ready for insertion of a new contact. The
total number of QSOs in the Contest Log is displayed at bottom left
of its window.
- Default FT8 frequency for 4m band (Region 1) is set to 70.154 MHz.
- Layout of mode buttons has been optimized for 4K screens.
- Display of Keyboard Shortcuts has been updated.
- The OK button now has default focus in the LogQSO dialog window.
You may just hit Enter to log the QSO.
- Bug fix: The Tx Freq spinbox remained red when coming back from
some Q65 submodes. Corrected.
- Hamlib bug fixes: make sure that VFOB is selected when required on
some rigs (e.g. IC7610, IC7100), and others.
Release: WSJT-X 2.6.0-rc1
June 20, 2022
----------------------
WSJT-X 2.6.0 Release Candidate 1 introduces support for the ARRL
International Digital Contest; performance enhancements for FT8, Q65,
and EME Echo mode; new controls and options on the GUI; and several
bug fixes.
In program WSJT-X:
- Improved decoding for FT8: additional messages are marked 'a7'
- Improved decoding for Q65 when AP is in use
- Optional new "Active Stations" window and other features
supporting ARRL International Digital Contest
- Accurate SNR measurements in Echo mode, including large Doppler
spreads
- Add mode selection buttons on main window for FT4, FT8, JT65,
MSK144, and Q65
- Add a button to toggle FT8's Hound mode ON or OFF
- Add a "Clr Avg" button for Echo mode
- Add optional highlighting of DX Call and DX Grid
- Add optional highlighting of messages containing RR73 or 73
- New options for writing to ALL.TXT: split the file yearly, monthly,
or disable writing altogether
- Add Russian to available translations of user interface
- Add a 90 s Tune watchdog with optional disable
- Allow auto reply for non-CQ messages via UDP (JTAlert, etc.) when
Hold Tx Freq is enabled
- Suppress transmission of blank messages
- Suppress self-spotting when running multiple instances
- Correct the handling of messages starting with "CQ xxxx ..."
- Correct a flaw that could cause Windows to drop audio samples
- Correct a flaw that could send incorrect frequencies to ALL.TXT
and PSK Reporter after a band change
- Correct the auto-sequencing logic in several specific circumstances
- Correct a flaw in WSPR mode when handling three-character callsigns
- Correct a flaw that could cause OmniRig 1.19 or later to set
incorrect frequencies after initialization
- Clean up some ToolTips
- Fix an inconsistancy in the macOS installation package that caused
the pwr slider to behave incorrectly on macOS 12
In program MAP65 (Windows only):
- Send additional information to file azel.dat
- Allow optional scaling of digital I/Q data
- Suppress a bounds error caused by too-wide setting of display
bandwidth
Release: WSJT-X 2.5.4
Dec 28, 2021
----------------------
This is mostly a bug fix release. It has the following changes since
release 2.5.3:
WSJTX:
- Repair a defect that caused occasional crashes when in QSO with
stations using nonstandard callsigns.
MAP65:
- Allowing MAP65 "Best-fit Delta phi" solution to be displayed to the
user.
Release: WSJT-X 2.5.3
Dec 7, 2021
----------------------
This release has the following changes since release 2.5.2:
- Add a note in memory of G4WJS to the About window
- Add a simple $DXCALL macro capability for Tx messages, and update
the User Guide accordingly
- Ensure that MAIN VFO is used for receiving on rigs that require it
- Repair a defect in reporting low-confidence decodes to PskReporter
- Updated CTY.DAT database, tnx to Jim AD1C
Release: WSJT-X 2.5.2
Nov 4, 2021
@ -60,6 +212,7 @@ release 2.5.1:
providing updates for 32-bit only systems. 32-bit WSJT-X can still
be built for Linux Intel and is supported at least until some
prerequisite package is no longer available.
Release: WSJT-X 2.5.1
Oct 21, 2021
@ -111,6 +264,7 @@ and repairs for defects detected since the 2.5.0 GA release.
- Improved main window layout to ensure TxN messages are fully
visible.
Release: WSJT-X 2.5.0
Sept 27, 2021
@ -141,6 +295,7 @@ WSJTX:
- Ensure that CALL3.TXT is not deleted while updating the file (this
allows sharing using symlinks to work).
Release: WSJT-X 2.5.0-rc6
Sept 6, 2021
-------------------------
@ -161,6 +316,7 @@ WSJT-X:
- Repair a regression that prevented WSPR band-hopping working when
the Tx percentage is zero.
Release: WSJT-X 2.5.0-rc5
Aug 5, 2021
-------------------------
@ -178,6 +334,7 @@ MAP65:
WSJT-X:
- Repair a regression that caused some messages involving compound
or nonstandard callsigns to be encoded as free text
Release: WSJT-X 2.5.0-rc4
Aug 2, 2021
@ -199,6 +356,7 @@ WSJT-X:
- Revised User Guide using FT8 mode for the basic tutorial
- Allow contest and FD operating in Q65 mode
Release: WSJT-X 2.5.0-rc3
Jul 5, 2021
-------------------------
@ -221,6 +379,7 @@ WSJT-X:
messages to not be sent when no other intervening messages are
sent.
Release: WSJT-X 2.5.0-rc2
Jun 28, 2021
-------------------------
@ -261,6 +420,7 @@ WSJT-X (including the decoder for Q65 used by MAP65):
series rigs, and support for the Icom IC-575 rig.
- Updated CTY.DAT database
Release: WSJT-X 2.5.0-rc1
Jun 3, 2021
-------------------------
@ -615,7 +775,6 @@ release candidate.
- Several updates to international UI translations.
Release: WSJT-X 2.3.0-rc2
Nov 16, 2020
-------------------------
@ -1080,6 +1239,7 @@ prior v2.1.0 release.
- Fix a production issue with the macOS tool chain that generated
broken executables.
Release: WSJT-X 2.1
July 15, 2019
-------------------
@ -1149,6 +1309,7 @@ feedback to guide future development.
*Note* this release is not for general public release and we request
that it is not distributed.
Release: WSJT-X 2.1.0-rc1
March 25, 2019
-------------------------
@ -1282,6 +1443,7 @@ Some details of changes since WSJT-X-rc5 include the following:
- Update the WSJT-X User Guide to v2.0 (more to come...)
- Update cty.dat
Release: WSJT-X 2.0-rc5
November 26, 2018
-----------------------
@ -1513,7 +1675,6 @@ Changes from WSJT-X Version 1.9.0-rc2 include the following:
to be CAT controlled by WSJT-X.
Release: WSJT-X Version 1.9.0-rc2
February 26, 2018
---------------------------------
@ -1683,8 +1844,6 @@ message from populating the Tx message boxes.
- Fix an issue with editing IARU regions in the working frequencies table.
Release: WSJT-X Version 1.8.0-rc2
September 2, 2017
---------------------------------

View File

@ -54,7 +54,7 @@ namespace Radio
value *= std::pow (10., scale);
if (ok)
{
if (value < 0. || value > std::numeric_limits<Frequency>::max ())
if (value < 0. || value > static_cast<double>(std::numeric_limits<Frequency>::max ()))
{
value = 0.;
*ok = false;
@ -91,8 +91,8 @@ namespace Radio
value *= std::pow (10., scale);
if (ok)
{
if (value < -std::numeric_limits<Frequency>::max ()
|| value > std::numeric_limits<Frequency>::max ())
if (value < static_cast<double>(std::numeric_limits<Frequency>::min ())
|| value > static_cast<double>(std::numeric_limits<Frequency>::max ()))
{
value = 0.;
*ok = false;

View File

@ -9,7 +9,159 @@
\$$ \$$ \$$$$$$ \$$$$$$ \$$ \$$ \$$
Copyright 2001 - 2021 by Joe Taylor, K1JT.
Copyright 2001 - 2022 by Joe Taylor, K1JT, and the WSJT Development Team
Release: WSJT-X 2.6.0-rc2
July 21, 2022
----------------------
WSJT-X 2.6.0 Release Candidate 2 brings a number of improvements as
well as some bug fixes.
- The "Measure" function in Echo mode now uses the computed Doppler
spread for DX grid, when available. This feature is especially
helpful for microwave EME tests, enabling accurate measurement of
SNR for a DX station.
- Settings for T/R period and Submode are now remembered by mode when
you switch directly between (for example) MSK144-15, Q65-60A,
JT65C, or FST4-120.
- Tx and Rx audio frequencies are remembered and restored when you
return from a mode that sets a default frequency of 1500 Hz
(MSK144, FST4W, Echo, WSPR, FreqCal) and then switching back to
FT4, FT8, Q65, JT65, or FST4.
- QSOs in the Contest Log can now be displayed in increasing or
decreasing order of logged time. By default the log is scrolled to
the latest logged QSO, ready for insertion of a new contact. The
total number of QSOs in the Contest Log is displayed at bottom left
of its window.
- Default FT8 frequency for 4m band (Region 1) is set to 70.154 MHz.
- Layout of mode buttons has been optimized for 4K screens.
- Display of Keyboard Shortcuts has been updated.
- The OK button now has default focus in the LogQSO dialog window.
You may just hit Enter to log the QSO.
- Bug fix: The Tx Freq spinbox remained red when coming back from
some Q65 submodes. Corrected.
- Hamlib bug fixes: make sure that VFOB is selected when required on
some rigs (e.g. IC7610, IC7100), and others.
Release: WSJT-X 2.6.0-rc1
June 20, 2022
----------------------
WSJT-X 2.6.0 Release Candidate 1 introduces support for the ARRL
International Digital Contest; performance enhancements for FT8, Q65,
and EME Echo mode; new controls and options on the GUI; and several
bug fixes.
In program WSJT-X:
- Improved decoding for FT8: additional messages are marked 'a7'
- Improved decoding for Q65 when AP is in use
- Optional new "Active Stations" window and other features
supporting ARRL International Digital Contest
- Accurate SNR measurements in Echo mode, including large Doppler
spreads
- Add mode selection buttons on main window for FT4, FT8, JT65,
MSK144, and Q65
- Add a button to toggle FT8's Hound mode ON or OFF
- Add a "Clr Avg" button for Echo mode
- Add optional highlighting of DX Call and DX Grid
- Add optional highlighting of messages containing RR73 or 73
- New options for writing to ALL.TXT: split the file yearly, monthly,
or disable writing altogether
- Add Russian to available translations of user interface
- Add a 90 s Tune watchdog with optional disable
- Allow auto reply for non-CQ messages via UDP (JTAlert, etc.) when
Hold Tx Freq is enabled
- Suppress transmission of blank messages
- Suppress self-spotting when running multiple instances
- Correct the handling of messages starting with "CQ xxxx ..."
- Correct a flaw that could cause Windows to drop audio samples
- Correct a flaw that could send incorrect frequencies to ALL.TXT
and PSK Reporter after a band change
- Correct the auto-sequencing logic in several specific circumstances
- Correct a flaw in WSPR mode when handling three-character callsigns
- Correct a flaw that could cause OmniRig 1.19 or later to set
incorrect frequencies after initialization
- Clean up some ToolTips
- Fix an inconsistancy in the macOS installation package that caused
the pwr slider to behave incorrectly on macOS 12
In program MAP65 (Windows only):
- Send additional information to file azel.dat
- Allow optional scaling of digital I/Q data
- Suppress a bounds error caused by too-wide setting of display
bandwidth
Release: WSJT-X 2.5.4
Dec 28, 2021
----------------------
This is mostly a bug fix release. It has the following changes since
release 2.5.3:
WSJTX:
- Repair a defect that caused occasional crashes when in QSO with
stations using nonstandard callsigns.
MAP65:
- Allowing MAP65 "Best-fit Delta phi" solution to be displayed to the
user.
Release: WSJT-X 2.5.3
Dec 7, 2021
----------------------
This release has the following changes since release 2.5.2:
- Add a note in memory of G4WJS to the About window
- Add a simple $DXCALL macro capability for Tx messages, and update
the User Guide accordingly
- Ensure that MAIN VFO is used for receiving on rigs that require it
- Repair a defect in reporting low-confidence decodes to PskReporter
- Updated CTY.DAT database, tnx to Jim AD1C
Release: WSJT-X 2.5.2
Nov 4, 2021
@ -60,6 +212,7 @@ release 2.5.1:
providing updates for 32-bit only systems. 32-bit WSJT-X can still
be built for Linux Intel and is supported at least until some
prerequisite package is no longer available.
Release: WSJT-X 2.5.1
Oct 21, 2021
@ -111,6 +264,7 @@ and repairs for defects detected since the 2.5.0 GA release.
- Improved main window layout to ensure TxN messages are fully
visible.
Release: WSJT-X 2.5.0
Sept 27, 2021
@ -141,6 +295,7 @@ WSJTX:
- Ensure that CALL3.TXT is not deleted while updating the file (this
allows sharing using symlinks to work).
Release: WSJT-X 2.5.0-rc6
Sept 6, 2021
-------------------------
@ -160,6 +315,7 @@ WSJT-X:
- Repair an issue when non-ASCII characters used in account names.
- Repair a regression that prevented WSPR band-hopping working when
the Tx percentage is zero.
Release: WSJT-X 2.5.0-rc5
Aug 5, 2021
@ -179,6 +335,7 @@ WSJT-X:
- Repair a regression that caused some messages involving compound
or nonstandard callsigns to be encoded as free text
Release: WSJT-X 2.5.0-rc4
Aug 1, 2021
-------------------------
@ -200,6 +357,7 @@ WSJT-X:
- Revised User Guide using FT8 mode for the basic tutorial
- Allow contest and FD operating in Q65 mode
Release: WSJT-X 2.5.0-rc3
Jul 5, 2021
-------------------------
@ -222,6 +380,7 @@ WSJT-X:
messages to not be sent when no other intervening messages are
sent.
Release: WSJT-X 2.5.0-rc2
Jun 28, 2021
-------------------------
@ -262,6 +421,7 @@ WSJT-X (including the decoder for Q65 used by MAP65):
series rigs, and support for the Icom IC-575 rig.
- Updated CTY.DAT database
Release: WSJT-X 2.5.0-rc1
Jun 3, 2021
-------------------------
@ -616,7 +776,6 @@ release candidate.
- Several updates to international UI translations.
Release: WSJT-X 2.3.0-rc2
Nov 16, 2020
-------------------------
@ -649,7 +808,6 @@ includes some new functionality that missed the RC1 cut off deadline.
choice.
Release: WSJT-X 2.3.0-rc1
Sept 28, 2020
-------------------------
@ -1082,6 +1240,7 @@ prior v2.1.0 release.
- Fix a production issue with the macOS tool chain that generated
broken executables.
Release: WSJT-X 2.1
July 15, 2019
-------------------
@ -1103,6 +1262,7 @@ There are numerous minor enhancements and bug fixes.
We now provide a separate installation package for 64-bit Windows 7
and later, with significant improvements in decoding speed.
Release: WSJT-X 2.1.0-rc7
June 3, 2019
-------------------------
@ -1233,6 +1393,7 @@ feedback to guide future development.
*Note* this release is not for general public release and we request
that it is not distributed.
Release: WSJT-X 2.1.0-rc1
March 25, 2019
-------------------------
@ -1366,6 +1527,7 @@ Some details of changes since WSJT-X-rc5 include the following:
- Update the WSJT-X User Guide to v2.0 (more to come...)
- Update cty.dat
Release: WSJT-X 2.0-rc5
November 26, 2018
-----------------------
@ -1595,7 +1757,6 @@ Changes from WSJT-X Version 1.9.0-rc2 include the following:
to be CAT controlled by WSJT-X.
Release: WSJT-X Version 1.9.0-rc2
February 26, 2018
---------------------------------
@ -1765,8 +1926,6 @@ message from populating the Tx message boxes.
- Fix an issue with editing IARU regions in the working frequencies table.
Release: WSJT-X Version 1.8.0-rc2
September 2, 2017
---------------------------------

View File

@ -882,7 +882,12 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
{
// for the 1st time as a band change may cause a recalled mode to be
// set
m_->error_check (rig_set_freq (m_->rig_.data (), RIG_VFO_CURR, f), tr ("setting frequency"));
vfo_t target_vfo = RIG_VFO_CURR;
if (!(m_->rig_->state.vfo_list & RIG_VFO_B))
{
target_vfo = RIG_VFO_MAIN; // no VFO A/B so force to Rx on MAIN
}
m_->error_check (rig_set_freq (m_->rig_.data (), target_vfo, f), tr ("setting frequency"));
update_rx_frequency (f);
if (m_->mode_query_works_ && UNK != m)
@ -890,13 +895,13 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
rmode_t current_mode;
pbwidth_t current_width;
auto new_mode = m_->map_mode (m);
m_->error_check (rig_get_mode (m_->rig_.data (), RIG_VFO_CURR, &current_mode, &current_width), tr ("getting current VFO mode"));
m_->error_check (rig_get_mode (m_->rig_.data (), target_vfo, &current_mode, &current_width), tr ("getting current VFO mode"));
CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
if (new_mode != current_mode)
{
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
m_->error_check (rig_set_mode (m_->rig_.data (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
// for the 2nd time because a mode change may have caused a
// frequency change
@ -905,7 +910,8 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
// for the second time because some rigs change mode according
// to frequency such as the TS-2000 auto mode setting
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
m_->error_check (rig_set_mode (m_->rig_.data (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
rig_set_mode (m_->rig_.data (), RIG_VFO_B, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting VFOB mode");
}
update_mode (m);
}
@ -1037,16 +1043,22 @@ void HamlibTransceiver::do_mode (MODE mode)
pbwidth_t current_width;
auto new_mode = m_->map_mode (mode);
vfo_t target_vfo = RIG_VFO_CURR;
if (!(m_->rig_->state.vfo_list & RIG_VFO_B))
{
target_vfo = RIG_VFO_MAIN; // no VFO A/B so force to Rx on MAIN
}
// only change when receiving or simplex if direct VFO addressing unavailable
if (!(state ().ptt () && state ().split () && m_->one_VFO_))
{
m_->error_check (rig_get_mode (m_->rig_.data (), RIG_VFO_CURR, &current_mode, &current_width), tr ("getting current VFO mode"));
m_->error_check (rig_get_mode (m_->rig_.data (), target_vfo, &current_mode, &current_width), tr ("getting current VFO mode"));
CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
if (new_mode != current_mode)
{
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_mode));
m_->error_check (rig_set_mode (m_->rig_.data (), RIG_VFO_CURR, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
m_->error_check (rig_set_mode (m_->rig_.data (), target_vfo, new_mode, RIG_PASSBAND_NOCHANGE), tr ("setting current VFO mode"));
}
}

View File

@ -280,17 +280,30 @@ int OmniRigTransceiver::do_start ()
resolution = 2; // 20Hz rounded
}
}
// For OmniRig v1.19 or later we need a delay between GetRxFrequency () and SetFreq (f),
// otherwise rig QRG stays at f+55 Hz. 200 ms should do job for all modern transceivers.
// However, with very slow rigs, QRG may still stay at f+55 Hz. Such rigs should use v1.18.
// Due to the asynchronous nature of Omnirig commands, a better solution would be to implement
// an event handler for OmniRig's OnParamChange event and read the frequency inside that handler.
if (OmniRig::PM_FREQ & writable_params_)
{
rig_->SetFreq (f);
QTimer::singleShot (200, [=] {
rig_->SetFreq (f);
});
}
else if (reversed_ && (OmniRig::PM_FREQB & writable_params_))
{
rig_->SetFreqB (f);
QTimer::singleShot (200, [=] {
rig_->SetFreqB (f);
});
}
else if (!reversed_ && (OmniRig::PM_FREQA & writable_params_))
{
rig_->SetFreqA (f);
QTimer::singleShot (200, [=] {
rig_->SetFreqA (f);
});
}
update_rx_frequency (f);
CAT_TRACE ("started");

1332
cty.dat

File diff suppressed because it is too large Load Diff

View File

@ -62,6 +62,7 @@ set (UG_SRCS
)
set (UG_IMGS
images/active_stations.png
images/AstroData_2.png
images/Astronomical_data.png
images/auto-seq.png

View File

@ -98,6 +98,7 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes.
:win64_openssl: https://slproweb.com/download/Win64OpenSSL_Light-1_1_1L.msi[Win64 OpenSSL Light Package]
:writelog: https://writelog.com/[Writelog]
:wsjtx_group: https://groups.io/g/WSJTX[WSJTX Group]
:wsjtx_group2: https://groups.io/g/WSJTX[join the group]
:wsjtx: https://physics.princeton.edu/pulsar/K1JT/wsjtx.html[WSJT-X]
:wspr0_guide: https://www.physics.princeton.edu/pulsar/K1JT/WSPR0_Instructions.TXT[WSPR0 Guide]
:wspr: https://physics.princeton.edu/pulsar/K1JT/wspr.html[WSPR Home Page]
@ -120,7 +121,8 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes.
:svn: https://subversion.apache.org/packages.html#windows[Subversion]
:win32: https://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win32.exe[wsjtx-{VERSION}-win32.exe]
:win64: https://physics.princeton.edu/pulsar/K1JT/wsjtx-{VERSION}-win64.exe[wsjtx-{VERSION}-win64.exe]
:wsjt-devel: https://lists.sourceforge.net/lists/listinfo/wsjt-devel[here]
:wsjt-devel: https://sourceforge.net/p/wsjt/mailman/wsjt-devel/[join the group]
:wsjt-devel2: https://sourceforge.net/p/wsjt/mailman/wsjt-devel/[subscribe to the list]
:wsjt_repo: https://sourceforge.net/p/wsjt/wsjt_orig/ci/master/tree/[WSJT Source Repository]
:wspr_code: https://physics.princeton.edu/pulsar/K1JT/WSPRcode.exe[WSPRcode.exe]
:wspr_svn: https://sourceforge.net/p/wsjt/wspr/ci/master/tree/[WSPR Source Repository]

View File

@ -1,12 +1,13 @@
// Status=review
The _WSJT_ project was started by *K1JT* in 2001. Since 2005 it has
been an Open Source project, which now includes the programs _WSJT_,
been an Open Source project, and it has included the programs _WSJT_,
_MAP65_, _WSPR_, _WSJT-X_, and _WSPR-X_. *G4WJS* (since 2013), *K9AN*
(since 2015), and *IV3NWV* (since 2016) have made major contributions
to _WSJT-X_. Together with K1JT they now form the core development
team. *G4WJS* and *W9MDB* have made major contributions to _hamlib_,
on which _WSJT-X_ depends for rig control.
(since 2015), *IV3NWV* (since 2016), *KG4IYS* (since 2021), and
*DG2YCB* (since 2021) have made major contributions to _WSJT-X_.
Together with K1JT they now form the core development team. *G4WJS*
and *W9MDB* have made major contributions to the _hamlib_ library, on
which _WSJT-X_ depends for rig control.
All code in the _WSJT_ project is licensed under the GNU Public
License (GPL). Many users of these programs, too numerous to mention

View File

@ -1,8 +1,10 @@
// Status=edited
Controls related to frequency selection, received audio level, the
station being called, and date and time are found in the lower, left-hand section of the
main window:
station being called, and date and time are found in the lower,
left-hand section of the main window. Buttons are provided for making
quick changes among the modes FT8, FT4, MSK144, Q65, and JT65, and
for toggling FT8 Hound mode ON or OFF.
//.Misc Controls Left
image::misc-main-ui.png[align="center",alt="Misc Menu Items"]

View File

@ -1,7 +1,7 @@
// Status=edited
The following controls appear just under the decoded text windows on
the main screen:
the main screen. Some of them are visible only in certain modes.
//.Main UI
image::main-ui-controls.png[align="center",width=650,alt="Main UI Controls"]

View File

@ -37,7 +37,18 @@ examples for configurations `FT8` and `Echo`:
==== View Menu
image::view-menu.png[align="left",alt="View Menu"]
The *SWL Mode* action reduces the _WSJT-X_ main window to a minimum
*Active Stations* displays a window that can help you to work the most
distant stations, in particular for the distance-scored ARRL
International Digital Contest. Controls are provided to set the
maximum length of the list and the maximum "`age`" of decodes in Rx
sequences. You can request display of only ready-to-be-called
stations. For the ARRL International Digital Contest the window
displays scoring rate (points in the most recent hour), total score,
and the number of band changes in the past hour.
image::active_stations.png[align="left",alt="Active Stations"]
*SWL Mode* reduces the _WSJT-X_ main window to a minimum
size with just the menus, decodes windows, and status bar visible. You
may find this useful when running multiple instances of the
application. Both size and location of the main window are saved and

View File

@ -24,7 +24,8 @@ AP bits, with a specified level of confidence. Successful AP decodes
are labeled with an end-of-line indicator of the form `aP`, where `P`
is one of the single-digit AP decoding types listed in Table 1. For
example, `a2` indicates that the successful decode used MyCall as
hypothetically known information.
hypothetically known information. Type `a7`, used only in FT8 mode,
uses information from the previous Rx sequence.
[[FT8_AP_INFO_TABLE]]
.FST4, FT4, and FT8 AP information types
@ -37,6 +38,7 @@ hypothetically known information.
|a4|MyCall DxCall RRR
|a5|MyCall DxCall 73
|a6|MyCall DxCall RR73
|a7|(Call_1 or CQ) Call_2 &#160; &#160; ?
|===
If a codeword is found that is judged to have high (but not

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -26,7 +26,10 @@ The _WSJT-X_ user interface (UI) is now available in many languages.
When a translated UI is available for the computer's default System
Language, it will appear automatically on program startup. The UI
language may be overridden if desired by starting _WSJT-X_ with a
command line option.
command line option. For example, to start _WSJT-X_ with its user
interface in Spanish, enter this command at the prompt: +
`wsjtx --language es`
=== How You Can Contribute

View File

@ -89,3 +89,11 @@ Release candidates should be used _only_ during a short testing
period. They carry an implied obligation to provide feedback to the
program development group. Candidate releases should not be used on
the air after a full release with the same number is made.
A companion program _MAP65_, written by K1JT, is designed for EME
communication using the JT65 and Q65 protocols. When used with RF
hardware providing coherent signal channels for two orthogonal
polarizations, the program provides automatic polarization-matched
reception for every JT65 or Q65 signal in a 90 kHz passband. On the
Windows platform, _MAP65_ is installed automatically along with
_WSJT-X_.

View File

@ -69,9 +69,9 @@ Check *Auto Seq* on the main window to enable this feature:
image::auto-seq.png[align="center",alt="AutoSeq"]
When calling CQ you may also choose to check the box *Call 1st*.
_WSJT-X_ will then respond automatically to the first decoded
responder to your CQ.
When calling CQ you may choose to select *CQ: First* to reply
automatically to the first decoded responder, or *CQ: Max Dist*
to reply to the most distant responder.
NOTE: When *Auto-Seq* is enabled, the program de-activates *Enable Tx*
at the end of each QSO. It is not intended that _WSJT-X_ should make
@ -83,14 +83,14 @@ operator replacement.
The FT4, FT8, and MSK144 protocols support special messages optimized
for *NA VHF* and *EU VHF* contests. FT4 and FT8 also support messages
for *ARRL Field Day*, *ARRL RTTY Roundup*, and the *WW Digi* contest.
for *ARRL Field Day*, *FT Roundup*, and the *WW Digi* contest.
The decoders recognize and decode these messages at any time.
Configure the program to automatically generate the required message
types for contest exchanges and carry out suitable auto-sequencing by
selecting a supported operating activity on the *Settings | Advanced*
tab. Model QSOs then proceed as follows, for each event type:
*NA VHF Contest*
*NA VHF Contest* and *ARRL International Digital Contest*
CQ TEST K1ABC FN42
K1ABC W9XYZ EN37
@ -98,8 +98,9 @@ tab. Model QSOs then proceed as follows, for each event type:
K1ABC W9XYZ RRR
W9XYZ K1ABC 73
Either callsign (or both) may have /R appended. You can use RR73 in
place of RRR, and the final 73 is optional.
Either callsign (or both) may have /R appended to signify a Rover in a
VHF contest. You can use RR73 in place of RRR, and the final 73 is
optional.
*EU VHF Contest*
@ -124,7 +125,7 @@ to upgrade _WSJT-X_ if you will use *EU VHF Contest* messages.
W9XYZ K1ABC R 2B EMA
K1ABC W9XYZ RR73
*ARRL RTTY Roundup*
*FT Roundup*
CQ RU K1ABC FN42
K1ABC W9XYZ 579 WI
@ -144,7 +145,7 @@ station's log and not the supposed QSO partner's. To avoid Not-in-Log
(NIL) penalties for yourself and others, we recommend the following
guidelines for contest logging with FT4, FT8, and MSK144:
- Activate and learn to use the alternate F1-F6 bindings selectable
- Activate and learn to use the *Alternate F1-F6 bindings* selectable
on the *Settings | General* tab.
- Always log a QSO when you have received RRR, RR73, or 73 from a
@ -153,8 +154,9 @@ guidelines for contest logging with FT4, FT8, and MSK144:
- Log a QSO when you send RR73 or 73 if you are reasonably confident
it will be copied. But be sure to watch for any indication that it
was not copied, and then take appropriate action. For example, if
you receive the Tx3 message (R plus contest exchange) again, hit F4
to re-send your RR73.
you receive the Tx3 message (R plus contest exchange) again, and if
you have activated the *Alternate F1-F6 bindings*, hit *F4* to
re-send your RR73.
[[COMP-CALL]]
=== Nonstandard Callsigns

View File

@ -1,29 +1,48 @@
[[NEW_FEATURES]]
=== New in Version {VERSION_MAJOR}.{VERSION_MINOR}
_WSJT-X 2.5_ introduces an enhanced Q65 decoder that measures and
compensates for linear frequency drifts of Q65 signals. Activate this
feature by setting a spinner control *Max Drift* on the _WSJT-X_ main
window to a number greater than 0. We suggest a setting of 10 for
submode Q65-60A, the recommended submode for EME on 50 and 144 MHz,
which will accommodate drift rates up to 20 Hz/minute. Similarly, we
suggest *Max Drift* = 40 for submode Q65-15C, used for for 10 GHz QSOs
(up to 900 km) via aircraft scatter and drift rates up to about 20
Hz/s. When *Max Drift* = 50 the decoder will use an enhanced algorithm
to compensate for larger aircraft scatter drift rates, successful
decodes with this algorithm are tagged with a `q5` indicator.
- _WSJT-X 2.6_ implements new features supporting the ARRL
International Digital Contest and its distance based scoring. The
*Call 1st* checkbox has been replaced by a drop-down control offering
*CQ Max Dist* as an alternative. With this option selected, the
program will select the reply to your CQ that yields the most contest
points. In addition, a new window labeled *Active Stations* displays
a list of received but unworked callsigns, sorted in decreasing order
of potential contest points. Click on a line in this window to call
that station.
- Decoding performance for FT8 and Q65 has been improved in a variety
of situations with available _a priori_ (AP) information.
- *Echo* mode now offers a *Clear Avg* button and produces reliable
measurements of SNR even when Doppler spread is large. The *Measure*
function can be used to measure SNR for a received unmodulated carrier
-- for example, a key-down test signal emitted by another station and
reflected from the Moon.
- New buttons on the main window allow quick changes between modes
FT4, FT8, MSK144, Q65, and JT65. Another new button allows toggling
FT8 Hound mode ON or OFF.
- Optional color highlighting is provided for specified DX Call and DX
Grid, and for messages containing RR73 or 73.
- New options are provided for writing to file ALL.TXT. You can
request automatic starting of a new file every month or every year,
and you can disable writing altogether.
- Settings for T/R period and Submode are remembered by mode when you
switch directly between (for example) MSK144-15, Q65-60A, JT65-C, or
FST4-120.
- Tx and Rx audio frequencies are remembered and restored when you
return from a mode that sets a default frequency 1500 Hz (MSK144,
FST4W, Echo, WSPR, FreqCal), then switching back to FT4, FT8, Q65,
JT65, or FST4.
- Other changes include bug fixes and rig control for some new radios.
- _MAP65 3.0_ (available for Windows only) now sends additional
information to file azel.dat and offers digital scaling of input I/Q
data.
On the Windows platform only, _WSJT-X 2.5_ installations now include
an early version of _MAP65 3.0_. This program works together with
suitable hardware that converts RF to baseband. The hardware/software
combination implements a wideband, highly optimized receiver for the
Q65 and JT65 protocols, with matching transmitting features that
require a standard SSB transceiver. _MAP65_ is effective in both
single-polarization and dual-polarization systems. If two
polarization channels are available, _MAP65_ determines and matches
the linear polarization angle of each decodable signal. This
capability provides a major advantage for efficient EME communication
on bands up to 432 MHz. A single-channel _MAP65_ system works
extremely well for EME on 1296 MHz and higher bands, displaying all
signals in a 90 kHz sub-band and decoding all the Q65 and JT65
signals.

View File

@ -38,15 +38,14 @@ with twice or four times the normal tone spacing. This feature is
intended for use with specialized LF/MF transmitters that divide
generated frequencies by 2 or 4 as part of the transmission process.
_Special Operating Activity: Generation of FT4, FT8, and MSK144
messages_
_Special Operating Activity_
- Check this box and select the type of activity to enable
auto-generation of special message formats for contesting and
DXpeditions. For *ARRL Field Day*, enter your operating Class and
ARRL/RAC section; for *ARRL RTTY Roundup*, enter your state or province.
ARRL/RAC section; for *FT Roundup*, enter your state or province.
Use “DX” for section or state if you are not in the US or Canada. In
the RTTY Roundup, Stations in Alaska and Hawaii should enter “DX”.
the FT Roundup, Stations in Alaska and Hawaii should enter “DX”.
- Check *Fox* if you are a DXpedition station operating in FT8
DXpedition Mode. Check *Hound* if you wish to make QSOs with such a

View File

@ -7,8 +7,11 @@ messages such as the examples shown below.
image::tx-macros.png[align="center",alt="Tx Macros Screen"]
- To add a new message to the list, enter the desired text (up to 13
characters) in the entry field at top, then click *Add*.
- To add a new message to the list, enter the desired text in the
entry field at top, then click *Add*.
- Remember that a transmitted free-text message is limited to 13
characters, including blanks.
- To remove an unwanted message, click on the message and then on
*Delete*.
@ -18,3 +21,7 @@ new order will be preserved when _WSJT-X_ is restarted.
- Messages can also be added from the main window's *Tx5*
field. Simply hit [Enter] after the message has been entered.
- If the first word of a message is $DXCALL (or the shortened form
$DX), that word will be replaced on transmission by the base callsign
in the *DxCall* field.

View File

@ -4,8 +4,8 @@ The best source of help in setting up your station or configuring
_WSJT-X_ is the {wsjtx_group} at email address
wsjtx@groups.io. The chances are good that someone with
similar interests and equipment has already solved your problem and
will be happy to help. To post messages here you will need to join
the group.
will be happy to help. To post messages here you will need to
{wsjt-devel}.
=== Bug Reports
@ -13,8 +13,7 @@ One of your responsibilities as a _WSJT-X_ user is to help the
volunteer programmers to make the program better. Bugs may be
reported to the WSJTX forum on Groups.io {wsjtgroup_mail} or the WSJT
Developers list (wsjt-devel@lists.sourceforge.net). Again, you will
need to join the group or subscribe to the list. You can register for
the list {wsjt-devel}.
need to {wsjtx_group2} or {wsjt-devel2}.
To be useful, bug reports should include at least the following
information:

View File

@ -19,7 +19,7 @@ frequency limit is approximately 3300 Hz.
+...\save\samples\FT4\200514_182053.wav+. The waterfall and Band
Activity window should look something like the following screen shots.
This sample file was recorded during a practice contest test session, so
most of the decoded messages use the *RTTY Roundup* message formats.
most of the decoded messages use the *FT Roundup* message formats.
[[X16]]
image::ft4_waterfall.png[align="left",alt="Wide Graph Decode FT4"]
@ -56,7 +56,7 @@ and treat it as if you had double-clicked on that line of decoded
text. Here "best potential QSO partner" means "New Multiplier" (1st
priority) or "New Call on Band" (2nd priority). "New Multiplier" is
currently interpreted to mean "New DXCC"; a more broadly defined
multiplier category (for the ARRL RTTY Roundup rules) will be
multiplier category (for the FT Roundup rules) will be
implemented in due course. We may provide additional priority
rankings, for example “New Grid on Band” (useful for North American
VHF contests), sorting by signal strength, etc.
@ -66,7 +66,7 @@ supposed to mean. This is done by configuring suitable options on the
*Settings | Colors* tab. Selection and ordering of color-highlighting
options determines what potential QSO partners will be chosen by the
"Best S+P" feature. Optimum choices will be different for different
contests. In a contest using RTTY Roundup rules we recommend
contests. In a contest using FT Roundup rules we recommend
activating *My Call in message*, *New DXCC*, *New Call on Band*, *CQ
in message* and *Transmitted message*, reading from top to bottom.

569
g4wjs.txt Normal file
View File

@ -0,0 +1,569 @@
Joe Taylor, K1JT:
I am very sorry to convey the sad news that Bill Somerville,
G4WJS, died suddenly and unexpectedly a few days ago. He was only
about 65 years old.
Bill was a dear friend and very close colleague, though (as is often
the case with worldwide ham radio friendships) we had met in person
only a few times. In 2013 he was the first to join me in forming a
core development group for WSJT-X, which at that time was at program
version 0.99. Bill has been closely involved with WSJT-X and related
software projects ever since.
Our free, open-source software could not have achieved its extensive
worldwide popularity and influence in ham radio without Bill's
essential contributions. In addition to writing code for important
portions of the Qt-based user interface for WSJT-X, Bill helped to
bring the overall program structure more nearly up to professional
standards. Moreover, he devoted countless hours to program support,
patiently answering user's questions on WSJT-related forums.
I have only started to think about the many ways in which I will miss
Bill -- not no mention how we all will miss his immense and positive
impact on WSJT-X and related projects. For more than eight years Bill
and I communicated closely and regularly on ham radio topics,
sometimes many times per day. Perhaps I will be able to write more
about it in the near future.
Rest in peace, dear friend G4WJS.
Stan Gammons, KM4HQE:
So sad to hear that Joe. Bill will be greatly missed.
Prayers for his family and friends.
Rest in peace Bill
Colin Haig, VE3MSC:
Joe, this is truly sad news. Bill has been a wonderful resource and
supported all of us. Please pass condolences to his family.
PA3GCU:
May he rest in peace.
Philip Hazelton, G8PJH
This is shocking news, he was such talent, he will be sorely missed,
condolences to his family.
Philip Rose, GM3ZZA
You have provided an excellent service to the WSJT-X community. I
think your last post was a couple of days ago. We will all miss you,
and your incisive resolution of all our problems.
Requiescat in pace.
Dave, AA6YQ:
A huge loss for all of us. Bill always took the time to provide a
friendly, accurate, and helpful answer to any question that came his
way. He set one good example after another.
Reino Talarmo, OH3MA:
RIP Bill, We will miss your kind advice.
Tom V. Segalstad, LA4LN:
The silent key of Bill is very sad news.
Bill has been extremely helpful for radio amateurs to make WSJT-X fit
their different radios and computers. We have seen E-mail answers from
him coming at all times during borh day and night. And we wonder if he
ever got time to sleep or eat, in-between his good answers and advices
to radio amateurs world wide.
So rest in peace Bill, and thank you very much for all the help you
have provided to radio amateurs world wide, for making their digital
radio amateur activity very successful.
John, VE7KKQ:
So long, Bill, condolences to his family.
Tom, M0LTE:
Unreal. Deeply shocking.
Heartfelt condolences from us all at the Reading club, where Bill was
a member.
Борис Романов (Boris Romanov), UX8IW:
Sad news. Condolences to Bill's family and friends.
Ken Cox, WA8OMR:
Sorry to hear about Bill's passing. I will miss reading his answers to
the many questions posted. I have learned a lot from them.Ken WA8OMR.
Gary Trock:
Very Sad.
Ive been reading his posts since I joined.
RIP.
Dave Sellars, KB4JB:
Very sad news indeed. Amateur Radio worldwide has lost a tremendous
ham and friend. His contributions to WSJT-X and this group will never
be forgotten.
Lynn Mears, K0CLM:
Extremely sad news. I havent been involved with WSJT that long, but
it was obvious that Bill donated a lot of time and effort towards WSJT
and helping in many different ways. He will be missed greatly.
Peter, M0PWX:
Sad news indeed, Bill was a great resource and font of so much
knowledge, as well as having the patience of a saint when dealing with
some members / questions
Will be greatly missed on here
Russ Ravella:
Incredibly sad news. What a wonderful, valuable and kind man Bill
was. How much better the world would be with more Bills in it.
Thank you and Rest In Peace Bill Somerville.
Sam Birnbaum, W2JDB:
So very sorry to hear this sad news. Bill has been very extremely
helpful to me in providing the information that allowed me to provide
a complimentary program for WSJT-X so that visually impaired/blind
hams can also partake in this fantastic program and its modes.
Rest In Peace Bill, you will be sorely missed by all.
Jack Trampler, N2JT
I never worked Bill. Did he even have time to operate? I never met
Bill. But I would have liked to. I never sent him an email, either
personal or on this group. I wish I had.
I enjoyed my daily (actually several times a day) reading of the
messages posted in this group and his replies. I learned a lot from
them. This man had so much knowledge and the fact that he took the
time to deal with almost every post in this group and share that
knowledge, its truly a testament to this man. I for one will surely
miss him.
I wish I knew him better. Rest in Peace, Bill.
Pete Smith, N4ZR:
Terrible news. Though I'm not a great devotee of the digital modes
(except CW), without Bill I'm convinced I would not have made a single
QSO using WSJT-X. My sympathy to his family and friends.
Neil Zampella, KN3ILZ:
I agree. Bill was patient with everyone, even me when I replied to a
post and chewed my foot up to the ankle.
His passing will affect much done within WSJT-X, as well as Hamlib.
He was a font of knowledge and 'corporate' memory.
We may not see his like again.
Jim Brown, K9YC:
If Bill had done nothing more than provide what seemed like 24/7
support here, his contribution would have been monumental. Thanks
Bill, RIP.
Jeff, K3JRZ:
Wow. Very sad to hear.
I had sent many emails to him looking for help with WSJT-X when I
first started having my first issues with it when I started with the
software and then again after several macOS updates. Always a great
guy to get help from. He will surely be missed. My condolences to his
family and to all that knew him.
Lance Collister, W7GJ:
Our heart-felt condolences to you, Joe, and to all the folks like me
whom he so patiently helped over the years. He was an amazing member
of the WSJT-X team, and I found myself always amazed at how in the
world he was able to answer all the questions posed to him by users of
WSJT-X on such a myriad of different rigs with different software. His
contributions will be long remembered, and very much appreciated. So
sad to see someone go who gave so much so freely to our
community. RIP, Bill.
Klaus Werner, G7RTI:
Thanks to Bills helpful explanations I was able to get going on
WSJTX.
I didnt know him or anything about him except what has been written
in previous comments.
May he rest in peace.
Wayne Rash, N4HCR:
This is so sad. Bill always showed great patience with my dumb
questions. He played a big role in making WSJTX a joy to use. Ham
radio owes him a huge debt.
Rest In Peace, Bill.
Dave:
Very sad to hear. He will live in our memories and our operating.
Ed Radlo, AJ6V:
Bill always answered the various online queries vey quickly, and his
vast knowledge helped many of us get on track with all of these new
digital modes.
A great loss to ham radio.
Bob Bownes: (?)
Very sad to hear. May his memory be a blessing to his family and all
who knew him.
In the Law Enforcement, Fire and Emergency Medical Services, the
passing on of one such is often marked with a 'Last Call' or 'Final
Dispatch' in which the departed's call sign is requested thrice for
one last time. Usually at a pre-arranged or significant time. Seems
appropriate in this case as well. Perhaps you could do that for us
Joe.
Rick, I2BRT:
Very sad news and a great loss for our cumunity. Thanks for all the
effort and friendship Bill. Rest in peace.
Andy, GD0TEP:
I never worked Bill. Did he even have time to operate?
Yes, I worked him on 15m in August just gone, and on 6m back in
May. Both on FT8 of course.
Gwen, KI5PXQ:
I also worked him, 1600Z on the 24th of October, 15 meters, FT8.
Ria, N2RJ:
This is truly awful news. Bill will certainly be missed.
Walter, OE6IWG:
VY sad News :-(
Bill was a GREAT helper - also for me. My condolences to his family
and friends.
Ed Wilson, K0KC:
This is a tremendous loss to the amateur radio community, but as
someone who lost his brother only a few weeks ago, I know that the
loss is much greater to his family and close friends...my condolences
to each of them. RIP, Bill...
Amos Sobel, 4X4MF:
Me and the WSJT-X community mourn the departure of Bill Somerville
Bob, K4RCG:
I deeply regret not sending Bill a "personal thank you" e-mail for his
support of our hobby. I had planned on doing so, but didn't want to
add traffic to his in-box admin! He will be missed, but fondly
remembered.
Hamish, G0GLG:
Very sad day for amateur radio.
Paul Welford, G4YKQ:
A Tribute to my dearest friend Bill Somerville G4WJS.
I apologize for length of this post. This might answer a few previous
posts Knowing Bill he will be still reading all these posts from a
better place.
I thank you for your speedy post Joe.
Bill G4WJS was one of my dearest friends living just 4 miles apart.We
spoke 2/3 times a week and at times several times a day.
After a 20 year plus break Bill spurred me on to come back into the
radio family. I OWE HIM A LOT. Thanks to him my major interest in the
last 10 years has been WSJT-X. Bill also had a passion for Photography
and me being a Photographer for The Sun Newspaper In London before I
retired had another common interest we liked to have a good natter but
I often came off the worst.Bill lived on his own so we kept a close
eye on each other.
Bill had a degree in Chemistry but as I understand was self taught in
computing and electronics.Please see his QRZ page.
He was a whizz. He was a great natural teacher and Joe I think this was
one of the reasons he got on so well with you and the group.He
remarked to me many times "I never mind helping anyone provided they
help themselves" At times glaring at me muttering under his breath
"Read the notes and the posts" Sometimes it so annoyed him when I
could not keep a straight face..we all know the story.Bill always
willing to help with a computer grafted to his hand. Over the last
ten years he has like others in the group spent hours and hours
involved with WSJX-X.He had a great admiration for open source
programs.Made many friends within the digital community and a big
respect for Dxlabs {Dave] JTalert [Laurie] among others. I was always
giving him praise for taking a break and TXing winding up this 4 ele
,of late not often[Bill head in PC} every day I would have a crafty
check on his PSK. Bill was very much in favour of Using L.O.T.W but
never collected awards,but on receiving a trophy for technical
achievement announced at Dayton when he told me there was no emotion
but I knew Bill just to well he was chuffed !
Sadly last Friday after never responding to my calls I found Bill
seated in his shack at peace surrounded by the things he loved most.
I am still total shock!!!
Such a loss of a talented and loyal friend and as I have said he shall
be greatly missed by many in our radio family.
R.I.P.William [Bill ] G4WJS.
God Bless you and till we meet again 73.................. Cheers mate!
Ronnie Hull:
I am greatly saddened to hear this news.
Keith Wood, W4RPE:
Great tribute to a wonderful man.
Carlos, OE3JAG:
May I also do my sadly condolences to his family and his friends ! He
will surely be missed by all the hams. Thanks for got in touch with
you, dear Bill.
Good luck in your new place, Bill, I miss you,
William Hensley, WG8S:
A great tribute, Paul! I'm sorry you were the one to find him, yet I
sense you would both want it that way. I did not know Bill, but he
made a tremendous contribution to the WSJT-X community. He will be
missed.
RIP, Bill. Thank you, Paul.
Bernd, KB7AK:
Thank you for your tribute Paul, we will all miss Bill dearly.
Philip Rose, GM3ZZA:
As far as I can see we as amateurs who have been helped by Bill,
should keep up his good work. I know I cant alone.
His advice was definitive. Others not so.
Jim Brown, K9YC:
Thanks very much, Paul, for this lovely and loving post. As you and
Joe have so eloquently written, Bill exemplified the best of the ham
spirit, by giving and sharing far more than he received.
Erik, VA7QI:
Very sorry to hear about Bill. I enjoyed reading his comments and
very much appreciate his contribution for WSTJ-X.
His name and callsign will be remembered for a long time as a shining
light of the ham radio community.
73 de va7qi, ....Erik.
Marco, PY1ZRJ:
My God! Whats terrible news is this!
Bill helped me in many occasions with WSJT-X always with a very pure
"ham-spirit" and availability.
My very sincere condolence to all his family and friends, I will miss
him a lot despite I never had the pleasure to meet him.
Martin Davies, G0HDB:
That is truly unwelcome and most distressing news, Joe; I'm sure the
vast amounts of time and effort that Bill devoted to the development
and support of WSJT-X will be very sorely missed by everyone in the
community, whether or not they had ever had any direct dealings with
Bill.
Please convey all our sympathies and our deepest condolences to Bill's
relatives and friends.
John Nelson, G4KLA:
I am saddened to learn of your news. This is blow to the WSJT-X
community.
In the early days of Bills involvement with WSJT he often logged into
my Macs at home to test his software modifications on a Mac until he
got a VM working. He and I had numerous discussions while testing new
versions on various Mac OS. He was generous with his time in helping
folks with problems either running the codes or attempting to build
the software on various platforms. The multitude of emails to the
development list is a tribute to his commitment to ensure that the
various programs operated flawlessly.
His involvement with the development of WSJT-X code especially with
modernising the structure of the whole program has been immense. I
will certainly miss his advice.
A sad day…
Alan, G0TLK:
Shocking and saddening news, he will be greatly missed.
My condolences to his family and friends, and RIP Bill.
Robin, G8DQX:
I only knew Bill through his contributions to the WSJT lists. Those
contributions were sharp, radical, and usually encouraging. He was a
clearly essential part of a team that is helping Amateur Radio to
grow, expand and develop, far beyond what you and I knew when,
soldering iron in hand, we first played with radio, all those years
ago.
My condolences to his family and friends. We shall all miss him.
Robin, G8DQX
Charlie Suckling, G3WDG/DL3WDG:
We were also shocked and very sorry to hear of Bill's sudden
passing. I never had the pleasure of meeting him in person. Like Bob,
he attended the same University and read the same degree.
We are so grateful for his contributions over many years to
WSJT-X. His support for users was first class, and he even joined the
EME reflectors to give support to EME users during the roll-out of
Q65, despite not being active himself on EME. He was contributing
there regularly, and some of his last efforts were to support the use
of WSJT-X for Doppler control on CW on the microwave bands.
He was also a very patient and diligent teacher, tutoring and helping
those who wished to make small contributions to the project. I am very
grateful for the time he spent in such ways.
Bill will surely be greatly missed, and sincere condolences to his
family and many friends.
RIP Bill.
James Shaver, N2ADV:
I had the pleasure of talking to Bill over Skype a few times during
the development of 1.7 and later 1.8 to chase down some CAT control
gremlins with several radios I happen to own. His patience and
intelligence was incredible. Such a huge loss to us all.
My sincerest condolences to his family and friends.
He will definitely be missed but his contributions to the advancement
of amateur radio will live on indefinitely.
Alessandro Gorobey, IK2
Very sad news and a great loss.
A great teacher.
My sincerest condolences to his family and friends.
Jim Preston, N6VH:
This is definitely very sad news. Bill was a very important part of
the WSJT team. He will be missed very much.
My condolences to his family.
Gary Lane, VK4OO
Very sad news, my condolences to Bills friends and family….
Bob Atkins, KA1GT:
I was shocked and saddened by the news of Bill's passing. We chatted
on line quite often though we never met in person. He attended the
same university as I didn't, reading the same subjects, but was a hear
of two behind me, so we never met their either. Bill will be greatly
missed and I send my condolences to his friends and family.
RIP Bill.
Dave Schmocker, KJ9I:
This is incredibly sad news. Bill was always so helpful, highly
responsive, and on-target with deep technical solutions.
What a wonderful asset Bill was to the hobby and to all with whom he
interfaced.
Jim, WB4CGS:
I am very sorry for this loss.
Conrad Farlow, Jim WB4GCS
Joe I am absolutely lost for words. What a terrible shock. I cannot
imagine him not being there. My condolences to you, Bill's family and
well the whole dev team. We will all miss him Most of all I am sorry
that you lost such a good friend.
Sam Jewell, G4DDK:
So sad to hear this news. One of the team who have revolutionised ham
radio operation, popularised digital and helped realise what we
thought should be possible.
Vale Bill.
Nick, NN3Y:
R I. P. Bill. He'll be missed. My sincere condolences to his family
and friends.
Jay, KA9CFD:
Shocking and very sorry news. RIP Bill.
Mirek, OK2AQ:
Very sad news for us WSJT-X users. R.I.P. Bill
OH6KTL, Lasse:
ge and sad to hear about Bill

View File

@ -8,6 +8,7 @@ module packjt77
character (len=13), dimension(1:MAXRECENT) :: recent_calls=''
character (len=13) :: mycall13=''
character (len=13) :: dxcall13=''
character (len=6) :: dxbase=''
integer, dimension(1:MAXHASH) :: ihash22=-1
integer :: nzhash=0
integer n28a,n28b
@ -124,6 +125,11 @@ subroutine pack77(msg0,i3,n3,c77)
integer ntel(3)
msg=msg0
if(msg(1:3).eq.'$DX') then
i1=index(msg,' ')
msg=trim(dxbase)//' '//msg(i1+1:)
endif
i3_hint=i3
n3_hint=n3
i3=-1
@ -824,7 +830,9 @@ subroutine split77(msg,nwords,nw,w)
iz=j !Message length
nwords=k !Number of words in msg
if(nwords.le.0) go to 900
nw(k)=len(trim(w(k)))
do i=1,nwords
nw(i)=len(trim(w(i)))
enddo
msg(iz+1:)=' '
if(nwords.lt.3) go to 900
call chkcall(w(3),bcall_1,ok1)
@ -833,7 +841,7 @@ subroutine split77(msg,nwords,nw,w)
w(2:12)=w(3:13) !Move all remaining words down by one
nwords=nwords-1
endif
900 return
end subroutine split77

View File

@ -11,6 +11,7 @@ subroutine astro0(nyear,month,nday,uth8,freq8,mygrid,hisgrid, &
real*8 uth8,techo8,freq8
real*8 xl,b
common/librcom/xl(2),b(2)
common/echocom2/fspread_self,fspread_dx
data uth8z/0.d0/
save
@ -44,6 +45,9 @@ subroutine astro0(nyear,month,nday,uth8,freq8,mygrid,hisgrid, &
width1=0.5*6741*fghz*rate1
rate2=sqrt((dldt1+dldt2)**2 + (dbdt1+dbdt2)**2)
width2=0.5*6741*fghz*rate2
if(hisgrid(1:4).eq.' ') width2=width1 !No hisgrid, use self width
fspread_self=width1 !Save for avecho()
fspread_dx=width2 !Save for avecho()
AzSun8=AzSun
ElSun8=ElSun

View File

@ -54,6 +54,12 @@ contains
width1,width2,xlst8,techo8)
if (len_trim(AzElFileName) .eq. 0) go to 999
if(len(trim(hisgrid)).eq.0) then !If DX grid is blank, set these to zero:
AzMoonB8=0
ElMoonB8=0
ndop=0
width2=0
endif
imin=60*uth8
isec=3600*uth8
ih=uth8

View File

@ -1,4 +1,5 @@
subroutine avecho(id2,ndop,nfrit,nqual,f1,xlevel,sigdb,snr,dfreq,width)
subroutine avecho(id2,ndop,nfrit,nauto,nqual,f1,xlevel,snrdb,db_err, &
dfreq,width)
integer TXLENGTH
parameter (TXLENGTH=27648) !27*1024
@ -13,11 +14,23 @@ subroutine avecho(id2,ndop,nfrit,nqual,f1,xlevel,sigdb,snr,dfreq,width)
real s(8192)
real x(NFFT)
integer ipkv(1)
logical ex
complex c(0:NH)
equivalence (x,c),(ipk,ipkv)
common/echocom/nclearave,nsum,blue(NZ),red(NZ)
common/echocom2/fspread_self,fspread_dx
save dop0,sa,sb
fspread=fspread_dx !### Use the predicted Doppler spread ###
if(nauto.eq.1) fspread=fspread_self
inquire(file='fspread.txt',exist=ex)
if(ex) then
open(39,file='fspread.txt',status='old')
read(39,*) fspread
close(39)
endif
fspread=min(max(0.1,fspread),700.0)
width=fspread
dop=ndop
sq=0.
do i=1,TXLENGTH
@ -48,69 +61,28 @@ subroutine avecho(id2,ndop,nfrit,nqual,f1,xlevel,sigdb,snr,dfreq,width)
if(ia.gt.7590 .or. ib.gt.7590) go to 900
nsum=nsum+1
do i=1,NZ
sa(i)=sa(i) + s(ia+i-2048) !Center at initial doppler freq
sb(i)=sb(i) + s(ib+i-2048) !Center at expected echo freq
enddo
call pctile(sb,200,50,r0)
call pctile(sb(1800),200,50,r1)
sum=0.
sq=0.
do i=1,NZ
y=r0 + (r1-r0)*(i-100.0)/1800.0
blue(i)=sa(i)/y
red(i)=sb(i)/y
if(i.le.500 .or. i.ge.3597) then
sum=sum+red(i)
sq=sq + (red(i)-1.0)**2
endif
enddo
ave=sum/1000.0
rms=sqrt(sq/1000.0)
redmax=maxval(red)
ipkv=maxloc(red)
fac=10.0/max(redmax,10.0)
dfreq=(ipk-2048)*df
snr=(redmax-ave)/rms
sigdb=-99.0
if(ave.gt.0.0) sigdb=10.0*log10(redmax/ave - 1.0) - 35.7
nqual=0
if(nsum.ge.2 .and. nsum.lt.4) nqual=(snr-4)/5
if(nsum.ge.4 .and. nsum.lt.8) nqual=(snr-3)/4
if(nsum.ge.8 .and. nsum.lt.12) nqual=(snr-3)/3
if(nsum.ge.12) nqual=(snr-2.5)/2.5
if(nqual.lt.0) nqual=0
call echo_snr(sa,sb,fspread,blue,red,snrdb,db_err,dfreq,snr_detect)
nqual=snr_detect-2
if(nqual.lt.0) nqual=0
if(nqual.gt.10) nqual=10
! Scale for plotting
redmax=maxval(red)
fac=10.0/max(redmax,10.0)
blue=fac*blue
red=fac*red
sum=0.
do i=ipk,ipk+300
if(i.gt.NZ) exit
if(red(i).lt.1.0) exit
sum=sum+(red(i)-1.0)
enddo
do i=ipk-1,ipk-300,-1
if(i.lt.1) exit
if(red(i).lt.1.0) exit
sum=sum+(red(i)-1.0)
enddo
bins=sum/(red(ipk)-1.0)
width=df*bins
nsmo=max(0.0,0.25*bins)
nsmo=max(0.0,0.25*width/df)
do i=1,nsmo
call smo121(red,NZ)
call smo121(blue,NZ)
enddo
! write(*,3001) snrdb,db_err,dfreq,snr_detect,redmax,nqual,nsmo,nclearave,nsum
!3001 format('A',5f10.1,4i4)
900 return
end subroutine avecho

View File

@ -7,7 +7,7 @@ subroutine averms(x,n,nskip,ave,rms)
sq=0.
ipk=maxloc(x)
do i=1,n
if(abs(i-ipk(1)).gt.nskip) then
if((nskip.lt.0) .or. (abs(i-ipk(1)).gt.nskip)) then
s=s + x(i)
sq=sq + x(i)**2
ns=ns+1

View File

@ -34,7 +34,9 @@ subroutine chkcall(w,bc,cok)
! One of first two characters (c1 or c2) must be a letter
if((.not.isletter(bc(1:1))) .and. (.not.isletter(bc(2:2)))) go to 100
if(bc(1:1).eq.'Q') go to 100 !Calls don't start with Q
! Real calls don't start with Q, but we'll allow the placeholder
! callsign QU1RK to be considered a standard call:
if(bc(1:1).eq.'Q' .and. bc(1:5).ne.'QU1RK') go to 100
! Must have a digit in 2nd or 3rd position
i1=0

51
lib/echo_snr.f90 Normal file
View File

@ -0,0 +1,51 @@
subroutine echo_snr(sa,sb,fspread,blue,red,snrdb,db_err,fpeak,snr_detect)
parameter (NZ=4096)
real sa(NZ)
real sb(NZ)
real blue(NZ)
real red(NZ)
integer ipkv(1)
equivalence (ipk,ipkv)
df=12000.0/32768.0
wh=0.5*fspread+10.0
i1=nint((1500.0 - 2.0*wh)/df) - 2048
i2=nint((1500.0 - wh)/df) - 2048
i3=nint((1500.0 + wh)/df) - 2048
i4=nint((1500.0 + 2.0*wh)/df) - 2048
! call pctile(sb(i1),i2-i1,50,r0)
! call pctile(sb(i3+1),i4-i3,50,r1)
! ave=0.5*(r0+r1)
! blue=sa/ave
! red=sb/ave
baseline=(sum(sb(i1:i2-1)) + sum(sb(i3+1:i4)))/(i2+i4-i1-i3)
blue=sa/baseline
red=sb/baseline
psig=sum(red(i2:i3)-1.0)
pnoise_2500 = 2500.0/df
snrdb=db(psig/pnoise_2500)
smax=0.
mh=max(1,nint(0.2*fspread/df))
do i=i2,i3
ssum=sum(red(i-mh:i+mh))
if(ssum.gt.smax) then
smax=ssum
ipk=i
endif
enddo
fpeak=ipk*df - 750.0
call averms(red(i1:i2-1),i2-i1,-1,ave1,rms1)
call averms(red(i3+1:i4),i4-i3,-1,ave2,rms2)
perr=0.707*(rms1+rms2)*sqrt(float(i2-i1+i4-i3))
snr_detect=psig/perr
db_err=99.0
if(psig.gt.perr) db_err=snrdb - db((psig-perr)/pnoise_2500)
if(db_err.lt.0.5) db_err=0.5
return
end subroutine echo_snr

161
lib/ft8/chkdec.f90 Normal file
View File

@ -0,0 +1,161 @@
program chkdec
parameter(NMAX=100)
character*88 line
character*37 msg(NMAX),msg0,msg1
character*2 c2(NMAX)
character*1 c1(NMAX)
character*1 only
integer nsnr(NMAX,0:1),nf(NMAX,0:1)
real dt(NMAX,0:1)
logical found,eof
! These files are sorted by freq within each Rx sequence
open(10,file='all.wsjtx',status='old')
open(11,file='all.jtdx',status='old')
write(20,1030)
1030 format(' iseq B w j W W+ J E B w j W', &
' W+ J E'/80('-'))
nutc0=-1
nbt=0 !Both
nwt=0 !WSJT-X only
njt=0 !JTDX only
net=0 !Either
n7t=0 !a7
eof=.false.
do iseq=1,9999
j=0
msg=' '
nsnr=-99
nf=-99
dt=-99
c1=' '
c2=' '
do i=1,NMAX
read(10,'(a88)',end=8) line !Read from the WSJT-X file
if(line(25:30).ne.'Rx FT8') cycle !Ignore any line not an FT8 decode
read(line(8:13),*) nutc
if(nutc0.lt.0) nutc0=nutc !First time only
if(nutc.ne.nutc0) then
backspace(10)
go to 10 !Finished WSJT-X for this sequence
endif
j=j+1
if(j.eq.1) then
nf(j,0)=-1
j=j+1
endif
read(line,1001) nsnr(j,0),dt(j,0),nf(j,0),msg(j),c2(j)
1001 format(30x,i7,f5.1,i5,1x,a36,2x,a2)
! if(nutc.eq.180215 .and. c2(j).eq.'a7') print*,'aaa',j,nf(j,0),c2(j)
nutc0=nutc
enddo ! i
8 eof=.true.
10 jz=j
do i=1,NMAX
read(11,'(a88)',end=20) line !Read from the JTDX file
if(line(31:31).ne.'~') cycle !Ignore any line not an FT8 decode
read(line(10:15),*) nutc
if(nutc.ne.nutc0) then
backspace(11)
go to 20 !Finished JTDX for this sequence
endif
msg1=line(33:58)
read(line(25:29),*) nf1
found=.false.
do j=1,jz
if(msg(j).eq.msg1) then
read(line,1002) nsnr(j,1),dt(j,1),nf(j,1),c1(j)
1002 format(15x,i4,f5.1,i5,29x,a1)
found=.true.
exit
endif
i1=index(msg(j),'<')
if(i1.gt.0) then
i2=index(msg(j),'>')
msg0=msg(j)(1:i1-1)//msg(j)(i1+1:i2-1)//msg(j)(i2+1:)
if(msg0.eq.msg1) then
read(line,1002) nsnr(j,1),dt(j,1),nf(j,1),c1(j)
found=.true.
exit
endif
endif
enddo ! j
if(.not.found) then !Insert this one as a new message
do j=1,jz
if(nf1.ge.nf(j,0) .and. nf1.lt.nf(j+1,0)) then
jj=j+1
exit
endif
enddo
do j=jz+1,jj+1,-1
nsnr(j,0)=nsnr(j-1,0)
dt(j,0)=dt(j-1,0)
nf(j,0)=nf(j-1,0)
msg(j)=msg(j-1)
c1(j)=c1(j-1)
c2(j)=c2(j-1)
enddo ! j
read(line,1004) nsnr(jj,1),dt(jj,1),nf(jj,1),msg(jj),c1(jj)
1004 format(15x,i4,f5.1,i5,3x,a26,a1)
c2(jj)=' '
nsnr(jj,0)=-99
dt(jj,0)=-99.0
nf(jj,0)=-99
jz=jz+1
endif
enddo ! i
20 nb=0
nw=0
nj=0
ne=0
n7=0
do j=2,jz
write(line,1020) nutc0,j,nsnr(j,:),dt(j,:),nf(j,:),msg(j)(1:26), &
c2(j),c1(j)
1020 format(i6.6,i3,1x,2i4,1x,2f6.1,1x,2i5,1x,a26,1x,a2,1x,a1)
if(c2(j).eq.'a7') n7=n7+1
only=' '
if(line(12:14).eq.'-99') then
line(12:14)=' '
only='j'
nj=nj+1
! if(c2(j).eq.'a7') print*,'aaa ',trim(line)
endif
if(line(16:18).eq.'-99') then
line(16:18)=' '
only='w'
nw=nw+1
endif
if(line(12:14).ne.' ' .or. line(16:19).ne.' ') ne=ne+1
if(line(12:14).ne.' ' .and. line(16:19).ne.' ') nb=nb+1
if(line(21:25).eq.'-99.0') line(21:25)=' '
if(line(27:31).eq.'-99.0') line(27:31)=' '
if(line(35:37).eq.'-99') line(35:37)=' '
if(line(40:42).eq.'-99') line(40:42)=' '
! if(line(12:14).ne.' ') nw=nw+1
! if(line(16:18).ne.' ') nj=nj+1
write(*,'(a74,1x,a1)') line(1:74),only
enddo ! j
nbt=nbt+nb
nwt=nwt+nw
n7t=n7t+n7
njt=njt+nj
net=net+ne
nutc0=nutc
write(*,*)
write(20,1031) iseq,nb,nw,nj,nb+nw-n7,nb+nw,nb+nj,ne,nbt,nwt,njt, &
nbt+nwt-n7t,nbt+nwt,nbt+njt,net
1031 format(i5,2x,7i4,2x,7i6)
if(eof) exit
! if(iseq.eq.2) exit
enddo ! iseq
end program chkdec

378
lib/ft8/ft8_a7.f90 Normal file
View File

@ -0,0 +1,378 @@
module ft8_a7
parameter(MAXDEC=100)
! For the following three arrays
! First index i=decode number in this sequence
! Second index j=0 or 1 for even or odd sequence
! Third index k=0 or 1 for previous or current tally for this j
real dt0(MAXDEC,0:1,0:1) !dt0(i,j,k)
real f0(MAXDEC,0:1,0:1) !f0(i,j,k)
character*37 msg0(MAXDEC,0:1,0:1) !msg0(i,j,k)
integer itone_a7(79)
integer jseq !even=0, odd=1
integer ndec(0:1,0:1) !ndec(j,k)
data ndec/4*0/,jseq/0/
contains
subroutine ft8_a7_save(nutc,dt,f,msg)
use packjt77
character*37 msg,msg1
character*13 w(19)
character*4 g4
integer nw(19)
logical isgrid4
! Statement function:
isgrid4(g4)=(len_trim(g4).eq.4 .and. &
ichar(g4(1:1)).ge.ichar('A') .and. ichar(g4(1:1)).le.ichar('R') .and. &
ichar(g4(2:2)).ge.ichar('A') .and. ichar(g4(2:2)).le.ichar('R') .and. &
ichar(g4(3:3)).ge.ichar('0') .and. ichar(g4(3:3)).le.ichar('9') .and. &
ichar(g4(4:4)).ge.ichar('0') .and. ichar(g4(4:4)).le.ichar('9'))
if(index(msg,'/').ge.1 .or. index(msg,'<').ge.1) go to 999
call split77(msg,nwords,nw,w) !Parse msg into words
if(nwords.lt.1) go to 999
if(w(1)(1:3).eq.'CQ_') go to 999
j=mod(nutc/5,2) !j is 0 or 1 for odd/even sequence
jseq=j
! Add this decode to current table for this sequence
ndec(j,1)=ndec(j,1)+1 !Number of decodes in this sequence
i=ndec(j,1) !i is index of a new table entry
if(i.ge.MAXDEC-1) return !Prevent table overflow
dt0(i,j,1)=dt !Save dt in table
f0(i,j,1)=f !Save f in table
msg0(i,j,1)=trim(w(1))//' '//trim(w(2)) !Save "call_1 call_2"
if(w(1)(1:3).eq.'CQ ' .and. nw(2).le.2) then
msg0(i,j,1)='CQ '//trim(w(2))//' '//trim(w(3)) !Save "CQ DX Call_2"
endif
msg1=msg0(i,j,1) !Message without grid
nn=len(trim(msg1)) !Message length without grid
! Include grid as part of message
if(isgrid4(w(nwords))) msg0(i,j,1)=trim(msg0(i,j,1))//' '//trim(w(nwords))
! If a transmission at this frequency with message fragment "call_1 call_2"
! was decoded in the previous sequence, flag it as "DO NOT USE" because
! we have already decoded and subtracted that station's next transmission.
call split77(msg0(i,j,1),nwords,nw,w) !Parse msg into words
do i=1,ndec(j,0)
if(f0(i,j,0).le.-98.0) cycle
i2=index(msg0(i,j,0),' '//trim(w(2)))
if(abs(f-f0(i,j,0)).le.3.0 .and. i2.ge.3) then
f0(i,j,0)=-98.0 !Flag as "do not use" for a potential a7 decode
endif
enddo
999 return
end subroutine ft8_a7_save
subroutine ft8_a7d(dd0,newdat,call_1,call_2,grid4,xdt,f1,xbase,nharderrors,dmin, &
msg37,xsnr)
! Examine the raw data in dd0() for possible "a7" decodes.
use crc
use timer_module, only: timer
use packjt77
include 'ft8_params.f90'
parameter(NP2=2812)
character*37 msg37,msg,msgsent,msgbest
character*12 call_1,call_2
character*4 grid4
real a(5)
real s8(0:7,NN)
real s2(0:511)
real dmm(206)
real bmeta(174),bmetb(174),bmetc(174),bmetd(174)
real llra(174),llrb(174),llrc(174),llrd(174) !Soft symbols
real dd0(15*12000)
real ss(9)
real rcw(174)
integer*1 cw(174)
integer*1 msgbits(77)
integer*1 nxor(174),hdec(174)
integer itone(NN)
integer icos7(0:6),ip(1)
logical one(0:511,0:8)
integer graymap(0:7)
integer iloc(1)
complex cd0(0:3199)
complex ctwk(32)
complex csymb(32)
complex cs(0:7,NN)
logical std_1,std_2
logical first,newdat
data icos7/3,1,4,0,6,5,2/ !Sync array
data first/.true./
data graymap/0,1,3,2,5,6,4,7/
save one
if(first) then
one=.false.
do i=0,511
do j=0,8
if(iand(i,2**j).ne.0) one(i,j)=.true.
enddo
enddo
first=.false.
endif
call stdcall(call_1,std_1)
if(call_1(1:3).eq.'CQ ') std_1=.true.
call stdcall(call_2,std_2)
fs2=12000.0/NDOWN
dt2=1.0/fs2
twopi=8.0*atan(1.0)
delfbest=0.
ibest=0
call timer('ft8_down',0)
call ft8_downsample(dd0,newdat,f1,cd0) !Mix f1 to baseband and downsample
call timer('ft8_down',1)
i0=nint((xdt+0.5)*fs2) !Initial guess for start of signal
smax=0.0
do idt=i0-10,i0+10 !Search over +/- one quarter symbol
call sync8d(cd0,idt,ctwk,0,sync) !NB: ctwk not used here
if(sync.gt.smax) then
smax=sync
ibest=idt
endif
enddo
! Peak up in frequency
smax=0.0
do ifr=-5,5 !Search over +/- 2.5 Hz
delf=ifr*0.5
dphi=twopi*delf*dt2
phi=0.0
do i=1,32
ctwk(i)=cmplx(cos(phi),sin(phi))
phi=mod(phi+dphi,twopi)
enddo
call sync8d(cd0,ibest,ctwk,1,sync)
if( sync .gt. smax ) then
smax=sync
delfbest=delf
endif
enddo
a=0.0
a(1)=-delfbest
call twkfreq1(cd0,NP2,fs2,a,cd0)
f1=f1+delfbest !Improved estimate of DF
call timer('ft8_down',0)
call ft8_downsample(dd0,.false.,f1,cd0) !Mix f1 to baseband and downsample
call timer('ft8_down',1)
smax=0.0
do idt=-4,4 !Search over +/- one quarter symbol
call sync8d(cd0,ibest+idt,ctwk,0,sync)
ss(idt+5)=sync
enddo
smax=maxval(ss)
iloc=maxloc(ss)
ibest=iloc(1)-5+ibest
xdt=(ibest-1)*dt2 - 0.5
sync=smax
do k=1,NN
i1=ibest+(k-1)*32
csymb=cmplx(0.0,0.0)
if( i1.ge.0 .and. i1+31 .le. NP2-1 ) csymb=cd0(i1:i1+31)
call four2a(csymb,32,1,-1,1)
cs(0:7,k)=csymb(1:8)/1e3
s8(0:7,k)=abs(csymb(1:8))
enddo
! sync quality check
is1=0
is2=0
is3=0
do k=1,7
ip=maxloc(s8(:,k))
if(icos7(k-1).eq.(ip(1)-1)) is1=is1+1
ip=maxloc(s8(:,k+36))
if(icos7(k-1).eq.(ip(1)-1)) is2=is2+1
ip=maxloc(s8(:,k+72))
if(icos7(k-1).eq.(ip(1)-1)) is3=is3+1
enddo
! hard sync sum - max is 21
nsync=is1+is2+is3
! if(nsync .le. 6) return ! bail out
do nsym=1,3
nt=2**(3*nsym)
do ihalf=1,2
do k=1,29,nsym
if(ihalf.eq.1) ks=k+7
if(ihalf.eq.2) ks=k+43
amax=-1.0
do i=0,nt-1
i1=i/64
i2=iand(i,63)/8
i3=iand(i,7)
if(nsym.eq.1) then
s2(i)=abs(cs(graymap(i3),ks))
elseif(nsym.eq.2) then
s2(i)=abs(cs(graymap(i2),ks)+cs(graymap(i3),ks+1))
elseif(nsym.eq.3) then
s2(i)=abs(cs(graymap(i1),ks)+cs(graymap(i2),ks+1)+cs(graymap(i3),ks+2))
else
print*,"Error - nsym must be 1, 2, or 3."
endif
enddo
i32=1+(k-1)*3+(ihalf-1)*87
if(nsym.eq.1) ibmax=2
if(nsym.eq.2) ibmax=5
if(nsym.eq.3) ibmax=8
do ib=0,ibmax
bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - &
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib))
if(i32+ib .gt.174) cycle
if(nsym.eq.1) then
bmeta(i32+ib)=bm
den=max(maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)), &
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)))
if(den.gt.0.0) then
cm=bm/den
else ! erase it
cm=0.0
endif
bmetd(i32+ib)=cm
elseif(nsym.eq.2) then
bmetb(i32+ib)=bm
elseif(nsym.eq.3) then
bmetc(i32+ib)=bm
endif
enddo
enddo
enddo
enddo
call normalizebmet(bmeta,174)
call normalizebmet(bmetb,174)
call normalizebmet(bmetc,174)
call normalizebmet(bmetd,174)
scalefac=2.83
llra=scalefac*bmeta
llrb=scalefac*bmetb
llrc=scalefac*bmetc
llrd=scalefac*bmetd
! apmag=maxval(abs(llra))*1.01
MAXMSG=206
pbest=0.
dmin=1.e30
nharderrors=-1
do imsg=1,MAXMSG
msg=trim(call_1)//' '//trim(call_2)
i=imsg
if(call_1(1:3).eq.'CQ ' .and. i.ne.5) msg='QU1RK '//trim(call_2)
if(.not.std_1) then
if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2)
if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>'
else if(.not.std_2) then
if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2)
if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>'
endif
j0=len(trim(msg))+2
if(i.eq.2) msg(j0:j0+2)='RRR'
if(i.eq.3) msg(j0:j0+3)='RR73'
if(i.eq.4) msg(j0:j0+1)='73'
if(i.eq.5) then
if(std_2) then
msg='CQ '//trim(call_2)
if(call_1(3:3).eq.'_') msg=trim(call_1)//' '//trim(call_2)
if(grid4.ne.'RR73') msg=trim(msg)//' '//grid4
endif
if(.not.std_2) msg='CQ '//trim(call_2)
endif
if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4
if(i.ge.7) then
isnr = -50 + (i-7)/2
if(iand(i,1).eq.1) then
write(msg(j0:j0+2),'(i3.2)') isnr
if(msg(j0:j0).eq.' ') msg(j0:j0)='+'
else
write(msg(j0:j0+3),'("R",i3.2)') isnr
if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
endif
endif
i3=-1
n3=-1
call genft8(msg,i3,n3,msgsent,msgbits,itone) !Source-encode this message
call encode174_91(msgbits,cw) !Get codeword for this message
rcw=2*cw-1
pow=0.0
do i=1,79
pow=pow+s8(itone(i),i)**2
enddo
hdec=0
where(llra.ge.0.0) hdec=1
nxor=ieor(hdec,cw)
da=sum(nxor*abs(llra))
hdec=0
where(llrb.ge.0.0) hdec=1
nxor=ieor(hdec,cw)
dbb=sum(nxor*abs(llrb))
hdec=0
where(llrc.ge.0.0) hdec=1
nxor=ieor(hdec,cw)
dc=sum(nxor*abs(llrc))
hdec=0
where(llrd.ge.0.0) hdec=1
nxor=ieor(hdec,cw)
dd=sum(nxor*abs(llrd))
dm=min(da,dbb,dc,dd)
dmm(imsg)=dm
if(dm.lt.dmin) then
dmin=dm
msgbest=msgsent
pbest=pow
if(dm.eq.da) then
nharderrors=count((2*cw-1)*llra.lt.0.0)
else if(dm.eq.dbb) then
nharderrors=count((2*cw-1)*llrb.lt.0.0)
else if(dm.eq.dc) then
nharderrors=count((2*cw-1)*llrc.lt.0.0)
else if(dm.eq.dd) then
nharderrors=count((2*cw-1)*llrd.lt.0.0)
endif
endif
enddo ! imsg
iloc=minloc(dmm)
dmm(iloc(1))=1.e30
iloc=minloc(dmm)
dmin2=dmm(iloc(1))
xsnr=-24.
arg=pbest/xbase/3.0e6-1.0
if(arg.gt.0.0) xsnr=max(-24.0,db(arg)-27.0)
! write(41,3041) nharderrors,dmin,dmin2,dmin2/dmin,xsnr,trim(msgbest)
!3041 format(i3,2f7.1,f7.2,f7.1,1x,a)
if(dmin.gt.100.0 .or. dmin2/dmin.lt.1.3) nharderrors=-1
msg37=msgbest
if(msg37(1:3).eq.'CQ ' .and. std_2 .and. grid4.eq.' ') nharderrors=-1
if(msg37(1:6).eq.'QU1RK ') nharderrors=-1
return
end subroutine ft8_a7d
end module ft8_a7

261
lib/ft8/ft8c.f90 Normal file
View File

@ -0,0 +1,261 @@
subroutine ft8c(dd0,newdat,call_1,call_2,grid4,xdt,f1,nharderrors,dmin, &
msg37,xsnr)
use crc
use timer_module, only: timer
use packjt77
include 'ft8_params.f90'
parameter(NP2=2812)
character*37 msg37,msg,msgsent,msgbest
character*12 call_1,call_2
character*4 grid4
real a(5)
real s8(0:7,NN)
real s2(0:511)
real bmeta(174),bmetb(174),bmetc(174),bmetd(174)
real llra(174),llrb(174),llrc(174),llrd(174),llrbest(174) !Soft symbols
real dd0(15*12000)
real ss(9)
real rcw(174)
integer*1 cw(174)
integer*1 msgbits(77)
integer*1 nxor(174),hdec(174)
integer itone(NN)
integer icos7(0:6),ip(1)
logical one(0:511,0:8)
integer graymap(0:7)
integer iloc(1)
complex cd0(0:3199)
complex ctwk(32)
complex csymb(32)
complex cs(0:7,NN)
logical std_1,std_2
logical first,newdat
data icos7/3,1,4,0,6,5,2/ ! Flipped w.r.t. original FT8 sync array
data first/.true./
data graymap/0,1,3,2,5,6,4,7/
save one
if(first) then
one=.false.
do i=0,511
do j=0,8
if(iand(i,2**j).ne.0) one(i,j)=.true.
enddo
enddo
first=.false.
endif
call stdcall(call_1,std_1)
if(call_1(1:3).eq.'CQ ') std_1=.true.
call stdcall(call_2,std_2)
nharderrors=-1
fs2=12000.0/NDOWN
dt2=1.0/fs2
twopi=8.0*atan(1.0)
delfbest=0.
ibest=0
call timer('ft8_down',0)
call ft8_downsample(dd0,newdat,f1,cd0) !Mix f1 to baseband and downsample
call timer('ft8_down',1)
i0=nint((xdt+0.5)*fs2) !Initial guess for start of signal
smax=0.0
do idt=i0-10,i0+10 !Search over +/- one quarter symbol
call sync8d(cd0,idt,ctwk,0,sync)
if(sync.gt.smax) then
smax=sync
ibest=idt
endif
enddo
! Now peak up in frequency
smax=0.0
do ifr=-5,5 !Search over +/- 2.5 Hz
delf=ifr*0.5
dphi=twopi*delf*dt2
phi=0.0
do i=1,32
ctwk(i)=cmplx(cos(phi),sin(phi))
phi=mod(phi+dphi,twopi)
enddo
call sync8d(cd0,ibest,ctwk,1,sync)
if( sync .gt. smax ) then
smax=sync
delfbest=delf
endif
enddo
a=0.0
a(1)=-delfbest
call twkfreq1(cd0,NP2,fs2,a,cd0)
f1=f1+delfbest !Improved estimate of DF
call timer('ft8_down',0)
call ft8_downsample(dd0,.false.,f1,cd0) !Mix f1 to baseband and downsample
call timer('ft8_down',1)
smax=0.0
do idt=-4,4 !Search over +/- one quarter symbol
call sync8d(cd0,ibest+idt,ctwk,0,sync)
ss(idt+5)=sync
enddo
smax=maxval(ss)
iloc=maxloc(ss)
ibest=iloc(1)-5+ibest
xdt=(ibest-1)*dt2 - 0.5
sync=smax
do k=1,NN
i1=ibest+(k-1)*32
csymb=cmplx(0.0,0.0)
if( i1.ge.0 .and. i1+31 .le. NP2-1 ) csymb=cd0(i1:i1+31)
call four2a(csymb,32,1,-1,1)
cs(0:7,k)=csymb(1:8)/1e3
s8(0:7,k)=abs(csymb(1:8))
enddo
! sync quality check
is1=0
is2=0
is3=0
do k=1,7
ip=maxloc(s8(:,k))
if(icos7(k-1).eq.(ip(1)-1)) is1=is1+1
ip=maxloc(s8(:,k+36))
if(icos7(k-1).eq.(ip(1)-1)) is2=is2+1
ip=maxloc(s8(:,k+72))
if(icos7(k-1).eq.(ip(1)-1)) is3=is3+1
enddo
! hard sync sum - max is 21
nsync=is1+is2+is3
! if(nsync .le. 6) return ! bail out
do nsym=1,3
nt=2**(3*nsym)
do ihalf=1,2
do k=1,29,nsym
if(ihalf.eq.1) ks=k+7
if(ihalf.eq.2) ks=k+43
amax=-1.0
do i=0,nt-1
i1=i/64
i2=iand(i,63)/8
i3=iand(i,7)
if(nsym.eq.1) then
s2(i)=abs(cs(graymap(i3),ks))
elseif(nsym.eq.2) then
s2(i)=abs(cs(graymap(i2),ks)+cs(graymap(i3),ks+1))
elseif(nsym.eq.3) then
s2(i)=abs(cs(graymap(i1),ks)+cs(graymap(i2),ks+1)+cs(graymap(i3),ks+2))
else
print*,"Error - nsym must be 1, 2, or 3."
endif
enddo
i32=1+(k-1)*3+(ihalf-1)*87
if(nsym.eq.1) ibmax=2
if(nsym.eq.2) ibmax=5
if(nsym.eq.3) ibmax=8
do ib=0,ibmax
bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - &
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib))
if(i32+ib .gt.174) cycle
if(nsym.eq.1) then
bmeta(i32+ib)=bm
den=max(maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)), &
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib)))
if(den.gt.0.0) then
cm=bm/den
else ! erase it
cm=0.0
endif
bmetd(i32+ib)=cm
elseif(nsym.eq.2) then
bmetb(i32+ib)=bm
elseif(nsym.eq.3) then
bmetc(i32+ib)=bm
endif
enddo
enddo
enddo
enddo
call normalizebmet(bmeta,174)
call normalizebmet(bmetb,174)
call normalizebmet(bmetc,174)
call normalizebmet(bmetd,174)
scalefac=2.83
llra=scalefac*bmeta
llrb=scalefac*bmetb
llrc=scalefac*bmetc
llrd=scalefac*bmetd
! apmag=maxval(abs(llra))*1.01
MAXMSG=206
pbest=0.
do imsg=1,MAXMSG
msg=trim(call_1)//' '//trim(call_2)
i=imsg
if(call_1(1:3).eq.'CQ ' .and. i.ne.5) msg='QQ0XYZ '//trim(call_2)
if(.not.std_1) then
if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2)
if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>'
else if(.not.std_2) then
if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2)
if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>'
endif
j0=len(trim(msg))+2
if(i.eq.2) msg(j0:j0+2)='RRR'
if(i.eq.3) msg(j0:j0+3)='RR73'
if(i.eq.4) msg(j0:j0+1)='73'
if(i.eq.5) then
if(std_2) then
msg='CQ '//trim(call_2)
if(call_1(3:3).eq.'_') msg=trim(call_1)//' '//trim(call_2)
if(grid4.ne.'RR73') msg=trim(msg)//' '//grid4
endif
if(.not.std_2) msg='CQ '//trim(call_2)
endif
if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4
if(i.ge.7) then
isnr = -50 + (i-7)/2
if(iand(i,1).eq.1) then
write(msg(j0:j0+2),'(i3.2)') isnr
if(msg(j0:j0).eq.' ') msg(j0:j0)='+'
else
write(msg(j0:j0+3),'("R",i3.2)') isnr
if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
endif
endif
! Source-encode, then get codeword
i3=-1
n3=-1
call genft8(msg,i3,n3,msgsent,msgbits,itone)
call encode174_91(msgbits,cw)
rcw=2*cw-1
pa=sum(llra*rcw)
pb=sum(llrb*rcw)
pc=sum(llrc*rcw)
pd=sum(llrd*rcw)
if(pa.gt.pbest) then
pbest=pa
msgbest=msgsent
llrbest=llra
nharderrors=count((2*cw-1)*llra.lt.0.0)
hdec=0
where(llra.ge.0.0) hdec=1
nxor=ieor(hdec,cw)
dmin=sum(nxor*abs(llra))
endif
enddo ! imsg
! write(*,4001) pbest,nharderrors,dmin,trim(msgbest)
!4001 format('$$$',f7.1,i4,f7.1,2x,a)
msg37=msgbest
return
end subroutine ft8c

109
lib/ft8/ft8q3.f90 Normal file
View File

@ -0,0 +1,109 @@
subroutine ft8q3(cd,xdt,f0,call_1,call_2,grid4,msgbest,snr)
! Get q3-style decodes for FT8.
use packjt77
parameter(NN=79,NSPS=32)
parameter(NWAVE=NN*NSPS) !2528
parameter(NZ=3200,NLAGS=NZ-NWAVE)
character*12 call_1,call_2
character*4 grid4
character*37 msg,msgbest,msgsent
character c77*77
complex cwave(0:NWAVE-1)
complex cd(0:NZ-1)
complex z
real xjunk(NWAVE)
real ccf(0:NLAGS-1)
real ccfmsg(206)
integer itone(NN)
integer*1 msgbits(77)
logical std_1,std_2
if(xdt.eq.-99.0) return !Silence compiler warning
call stdcall(call_1,std_1)
call stdcall(call_2,std_2)
fs=200.0 !Sample rate (Hz)
dt=1.0/fs !Sample interval (s)
bt=2.0
ccfbest=0.
lagbest=-1
do imsg=1,206
msg=trim(call_1)//' '//trim(call_2)
i=imsg
if(.not.std_1) then
if(i.eq.1 .or. i.ge.6) msg='<'//trim(call_1)//'> '//trim(call_2)
if(i.ge.2 .and. i.le.4) msg=trim(call_1)//' <'//trim(call_2)//'>'
else if(.not.std_2) then
if(i.le.4 .or. i.eq.6) msg='<'//trim(call_1)//'> '//trim(call_2)
if(i.ge.7) msg=trim(call_1)//' <'//trim(call_2)//'>'
endif
j0=len(trim(msg))+2
if(i.eq.2) msg(j0:j0+2)='RRR'
if(i.eq.3) msg(j0:j0+3)='RR73'
if(i.eq.4) msg(j0:j0+1)='73'
if(i.eq.5) then
if(std_2) msg='CQ '//trim(call_2)//' '//grid4
if(.not.std_2) msg='CQ '//trim(call_2)
endif
if(i.eq.6 .and. std_2) msg(j0:j0+3)=grid4
if(i.ge.7 .and. i.le.206) then
isnr = -50 + (i-7)/2
if(iand(i,1).eq.1) then
write(msg(j0:j0+2),'(i3.2)') isnr
if(msg(j0:j0).eq.' ') msg(j0:j0)='+'
else
write(msg(j0:j0+3),'("R",i3.2)') isnr
if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
endif
endif
! Source-encode, then get itone()
i3=-1
n3=-1
call pack77(msg,i3,n3,c77)
call genft8(msg,i3,n3,msgsent,msgbits,itone)
! Generate complex cwave
call gen_ft8wave(itone,NN,NSPS,bt,fs,f0,cwave,xjunk,1,NWAVE)
lagmax=-1
ccfmax=0.
nsum=32*2
do lag=0,nlags-1
z=0.
s=0.
do i=0,NWAVE-1
z=z + cd(i+lag)*conjg(cwave(i))
if(mod(i,nsum).eq.nsum-1 .or. i.eq.NWAVE-1) then
s=s + abs(z)
z=0.
endif
enddo
ccf(lag)=s
if(ccf(lag).gt.ccfmax) then
ccfmax=ccf(lag)
lagmax=lag
endif
enddo ! lag
ccfmsg(imsg)=ccfmax
if(ccfmax.gt.ccfbest) then
ccfbest=ccfmax
lagbest=lagmax
msgbest=msg
endif
enddo ! imsg
call pctile(ccfmsg,207,50,base)
call pctile(ccfmsg,207,67,sigma)
sigma=sigma-base
ccfmsg=(ccfmsg-base)/sigma
! do imsg=1,207
! write(44,3044) imsg,ccfmsg(imsg)
!3044 format(i5,f10.3)
! enddo
snr=maxval(ccfmsg)
return
end subroutine ft8q3

View File

@ -9,11 +9,12 @@ subroutine gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave)
real pulse(23040)
real dphi(0:(nsym+2)*nsps-1)
integer itone(nsym)
data ibt0/0/
save pulse,twopi,dt,hmod,ibt0,ctab
data fchk0/0.0/
save pulse,twopi,dt,hmod,fchk0,ctab
ibt=nint(10*bt)
if(ibt0.ne.ibt) then
fchk=nsym+nsps+bt+fsample
if(fchk.ne.fchk0) then
twopi=8.0*atan(1.0)
dt=1.0/fsample
hmod=1.0
@ -22,11 +23,11 @@ subroutine gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave)
tt=(i-1.5*nsps)/real(nsps)
pulse(i)=gfsk_pulse(bt,tt)
enddo
ibt0=nint(10*bt)
do i=0,NTAB-1
phi=i*twopi/NTAB
ctab(i)=cmplx(cos(phi),sin(phi))
enddo
fchk0=fchk
endif
! Compute the smoothed frequency waveform.

View File

@ -58,6 +58,8 @@ subroutine subtractft8(dd0,itone,f0,dt,lrefinedt)
sq0=sqf(0) !Do the subtraction with idt=0
endif
dd0=dd !Return dd0 with this signal subtracted
! write(44,3044) nint(f0),dt-0.5,1.e-8*sum(dd*dd)
!3044 format(i4,f7.2,f10.6)
return
contains

41
lib/ft8/test_ft8q3.f90 Normal file
View File

@ -0,0 +1,41 @@
program test_ft8q3
! Test q3-style decodes for FT8.
use packjt77
parameter(NN=79,NSPS=32)
parameter(NWAVE=NN*NSPS) !2528
parameter(NZ=3200,NLAGS=NZ-NWAVE)
character arg*12
character*37 msg
character*12 call_1,call_2
character*4 grid4
complex cd(0:NZ-1)
! Get command-line argument(s)
nargs=iargc()
if(nargs.ne.4 .and. nargs.ne.5) then
print*,'Usage: ft8q3 DT f0 call_1 call_2 [grid4]'
go to 999
endif
call getarg(1,arg)
read(arg,*) xdt !Time offset from nominal (s)
call getarg(2,arg)
read(arg,*) f0 !Frequency (Hz)
call getarg(3,call_1) !First callsign
call getarg(4,call_2) !Second callsign
grid4=' '
if(nargs.eq.5) call getarg(5,grid4) !Locator for call_2
do i=0,NZ-1
read(40,3040) cd(i)
3040 format(17x,2f10.3)
enddo
call sec0(0,t)
call ft8q3(cd,xdt,f0,call_1,call_2,grid4,msg,snr)
call sec0(1,t)
write(*,1100) t,snr,trim(msg)
1100 format('Time:',f6.2,' S/N:',f6.1,' msg: ',a)
999 end program test_ft8q3

View File

@ -38,6 +38,7 @@ contains
use iso_c_binding, only: c_bool, c_int
use timer_module, only: timer
use shmem, only: shmem_lock, shmem_unlock
use ft8_a7
include 'ft8/ft8_params.f90'
@ -53,7 +54,8 @@ contains
logical newdat,lsubtract,ldupe,lrefinedt
logical*1 ldiskdat
logical lsubtracted(MAX_EARLY)
character*12 mycall12,hiscall12
character*12 mycall12,hiscall12,call_1,call_2
character*4 grid4
integer*2 iwave(15*12000)
integer apsym2(58),aph10(10)
character datetime*13,msg37*37
@ -64,13 +66,33 @@ contains
integer itone_save(NN,MAX_EARLY)
real f1_save(MAX_EARLY)
real xdt_save(MAX_EARLY)
data nutc0/-1/
save s,dd,dd1,ndec_early,itone_save,f1_save,xdt_save,lsubtracted,allmessages
save s,dd,dd1,nutc0,ndec_early,itone_save,f1_save,xdt_save,lsubtracted,&
allmessages
this%callback => callback
write(datetime,1001) nutc !### TEMPORARY ###
1001 format("000000_",i6.6)
if(nutc0.eq.-1) then
msg0=' '
dt0=0.
f0=0.
endif
if(nutc.ne.nutc0) then
! New UTC. Move previously saved 'a7' data from k=1 to k=0
iz=ndec(jseq,1)
dt0(1:iz,jseq,0) = dt0(1:iz,jseq,1)
f0(1:iz,jseq,0) = f0(1:iz,jseq,1)
msg0(1:iz,jseq,0) = msg0(1:iz,jseq,1)
ndec(jseq,0)=iz
ndec(jseq,1)=0
nutc0=nutc
dt0(:,jseq,1)=0.
f0(:,jseq,1)=0.
endif
if(ndepth.eq.1 .and. nzhsym.lt.50) then
ndec_early=0
return
@ -178,7 +200,7 @@ contains
hiscall12,f1,xdt,xbase,apsym2,aph10,nharderrors,dmin, &
nbadcrc,iappass,msg37,xsnr,itone)
call timer('ft8b ',1)
nsnr=nint(xsnr)
nsnr=nint(xsnr)
xdt=xdt-0.5
hd=nharderrors+dmin
if(nbadcrc.eq.0) then
@ -198,6 +220,11 @@ contains
qual=1.0-(nharderrors+dmin)/60.0 ! scale qual to [0.0,1.0]
if(emedelay.ne.0) xdt=xdt+2.0
call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual)
call ft8_a7_save(nutc,xdt,f1,msg37) !Enter decode in table
! ii=ndec(jseq,1)
! write(41,3041) jseq,ii,nint(f0(ii,jseq,0)),msg0(ii,jseq,0)(1:22),&
! nint(f0(ii,jseq,1)),msg0(ii,jseq,1)(1:22)
!3041 format(3i5,2x,a22,i5,2x,a22)
endif
endif
call timestamp(tsec,tseq,ctime)
@ -209,7 +236,43 @@ contains
800 ndec_early=0
if(nzhsym.lt.50) ndec_early=ndecodes
900 return
900 continue
if(nzhsym.eq.50 .and. ndec(jseq,0).ge.1) then
newdat=.true.
do i=1,ndec(jseq,0)
if(f0(i,jseq,0).eq.-99.0) exit
if(f0(i,jseq,0).eq.-98.0) cycle
if(index(msg0(i,jseq,0),'<').ge.1) cycle !### Temporary ###
msg37=msg0(i,jseq,0)
i1=index(msg37,' ')
i2=index(msg37(i1+1:),' ') + i1
call_1=msg37(1:i1-1)
call_2=msg37(i1+1:i2-1)
grid4=msg37(i2+1:i2+4)
if(grid4.eq.'RR73' .or. index(grid4,'+').gt.0 .or. &
index(grid4,'-').gt.0) grid4=' '
xdt=dt0(i,jseq,0)
f1=f0(i,jseq,0)
xbase=10.0**(0.1*(sbase(max(1,nint(f1/3.125)))-40.0))
msg37=' '
call timer('ft8_a7d ',0)
call ft8_a7d(dd,newdat,call_1,call_2,grid4,xdt,f1,xbase,nharderrors, &
dmin,msg37,xsnr)
call timer('ft8_a7d ',1)
if(nharderrors.ge.0) then
if(associated(this%callback)) then
nsnr=xsnr
iaptype=7
qual=1.0
call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual)
call ft8_a7_save(nutc,xdt,f1,msg37) !Enter decode in table
endif
endif
enddo
endif
return
end subroutine decode
subroutine timestamp(tsec,tseq,ctime)

View File

@ -1,9 +1,10 @@
subroutine gen65(msg0,ichk,msgsent,itone,itype)
subroutine gen65(msg00,ichk,msgsent0,itone,itype) BIND(c)
! Encodes a JT65 message to yieild itone(1:126)
! Temporarily, does not implement EME shorthands
use packjt
character*1 msg00(23),msgsent0(23)
character*22 msg0
character*22 message !Message to be generated
character*22 msgsent !Message as it will be received
@ -21,6 +22,10 @@ subroutine gen65(msg0,ichk,msgsent,itone,itype)
1,1,1,1,1,1/
save
do i=1,22
msg0(i:i)=msg00(i)
enddo
if(msg0(1:1).eq.'@') then
read(msg0(2:5),*,end=1,err=1) nfreq
go to 2
@ -48,7 +53,7 @@ subroutine gen65(msg0,ichk,msgsent,itone,itype)
call unpackmsg(dgen,msgsent) !Unpack to get message sent
msgsent(20:22)=cok
call fmtmsg(msgsent,iz)
if(ichk.ne.0) go to 999 !Return if checking only
if(ichk.ne.0) go to 900 !Return if checking only
call rs_encode(dgen,sent) !Apply Reed-Solomon code
call interleave63(sent,1) !Apply interleaving
@ -79,5 +84,10 @@ subroutine gen65(msg0,ichk,msgsent,itone,itype)
endif
endif
999 return
900 do i=1,22
msgsent0(i)=msgsent(i:i)
enddo
msgsent0(23)=char(0)
return
end subroutine gen65

View File

@ -3,7 +3,8 @@ subroutine grid2deg(grid0,dlong,dlat)
! Converts Maidenhead grid locator to degrees of West longitude
! and North latitude.
character*6 grid0,grid
character*(*) grid0
character*6 grid
character*1 g1,g2,g3,g4,g5,g6
grid=grid0

View File

@ -62,6 +62,7 @@ contains
character(len=12) :: mycall, hiscall !Used for AP decoding
character(len=6) :: hisgrid
character*37 decoded !Decoded message
character*37 decodes(100)
character*77 c77
character*78 c78
character*6 cutc
@ -80,6 +81,8 @@ contains
! Start by setting some parameters and allocating storage for large arrays
call sec0(0,tdecode)
ndecodes=0
decodes=' '
nfa=nfa0
nfb=nfb0
nqd=nqd0
@ -153,14 +156,21 @@ contains
call q65_enc(dgen,codewords) !Initialize the Q65 codec
nused=1
iavg=0
! W3SZ patch: Initialize AP params here, rather than afer the call to ana64().
call ft8apset(mycall,hiscall,ncontest,apsym0,aph10) ! Generate ap symbols
where(apsym0.eq.-1) apsym0=0
npasses=2
if(nQSOprogress.eq.5) npasses=3
call timer('q65_dec0',0)
! Call top-level routine in q65 module: establish sync and try for a
! q3 or q0 decode.
call q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, &
emedelay,xdt,f0,snr1,width,dat4,snr2,idec,stageno)
call timer('q65_dec0',1)
! write(*,3001) '=a',sum(abs(float(iwave))),nfqso,ntol,ndepth,xdt,f0,idec
!3001 format(a2,f15.0,3i5,f7.2,f7.1,i5)
! write(*,3001) '=a',nfqso,ntol,ndepth,xdt,f0,idec
!3001 format(a2,3i5,f7.2,f7.1,i5)
if(idec.ge.0) then
dtdec=xdt !We have a q3 or q0 decode at nfqso
@ -173,11 +183,6 @@ contains
if(ntrperiod.le.30) jpk0=(xdt+0.5)*6000 !For shortest sequences
if(jpk0.lt.0) jpk0=0
call ana64(iwave,npts,c00) !Convert to complex c00() at 6000 Sa/s
call ft8apset(mycall,hiscall,ncontest,apsym0,aph10) ! Generate ap symbols
where(apsym0.eq.-1) apsym0=0
npasses=2
if(nQSOprogress.eq.5) npasses=3
if(lapcqonly) npasses=1
iaptype=0
do ipass=0,npasses !Loop over AP passes
@ -199,6 +204,7 @@ contains
call q65_loops(c00,npts/2,nsps/2,nsubmode,ndepth,jpk0, &
xdt,f0,iaptype,xdt1,f1,snr2,dat4,idec)
call timer('q65loops',1)
! write(*,3001) '=b',nfqso,ntol,ndepth,xdt,f0,idec
if(idec.ge.0) then
dtdec=xdt1
f0dec=f1
@ -266,33 +272,41 @@ contains
! Unpack decoded message for display to user
write(c77,1000) dat4(1:12),dat4(13)/2
1000 format(12b6.6,b5.5)
call unpack77(c77,1,decoded,unpk77_success) !Unpack to get msgsent
call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2)
nsnr=nint(snr2)
call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, &
idec,nused,ntrperiod)
call q65_hist(nint(f0dec),msg0=decoded)
if(iand(ndepth,128).ne.0 .and. .not.lagain .and. &
int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg
call sec0(1,tdecode)
open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown', &
position='append',iostat=ios)
if(ios.eq.0) then
call unpack77(c77,1,decoded,unpk77_success) !Unpack to get decoded
idupe=0
do i=1,ndecodes
if(decodes(i).eq.decoded) idupe=1
enddo
if(idupe.eq.0) then
ndecodes=min(ndecodes+1,100)
decodes(ndecodes)=decoded
call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2)
nsnr=nint(snr2)
call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, &
idec,nused,ntrperiod)
call q65_hist(nint(f0dec),msg0=decoded)
if(iand(ndepth,128).ne.0 .and. .not.lagain .and. &
int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg
call sec0(1,tdecode)
open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown', &
position='append',iostat=ios)
if(ios.eq.0) then
! Save decoding parameters to q65_decoded.dat, for later analysis.
write(cmode,'(i3)') ntrperiod
cmode(4:4)=char(ichar('A')+nsubmode)
c6=hiscall(1:6)
if(c6.eq.' ') c6='<b> '
c4=hisgrid(1:4)
if(c4.eq.' ') c4='<b> '
fmt='(i6.4,1x,a4,4i2,6i3,i4,f6.2,f7.1,f6.1,f7.1,f6.2,'// &
'1x,a6,1x,a6,1x,a4,1x,a)'
if(ntrperiod.le.30) fmt(5:5)='6'
if(idec.eq.3) nrc=0
write(22,fmt) nutc,cmode,nQSOprogress,idec,idfbest,idtbest,ibw, &
ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,plog, &
tdecode,mycall(1:6),c6,c4,trim(decoded)
close(22)
write(cmode,'(i3)') ntrperiod
cmode(4:4)=char(ichar('A')+nsubmode)
c6=hiscall(1:6)
if(c6.eq.' ') c6='<b> '
c4=hisgrid(1:4)
if(c4.eq.' ') c4='<b> '
fmt='(i6.4,1x,a4,i5,4i2,6i3,i4,f6.2,f7.1,f6.1,f7.1,f6.2,'// &
'1x,a6,1x,a6,1x,a4,1x,a)'
if(ntrperiod.le.30) fmt(5:5)='6'
if(idec.eq.3) nrc=0
write(22,fmt) nutc,cmode,nfqso,nQSOprogress,idec,idfbest,idtbest, &
ibw,ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,plog, &
tdecode,mycall(1:6),c6,c4,trim(decoded)
close(22)
endif
endif
endif
navg0=1000*navg(0) + navg(1)
@ -331,6 +345,7 @@ contains
call q65_loops(c00,npts/2,nsps/2,nsubmode,ndepth,jpk0, &
xdt,f0,iaptype,xdt1,f1,snr2,dat4,idec)
call timer('q65loops',1)
! write(*,3001) '=e',nfqso,ntol,ndepth,xdt,f0,idec
if(idec.ge.0) then
dtdec=xdt1
f0dec=f1
@ -342,33 +357,41 @@ contains
if(idec.ge.0) then
! Unpack decoded message for display to user
write(c77,1000) dat4(1:12),dat4(13)/2
call unpack77(c77,1,decoded,unpk77_success) !Unpack to get msgsent
call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2)
nsnr=nint(snr2)
call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, &
idec,nused,ntrperiod)
call q65_hist(nint(f0dec),msg0=decoded)
if(iand(ndepth,128).ne.0 .and. .not.lagain .and. &
int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg
call sec0(1,tdecode)
open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown', &
position='append',iostat=ios)
if(ios.eq.0) then
call unpack77(c77,1,decoded,unpk77_success) !Unpack to get decoded
idupe=0
do i=1,ndecodes
if(decodes(i).eq.decoded) idupe=1
enddo
if(idupe.eq.0) then
ndecodes=min(ndecodes+1,100)
decodes(ndecodes)=decoded
call q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2)
nsnr=nint(snr2)
call this%callback(nutc,snr1,nsnr,dtdec,f0dec,decoded, &
idec,nused,ntrperiod)
call q65_hist(nint(f0dec),msg0=decoded)
if(iand(ndepth,128).ne.0 .and. .not.lagain .and. &
int(abs(f0dec-nfqso)).le.ntol ) call q65_clravg !AutoClrAvg
call sec0(1,tdecode)
open(22,file=trim(data_dir)//'/q65_decodes.dat',status='unknown', &
position='append',iostat=ios)
if(ios.eq.0) then
! Save decoding parameters to q65_decoded.dat, for later analysis.
write(cmode,'(i3)') ntrperiod
cmode(4:4)=char(ichar('A')+nsubmode)
c6=hiscall(1:6)
if(c6.eq.' ') c6='<b> '
c4=hisgrid(1:4)
if(c4.eq.' ') c4='<b> '
fmt='(i6.4,1x,a4,4i2,6i3,i4,f6.2,f7.1,f6.1,f7.1,f6.2,'// &
'1x,a6,1x,a6,1x,a4,1x,a)'
if(ntrperiod.le.30) fmt(5:5)='6'
if(idec.eq.3) nrc=0
write(22,fmt) nutc,cmode,nQSOprogress,idec,idfbest,idtbest,ibw, &
ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,plog, &
tdecode,mycall(1:6),c6,c4,trim(decoded)
close(22)
write(cmode,'(i3)') ntrperiod
cmode(4:4)=char(ichar('A')+nsubmode)
c6=hiscall(1:6)
if(c6.eq.' ') c6='<b> '
c4=hisgrid(1:4)
if(c4.eq.' ') c4='<b> '
fmt='(i6.4,1x,a4,i5,4i2,6i3,i4,f6.2,f7.1,f6.1,f7.1,f6.2,'// &
'1x,a6,1x,a6,1x,a4,1x,a)'
if(ntrperiod.le.30) fmt(5:5)='6'
if(idec.eq.3) nrc=0
write(22,fmt) nutc,cmode,nfqso,nQSOprogress,idec,idfbest,idtbest, &
ibw,ndistbest,nused,icand,ncand,nrc,ndepth,xdt,f0,snr2,plog, &
tdecode,mycall(1:6),c6,c4,trim(decoded)
close(22)
endif
endif
endif
enddo ! icand

View File

@ -171,8 +171,6 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, &
call timer('list_dec',0)
call q65_dec_q3(s1,iz,jz,s3,LL,ipk,jpk,snr2,dat4,idec,decoded)
call timer('list_dec',1)
! if(idec.ge.0) write(70,3070) idec,mode_q65,better,trim(decoded)
!3070 format(i3,i5,f8.2,2x,a)
endif
! If idec=3 we have a q3 decode. Continue to compute sync curve for plotting.
endif
@ -250,16 +248,15 @@ subroutine q65_dec0(iavg,nutc,iwave,ntrperiod,nfqso,ntol,ndepth,lclearave, &
call q65_ccf_85(s1w,iz,jz,nfqso,ia,ia2,ipk,jpk,f0,xdt,imsg_best, &
better,ccf1)
call timer('ccf_85 ',1)
! nsubmode is Tone-spacing indicator, 0-4 for A-E: a 0; b 1; c 2; d 3; e 4.
! and mode_q65=2**nsubmode
! nsubmode is Tone-spacing indicator, 0-4 for A-E: a 0; b 1; c 2; d 3; e 4.
! and mode_q65=2**nsubmode
if(better.ge.1.10) then
! if(better.ge.1.04 .or. mode_q65.ge.8) then
! if(better.ge.1.10 .or. mode_q65.ge.8) then ORIGINAL
call timer('list_dec',0)
call q65_dec_q3(s1w,iz,jz,s3,LL,ipk,jpk,snr2,dat4,idec,decoded)
call timer('list_dec',1)
! if(idec.ge.0) write(70,3070) idec,mode_q65,better,trim(decoded)
!3070 format(i3,i5,f8.2,2x,a)
endif ! if(better.ge.1.10)
endif ! if(ncw.gt.0 .and. iavg.le.1)
! If idec=3 we have a q3 decode. Continue to compute sync curve for plotting.
@ -570,7 +567,6 @@ subroutine q65_ccf_22(s1,iz,jz,nfqso,ntol,ndepth,ntrperiod,iavg,ipk,jpk, &
i=indx(k)+ia-1
if(ccf2(i).lt.3.3) exit !Candidate limit
f=i*df
if(f.ge.(nfqso-ftol) .and. f.le.(nfqso+ftol)) cycle !Looked here already
i3=max(1, i-mode_q65)
i4=min(iz,i+mode_q65)
biggest=maxval(ccf2(i3:i4))
@ -785,9 +781,8 @@ subroutine q65_snr(dat4,dtdec,f0dec,mode_q65,nused,snr2)
sig_area=sum(spec(ia+nsum:ib-nsum)-1.0)
w_equiv=sig_area/(smax-1.0)
snr2=db(max(1.0,sig_area)) - db(2500.0/df)
if(nused.eq.2) snr2=snr2 - 2.0
if(nused.eq.3) snr2=snr2 - 2.9
if(nused.ge.4) snr2=snr2 - 3.5
! NB: No adjustment to SNR is now made for nused>1, because that process did
! not seem to work as expected.
return
end subroutine q65_snr

9
lib/save_dxbase.f90 Normal file
View File

@ -0,0 +1,9 @@
subroutine save_dxbase(dxbase0)
use packjt77
character*6 dxbase0
dxbase=dxbase0
return
end subroutine save_dxbase

67
lib/test_snr.f90 Normal file
View File

@ -0,0 +1,67 @@
program test_snr
! Test an algorithm for measuring SNR of EME echoes.
use wavhdr
parameter (NMAX=27648) !27*1024
parameter (NFFT=32768,NH=NFFT/2)
parameter (NZ=4096)
type(hdr) h !Header for the .wav file
integer*2 id2(NMAX) !Buffer for Rx data
complex c(0:NH)
real x(NFFT)
real s(8192)
real sa(4096)
real sb(4096)
real red(4096)
real blue(4096)
character*80 infile
equivalence (x,c)
nargs=iargc()
if(nargs.lt.1) then
print*,'Usage: test_snr <infile>'
go to 999
endif
call getarg(1,infile)
i0=index(infile,'_')
read(infile(1:i0-1),*) fspread0 !Generated Doppler spread
read(infile(i0+1:i0+3),*) snrdb0 !Generated SNR
open(10,file=trim(infile),status='old',access='stream')
read(10) h
npts=h%ndata/2
npings=npts/NMAX
nfsample=h%nsamrate
df=12000.0/NFFT
s=0.
fac=1.0/NMAX
do iping=1,npings
read(10) id2(1:NMAX)
x(1:NMAX)=fac*id2(1:NMAX)
x(NMAX+1:)=0.
call four2a(x,NFFT,1,-1,0)
do i=1,8192 !Accumulate spectrum 0 - 3 kHz
s(i)=s(i) + real(c(i))**2 + aimag(c(i))**2
enddo
enddo
sa=s(2049:6144)
sb=s(2049:6144)
call echo_snr(sa,sb,fspread0,blue,red,snrdb,db_err,fpeak,snr_detect)
nqual=min(10,int(snr_detect-4.0))
write(*,1010) fspread0,snrdb0,snrdb,snrdb-snrdb0,db_err,fpeak, &
snr_detect,nqual
1010 format(5f6.1,2f7.1,i4)
do i=1,8192
write(12,1100) i*df,s(i)
1100 format(f10.3,e15.6)
enddo
999 end program test_snr

View File

@ -196,7 +196,7 @@ int get_wspr_channel_symbols(char* rawmessage, char* hashtab, char* loctab, unsi
// Use the presence and/or absence of "<" and "/" to decide what
// type of message. No sanity checks! Beware!
if( i1 > 3 && i1 < 7 && i2 == mlen && i3 == mlen ) {
if( i1 >= 3 && i1 < 7 && i2 == mlen && i3 == mlen ) {
// Type 1 message: K9AN EN50 33
// xxnxxxx xxnn nn
callsign = strtok(message," ");

View File

@ -103,13 +103,13 @@ void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid,
sprintf(cc,"%2.2d:%2.2d:%2.2d,%5.1f,%5.1f,Moon\n"
"%2.2d:%2.2d:%2.2d,%5.1f,%5.1f,Sun\n"
"%2.2d:%2.2d:%2.2d,%5.1f,%5.1f,Source\n"
"%4d,%6d,Doppler\n"
"%4d,%6d,%6d,Doppler\n"
"%3d,%1d,fQSO\n"
"%3d,%1d,fQSO2\n",
nhr,nmin,isec,azmoon,elmoon,
nhr,nmin,isec,azsun,elsun,
nhr,nmin,isec,0.0,0.0,
nfreq,ndop,
nfreq,ndop,ndop00,
fQSO,nsetftx,
ntxFreq,ndiff);
out << cc;

View File

@ -106,8 +106,8 @@ void DevSetup::initDlg()
ui.comboBoxSndOut->setCurrentIndex(m_nDevOut);
ui.sbPort->setValue(m_udpPort);
ui.cbIQswap->setChecked(m_IQswap);
ui.cb10db->setChecked(m_10db);
ui.cbInitIQplus->setChecked(m_initIQplus);
ui.sb_dB->setValue(m_dB);
ui.mult570SpinBox->setValue(m_mult570);
ui.mult570TxSpinBox->setValue(m_mult570Tx);
ui.cal570SpinBox->setValue(m_cal570);
@ -176,8 +176,8 @@ void DevSetup::accept()
m_paOutDevice=m_outDevList[m_nDevOut];
m_udpPort=ui.sbPort->value();
m_IQswap=ui.cbIQswap->isChecked();
m_10db=ui.cb10db->isChecked();
m_initIQplus=ui.cbInitIQplus->isChecked();
m_dB=ui.sb_dB->value();
m_mult570=ui.mult570SpinBox->value();
m_mult570Tx=ui.mult570TxSpinBox->value();
m_cal570=ui.cal570SpinBox->value();
@ -195,7 +195,7 @@ void DevSetup::on_soundCardRadioButton_toggled(bool checked)
ui.label_Port->setEnabled(!checked);
ui.sbPort->setEnabled(!checked);
ui.cbIQswap->setEnabled(checked);
ui.cb10db->setEnabled(checked);
ui.sb_dB->setEnabled(checked);
}
void DevSetup::on_cbXpol_stateChanged(int n)
@ -217,6 +217,11 @@ void DevSetup::on_mult570SpinBox_valueChanged(int mult)
m_mult570=mult;
}
void DevSetup::on_sb_dB_valueChanged(int n)
{
m_dB=n;
}
void DevSetup::updateColorLabels()
{
QString t;

View File

@ -27,6 +27,7 @@ public:
qint32 m_astroFont;
qint32 m_mult570;
qint32 m_mult570Tx;
qint32 m_dB;
double m_fAdd;
double m_cal570;
@ -39,7 +40,6 @@ public:
bool m_IQswap;
bool m_restartSoundIn;
bool m_restartSoundOut;
bool m_10db;
bool m_initIQplus;
bool m_bIQxt;
@ -81,6 +81,7 @@ private slots:
void on_mult570TxSpinBox_valueChanged(int arg1);
void on_rbIQXT_toggled(bool checked);
void on_sbTxOffset_valueChanged(double f);
void on_sb_dB_valueChanged(int n);
private:
int r,g,b,r0,g0,b0,r1,g1,b1,r2,g2,b2,r3,g3,b3;

View File

@ -698,12 +698,24 @@
</widget>
</item>
<item>
<widget class="QCheckBox" name="cb10db">
<property name="enabled">
<bool>false</bool>
<widget class="QSpinBox" name="sb_dB">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Adjust to scale digital I/Q data.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>+10 dB</string>
<property name="suffix">
<string> dB</string>
</property>
<property name="prefix">
<string>Gain </string>
</property>
<property name="minimum">
<number>-50</number>
</property>
<property name="maximum">
<number>10</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
</widget>
</item>
@ -1772,8 +1784,8 @@
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
<x>257</x>
<y>380</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
@ -1788,8 +1800,8 @@
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
<x>325</x>
<y>380</y>
</hint>
<hint type="destinationlabel">
<x>286</x>

View File

@ -47,6 +47,8 @@ subroutine get_candidates(ss,savg,xpol,jz,nfa,nfb,nts_jt65,nts_q65,cand,ncand)
df3=96000.0/NFFT
ia=nint(1000*nfa/df3) + 1
ib=nint(1000*nfb/df3) + 1
if(ia.lt.1) ia=1
if(ib.gt.NFFT-1) ib=NFFT-1
iz=ib-ia+1
call indexx(sync(ia:ib)%ccfmax,iz,indx) !Sort by relative snr
@ -151,6 +153,8 @@ subroutine wb_sync(ss,savg,xpol,jz,nfa,nfb)
df3=96000.0/NFFT
ia=nint(1000*nfa/df3) + 1 !Flat frequency range for WSE converters
ib=nint(1000*nfb/df3) + 1
if(ia.lt.1) ia=1
if(ib.gt.NFFT-1) ib=NFFT-1
npol=1
if(xpol) npol=4

View File

@ -372,7 +372,7 @@ void MainWindow::writeSettings()
settings.setValue("SoundOutIndex",m_nDevOut);
settings.setValue("paOutDevice",m_paOutDevice);
settings.setValue("IQswap",m_IQswap);
settings.setValue("Plus10dB",m_10db);
settings.setValue("Scale_dB",m_dB);
settings.setValue("IQxt",m_bIQxt);
settings.setValue("InitIQplus",m_initIQplus);
settings.setValue("UDPport",m_udpPort);
@ -447,12 +447,12 @@ void MainWindow::readSettings()
m_nDevOut = settings.value("SoundOutIndex", 0).toInt();
m_paOutDevice = settings.value("paOutDevice",0).toInt();
m_IQswap = settings.value("IQswap",false).toBool();
m_10db = settings.value("Plus10dB",false).toBool();
m_dB = settings.value("Scale_dB",0).toInt();
m_initIQplus = settings.value("InitIQplus",false).toBool();
m_bIQxt = settings.value("IQxt",false).toBool();
m_udpPort = settings.value("UDPport",50004).toInt();
soundInThread.setSwapIQ(m_IQswap);
soundInThread.set10db(m_10db);
soundInThread.setScale(m_dB);
soundInThread.setPort(m_udpPort);
ui->actionCuteSDR->setChecked(settings.value(
"PaletteCuteSDR",true).toBool());
@ -682,7 +682,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog
dlg.m_nDevOut=m_nDevOut;
dlg.m_udpPort=m_udpPort;
dlg.m_IQswap=m_IQswap;
dlg.m_10db=m_10db;
dlg.m_dB=m_dB;
dlg.m_initIQplus=m_initIQplus;
dlg.m_bIQxt=m_bIQxt;
dlg.m_cal570=m_cal570;
@ -719,7 +719,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog
m_paOutDevice=dlg.m_paOutDevice;
m_udpPort=dlg.m_udpPort;
m_IQswap=dlg.m_IQswap;
m_10db=dlg.m_10db;
m_dB=dlg.m_dB;
m_initIQplus=dlg.m_initIQplus;
m_bIQxt=dlg.m_bIQxt;
m_colors=dlg.m_colors;
@ -732,7 +732,7 @@ void MainWindow::on_actionDeviceSetup_triggered() //Setup Dialog
m_wide_graph_window->m_mult570Tx=m_mult570Tx;
m_wide_graph_window->m_cal570=m_cal570;
soundInThread.setSwapIQ(m_IQswap);
soundInThread.set10db(m_10db);
soundInThread.setScale(m_dB);
if(dlg.m_restartSoundIn) {
soundInThread.quit();
@ -1410,7 +1410,7 @@ void MainWindow::readFromStdout() //readFromStdout
#ifdef WIN32
m=3;
#endif
if(n>=30) ui->decodedTextBrowser->append(t.mid(1,n-m));
if(n>=30 or t.indexOf("Best-fit")>=0) ui->decodedTextBrowser->append(t.mid(1,n-m));
n=ui->decodedTextBrowser->verticalScrollBar()->maximum();
ui->decodedTextBrowser->verticalScrollBar()->setValue(n);
m_messagesText="";
@ -1439,7 +1439,6 @@ void MainWindow::readFromStdout() //readFromStdout
int n=t.size();
qDebug() << t.mid(1,n-3).trimmed();
}
}
}

View File

@ -192,6 +192,7 @@ private:
qint32 m_modeJT65;
qint32 m_modeQ65;
qint32 m_RxState;
qint32 m_dB;
double m_fAdd;
@ -220,7 +221,6 @@ private:
bool m_NB;
bool m_fs96000;
bool m_IQswap;
bool m_10db;
bool m_initIQplus;
bool m_bIQxt;

View File

@ -1,4 +1,5 @@
#include "soundin.h"
#include <math.h>
#ifdef Q_OS_WIN32
#include <windows.h>
@ -53,9 +54,9 @@ typedef struct
{
int kin; //Parameters sent to/from the portaudio callback function
int nrx;
int dB;
bool bzero;
bool iqswap;
bool b10db;
} paUserData;
//--------------------------------------------------------------- a2dCallback
@ -91,8 +92,7 @@ extern "C" int a2dCallback( const void *inputBuffer, void *outputBuffer,
nbytes=udata->nrx*8*framesToProcess; //Bytes per frame
memcpy(d4,inputBuffer,nbytes); //Copy all samples to d4
fac=32767.0;
if(udata->b10db) fac=103618.35;
fac=32767.0 * pow(10.0,0.05*udata->dB);
if(udata->nrx==2) {
for(i=0; i<4*int(framesToProcess); i++) { //Negate odd-numbered frames
@ -185,7 +185,7 @@ void SoundInThread::run() //SoundInThread::run()
udata.bzero=false; //Flag to request reset of kin
udata.nrx=m_nrx; //Number of polarizations
udata.iqswap=m_IQswap;
udata.b10db=m_10db;
udata.dB=m_dB;
auto device_info = Pa_GetDeviceInfo (m_nDevIn);
@ -251,7 +251,7 @@ void SoundInThread::run() //SoundInThread::run()
}
k=udata.kin;
udata.iqswap=m_IQswap;
udata.b10db=m_10db;
udata.dB=m_dB;
if(m_monitoring) {
if(m_bForceCenterFreq) {
datcom_.fcenter=m_dForceCenterFreq;
@ -281,9 +281,9 @@ void SoundInThread::setSwapIQ(bool b)
m_IQswap=b;
}
void SoundInThread::set10db(bool b)
void SoundInThread::setScale(qint32 n)
{
m_10db=b;
m_dB=n;
}
void SoundInThread::setPort(int n) //setPort()
{

View File

@ -30,7 +30,7 @@ public:
}
void setSwapIQ(bool b);
void set10db(bool b);
void setScale(qint32 n);
void setPort(qint32 n);
void setInputDevice(qint32 n);
void setRate(double rate);
@ -62,7 +62,6 @@ private:
bool m_monitoring;
bool m_bForceCenterFreq;
bool m_IQswap;
bool m_10db;
double m_dForceCenterFreq;
qint32 m_nrx;
qint32 m_hsym;
@ -70,6 +69,7 @@ private:
qint32 m_udpPort;
qint32 m_TRperiod;
qint32 m_TRperiod0;
qint32 m_dB;
QUdpSocket *udpSocket;
};

View File

@ -73,7 +73,9 @@ public:
Configuration const * configuration_;
QSqlQuery mutable dupe_query_;
QSqlQuery mutable export_query_;
QSqlQuery mutable qso_count_query_;
bool adding_row_;
int n_qso();
};
CabrilloLog::impl::impl (CabrilloLog * self, Configuration const * configuration)
@ -109,6 +111,7 @@ CabrilloLog::impl::impl (CabrilloLog * self, Configuration const * configuration
{
Q_EMIT self_->data_changed ();
}
Q_EMIT self_->qso_count_changed(self_->n_qso());
});
SQL_error_check (*this, &QSqlTableModel::select);
@ -132,6 +135,10 @@ CabrilloLog::impl::impl (CabrilloLog * self, Configuration const * configuration
" cabrillo_log_v2 "
" ORDER BY "
" \"when\"");
SQL_error_check (qso_count_query_, &QSqlQuery::prepare,
"SELECT COUNT(*) FROM cabrillo_log_v2");
}
void CabrilloLog::impl::create_table ()
@ -234,8 +241,10 @@ bool CabrilloLog::add_QSO (Frequency frequency, QString const& mode, QDateTime c
m_->adding_row_ = true;
auto ok = m_->insertRecord (-1, record);
transaction.submit ();
m_->adding_row_ = false;
m_->setEditStrategy (QSqlTableModel::OnFieldChange);
Q_EMIT this->qso_count_changed(this->n_qso());
return ok;
}
@ -256,6 +265,13 @@ bool CabrilloLog::dupe (Frequency frequency, QString const& call) const
return false;
}
int CabrilloLog::n_qso()
{
SQL_error_check (m_->qso_count_query_, static_cast<bool (QSqlQuery::*) ()> (&QSqlQuery::exec));
m_->qso_count_query_.first();
return m_->qso_count_query_.value(0).toInt();
}
void CabrilloLog::reset ()
{
// synchronize model

View File

@ -31,6 +31,7 @@ public:
bool add_QSO (Frequency, QString const& mode, QDateTime const&, QString const& call
, QString const& report_sent, QString const& report_received);
bool dupe (Frequency, QString const& call) const;
int n_qso();
QSqlTableModel * model ();
void reset ();
@ -38,6 +39,7 @@ public:
worked_set unique_DXCC_entities (AD1CCty const *) const;
Q_SIGNAL void data_changed () const;
Q_SIGNAL void qso_count_changed (int) const;
private:
class impl;

View File

@ -278,10 +278,10 @@ namespace
{50318000, Modes::FT4, IARURegions::ALL}, // provisional
{50323000, Modes::FT8, IARURegions::ALL},
{70100000, Modes::FT8, IARURegions::R1},
{70102000, Modes::JT65, IARURegions::R1},
{70104000, Modes::JT9, IARURegions::R1},
{70091000, Modes::WSPR, IARURegions::R1},
{70154000, Modes::FT8, IARURegions::R1},
{70230000, Modes::MSK144, IARURegions::R1},
{144116000, Modes::Q65, IARURegions::ALL},

View File

@ -80,5 +80,5 @@ QString version (bool include_patch)
QString program_title (QString const& revision)
{
QString id {QCoreApplication::applicationName () + " v" + QCoreApplication::applicationVersion ()};
return id + " " + revision + " by K1JT, G4WJS, K9AN, and IV3NWV";
return id + " " + revision + " by K1JT et al.";
}

6695
translations/wsjtx_ru.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -10,6 +10,7 @@
#include <QSqlTableModel>
#include <QItemSelectionModel>
#include <QItemSelection>
#include <QTimer>
#include "Configuration.hpp"
#include "SettingsGroup.hpp"
#include "MessageBox.hpp"
@ -71,7 +72,7 @@ void AbstractLogWindow::impl::delete_QSOs ()
{
// We must work with source model indexes because we don't want row
// removes to invalidate model indexes we haven't yet processed. We
// achieve that by processing them in decending row order.
// achieve that by processing them in descending row order.
for (auto& row_index : row_indexes)
{
row_index = model_.mapToSource (row_index);
@ -79,38 +80,47 @@ void AbstractLogWindow::impl::delete_QSOs ()
// reverse sort by row
std::sort (row_indexes.begin (), row_indexes.end (), row_is_higher);
for (auto index : row_indexes)
{
auto row = model_.mapFromSource (index).row ();
model_.removeRow (row);
self_->log_model_changed ();
auto row = model_.mapFromSource(index).row();
model_.removeRow(row);
self_->log_model_changed();
}
}
}
AbstractLogWindow::AbstractLogWindow (QString const& settings_key, QSettings * settings
, Configuration const * configuration
, QWidget * parent)
: QWidget {parent}
, m_ {this, settings_key, settings, configuration}
{
// this attempt to scroll to the last new record doesn't work, some
// sort of issue with model indexes and optimized DB fetches. For
// now sorting by the same column and direction as the underlying DB
// select and that DB select being in descending order so new rows
// at the end appear at view row 0 gets the job done
, m_ {this, settings_key, settings, configuration} {
// when we're viewing the log by contact ID (visually, up/down chevron in the column heading),
// when we add a contact, scroll the list to the top or bottom, depending on the sort order.
// If the table is sorted by some other criteria, don't change anything.
// // ensure view scrolls to latest new row
// connect (&m_->model_, &QAbstractItemModel::rowsInserted, this, [this] (QModelIndex const& parent, int first, int last) {
// // note col 0 is hidden so use col 1
// // queued connection required otherwise row may not be available
// // in time
// auto index = m_->model_.index (last, 1, parent);
// if (m_->log_view_)
// {
// m_->log_view_->scrollTo (index);
// }
// }, Qt::QueuedConnection);
connect(&m_->model_, &QAbstractItemModel::rowsInserted, this,
[this](QModelIndex const &parent, int first, int last) {
(void) (parent); // UNUSED
(void) (first); // UNUSED
(void) (last); // UNUSED
QTimer::singleShot(0, [=] {
// if we're sorting by the date, then show the most-recently logged contact.
// Otherwise, leave the scroll alone
auto horizontal_header = m_->log_view_->horizontalHeader ();
if (horizontal_header->sortIndicatorSection() == 3) { // sorting on date?
if (horizontal_header->sortIndicatorOrder() == Qt::AscendingOrder) {
// we're sorting oldes->newest, so go to bottom
m_->log_view_->scrollToBottom();
} else {
m_->log_view_->scrollToTop();
}
}
});
}
);
}
AbstractLogWindow::~AbstractLogWindow ()
@ -134,11 +144,14 @@ void AbstractLogWindow::set_log_view (QTableView * log_view)
log_view->setVerticalScrollMode (QAbstractItemView::ScrollPerPixel);
m_->model_.setSourceModel (log_view->model ());
log_view->setModel (&m_->model_);
log_view->setColumnHidden (0, true);
log_view->setColumnHidden (0, true); // hide the ID column
auto horizontal_header = log_view->horizontalHeader ();
horizontal_header->setResizeContentsPrecision (0); // visible region only
horizontal_header->setSectionResizeMode (QHeaderView::ResizeToContents);
horizontal_header->setSectionsMovable (true);
horizontal_header->setSortIndicator(3, Qt::AscendingOrder); // sort by the contact datetime oldest->newest
auto vertical_header = log_view->horizontalHeader ();
vertical_header->setResizeContentsPrecision (0); // visible region only
vertical_header->setSectionResizeMode (QHeaderView::ResizeToContents);
@ -149,6 +162,9 @@ void AbstractLogWindow::set_log_view (QTableView * log_view)
connect (delete_action, &QAction::triggered, [this] (bool /*checked*/) {
m_->delete_QSOs ();
});
// scroll to bottom, since we're showing 1-N
log_view->scrollToBottom();
}
void AbstractLogWindow::set_log_view_font (QFont const& font)

View File

@ -70,7 +70,9 @@ CabrilloLogWindow::CabrilloLogWindow (QSettings * settings, Configuration const
m_->ui_.log_table_view->setItemDelegateForColumn (3, new SQLiteDateTimeDelegate {this});
m_->ui_.log_table_view->setItemDelegateForColumn (4, new CallsignDelegate {this});
auto h_header = m_->ui_.log_table_view->horizontalHeader ();
m_->ui_.log_table_view->verticalHeader()->setVisible(false); // turn off line numbers for the table view
h_header->moveSection (7, 1); // band to first column
}
CabrilloLogWindow::~CabrilloLogWindow ()
@ -88,3 +90,10 @@ void CabrilloLogWindow::log_model_changed (int row)
m_->log_model_->select ();
}
}
void CabrilloLogWindow::set_nQSO(int n)
{
QString t;
t=t.asprintf("%d QSOs",n);
m_->ui_.nQSO_lineEdit->setText(t);
}

View File

@ -16,6 +16,7 @@ public:
explicit CabrilloLogWindow (QSettings *, Configuration const *, QSqlTableModel * cabrillo_log_model
, QWidget * parent = nullptr);
~CabrilloLogWindow ();
Q_SLOT void set_nQSO(int n);
private:
void log_model_changed (int row) override;

View File

@ -27,6 +27,25 @@
</attribute>
</widget>
</item>
<item>
<widget class="QLineEdit" name="nQSO_lineEdit">
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="text">
<string>0 QSOs</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>

View File

@ -39,8 +39,8 @@ namespace
FrequencyDeltaLineEdit::FrequencyDeltaLineEdit (QWidget * parent)
: QLineEdit (parent)
{
setValidator (new MHzValidator {-std::numeric_limits<FrequencyDelta>::max () / 10.e6,
std::numeric_limits<FrequencyDelta>::max () / 10.e6, this});
setValidator (new MHzValidator {static_cast<double>(std::numeric_limits<FrequencyDelta>::min ()) / 10.e6,
static_cast<double>(std::numeric_limits<FrequencyDelta>::max ()) / 10.e6, this});
}
auto FrequencyDeltaLineEdit::frequency_delta () const -> FrequencyDelta

View File

@ -39,7 +39,7 @@ namespace
FrequencyLineEdit::FrequencyLineEdit (QWidget * parent)
: QLineEdit (parent)
{
setValidator (new MHzValidator {0., std::numeric_limits<Radio::Frequency>::max () / 10.e6, this});
setValidator (new MHzValidator {0., static_cast<double>(std::numeric_limits<Radio::Frequency>::max ()) / 10.e6, this});
}
auto FrequencyLineEdit::frequency () const -> Frequency

View File

@ -15,11 +15,15 @@ CAboutDlg::CAboutDlg(QWidget *parent) :
ui->labelTxt->setText ("<h2>" + QString {"WSJT-X v"
+ QCoreApplication::applicationVersion ()
+ " " + revision ()}.simplified () + "</h2><br />"
+ " " + revision ()}.simplified () + "</h2>"
"<h3> In memory of G4WJS, Bill Somerville (1956-2021),<br />"
"who gave so much of himself to the WSJT project. </h3>"
"WSJT-X implements a number of digital modes designed for <br />"
"weak-signal Amateur Radio communication. <br /><br />"
"&copy; 2001-2021 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"
"Steve Franke, K9AN, and Nico Palermo, IV3NWV. <br /><br />"
"&copy; 2001-2022 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"
"Steve Franke, K9AN, Nico Palermo, IV3NWV, <br />"
"Chester Fennell, KG4IYS, and Uwe Risse, DG2YCB <br /><br />"
"We gratefully acknowledge contributions from AC6SL, AE4JY,<br />"
"DF2ET, DJ0OT, G3WDG, G4KLA, IW3RAB, K3WYC, KA1GT,<br />"
"KA6MAL, KA9Q, KB1ZMX, KD6EKQ, KI7MT, KK1D, ND0B, PY2SDR,<br />"

125
widgets/activeStations.cpp Normal file
View File

@ -0,0 +1,125 @@
#include "activeStations.h"
#include <QSettings>
#include <QApplication>
#include <QTextCharFormat>
#include <QDateTime>
#include <QDebug>
#include "SettingsGroup.hpp"
#include "qt_helpers.hpp"
#include "ui_activeStations.h"
#include "moc_activeStations.cpp"
ActiveStations::ActiveStations(QSettings * settings, QFont const& font, QWidget *parent) :
QWidget(parent),
settings_ {settings},
ui(new Ui::ActiveStations)
{
ui->setupUi(this);
setWindowTitle (QApplication::applicationName () + " - " + tr ("Active Stations"));
ui->RecentStationsPlainTextEdit->setReadOnly (true);
changeFont (font);
read_settings ();
ui->header_label2->setText(" N Call Grid Az S/N Freq Tx Age Pts");
connect(ui->RecentStationsPlainTextEdit, SIGNAL(selectionChanged()), this, SLOT(select()));
connect(ui->cbReadyOnly, SIGNAL(toggled(bool)), this, SLOT(on_cbReadyOnly_toggled(bool)));
}
ActiveStations::~ActiveStations()
{
write_settings ();
}
void ActiveStations::changeFont (QFont const& font)
{
ui->header_label2->setStyleSheet (font_as_stylesheet (font));
ui->RecentStationsPlainTextEdit->setStyleSheet (font_as_stylesheet (font));
updateGeometry ();
}
void ActiveStations::read_settings ()
{
SettingsGroup group {settings_, "ActiveStations"};
restoreGeometry (settings_->value ("window/geometry").toByteArray ());
ui->sbMaxRecent->setValue(settings_->value("MaxRecent",10).toInt());
ui->sbMaxAge->setValue(settings_->value("MaxAge",10).toInt());
ui->cbReadyOnly->setChecked(settings_->value("ReadyOnly",false).toBool());
}
void ActiveStations::write_settings ()
{
SettingsGroup group {settings_, "ActiveStations"};
settings_->setValue ("window/geometry", saveGeometry ());
settings_->setValue("MaxRecent",ui->sbMaxRecent->value());
settings_->setValue("MaxAge",ui->sbMaxAge->value());
settings_->setValue("ReadyOnly",ui->cbReadyOnly->isChecked());
}
void ActiveStations::displayRecentStations(QString const& t)
{
ui->RecentStationsPlainTextEdit->setPlainText(t);
}
int ActiveStations::maxRecent()
{
return ui->sbMaxRecent->value();
}
int ActiveStations::maxAge()
{
return ui->sbMaxAge->value();
}
void ActiveStations::select()
{
if(m_clickOK) {
qint64 msec=QDateTime::currentMSecsSinceEpoch();
if((msec-m_msec0)<500) return;
m_msec0=msec;
int nline=ui->RecentStationsPlainTextEdit->textCursor().blockNumber();
emit callSandP(nline);
}
}
void ActiveStations::setClickOK(bool b)
{
m_clickOK=b;
}
void ActiveStations::erase()
{
ui->RecentStationsPlainTextEdit->clear();
}
bool ActiveStations::readyOnly()
{
return ui->cbReadyOnly->isChecked();
}
void ActiveStations::on_cbReadyOnly_toggled(bool b)
{
m_bReadyOnly=b;
emit activeStationsDisplay();
}
void ActiveStations::setRate(int n)
{
ui->rate->setText(QString::number(n));
}
void ActiveStations::setScore(int n)
{
ui->score->setText(QLocale(QLocale::English).toString(n));
}
void ActiveStations::setBandChanges(int n)
{
if(n >= 8) {
ui->bandChanges->setStyleSheet("QLineEdit{background: rgb(255, 64, 64)}");
} else {
ui->bandChanges->setStyleSheet ("");
}
ui->bandChanges->setText(QString::number(n));
}

52
widgets/activeStations.h Normal file
View File

@ -0,0 +1,52 @@
// -*- Mode: C++ -*-
#ifndef ARRL_DIGI_H_
#define ARRL_DIGI_H_
#include <QWidget>
class QSettings;
class QFont;
namespace Ui {
class ActiveStations;
}
class ActiveStations
: public QWidget
{
Q_OBJECT
public:
explicit ActiveStations(QSettings *, QFont const&, QWidget * parent = 0);
~ActiveStations();
void displayRecentStations(QString const&);
void changeFont (QFont const&);
int maxRecent();
int maxAge();
void setClickOK(bool b);
void erase();
bool readyOnly();
void setRate(int n);
void setBandChanges(int n);
void setScore(int n);
Q_SLOT void select();
bool m_clickOK=false;
bool m_bReadyOnly;
signals:
void callSandP(int nline);
void activeStationsDisplay();
private:
void read_settings ();
void write_settings ();
Q_SLOT void on_cbReadyOnly_toggled(bool b);
qint64 m_msec0=0;
QSettings * settings_;
QScopedPointer<Ui::ActiveStations> ui;
};
#endif

202
widgets/activeStations.ui Normal file
View File

@ -0,0 +1,202 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ActiveStations</class>
<widget class="QWidget" name="ActiveStations">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>395</width>
<height>339</height>
</rect>
</property>
<property name="windowTitle">
<string>Message Averaging</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QSpinBox" name="sbMaxRecent">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set maximum number of displayed lines.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="prefix">
<string>Max N </string>
</property>
<property name="maximum">
<number>50</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QLineEdit" name="rate">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Points logged during the past hour.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QSpinBox" name="sbMaxAge">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set maximum elapsed number of T/R sequences.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="prefix">
<string>Max Age </string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>10</number>
</property>
<property name="value">
<number>4</number>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Score:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="label">
<property name="text">
<string>Rate:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QLineEdit" name="score">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Total score accumulated since most recent reset of Cabrillo log.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QCheckBox" name="cbReadyOnly">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check tis box to show only stations ready to be called.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Ready only</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Band Changes:</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLineEdit" name="bandChanges">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Number of band changes during the past hour.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>0</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QPlainTextEdit" name="RecentStationsPlainTextEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Click on a line to call that station.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="header_label2">
<property name="text">
<string>Call Grid Age Points</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -121,12 +121,6 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const
AzElFileName.toLocal8Bit ().constData (),
jpleph.toLocal8Bit ().constData ());
if(!hisgrid.size ()) {
azmoondx=0.0;
elmoondx=0.0;
m_dop=0;
width2=0.0;
}
QString message;
{
QTextStream out {&message};

View File

@ -277,6 +277,8 @@ QString DisplayText::appendWorkedB4 (QString message, QString call, QString cons
gridB4onBand=true;
}
if(callB4onBand) m_points=0;
message = message.trimmed ();
highlight_types types;
@ -372,11 +374,17 @@ QString DisplayText::appendWorkedB4 (QString message, QString call, QString cons
}
m_CQPriority=DecodeHighlightingModel::highlight_name(top_highlight);
if(((m_points == 00) or (m_points == -1)) and m_bDisplayPoints) return message;
return leftJustifyAppendage (message, extra);
}
QString DisplayText::leftJustifyAppendage (QString message, QString const& appendage) const
QString DisplayText::leftJustifyAppendage (QString message, QString const& appendage0) const
{
QString appendage=appendage0;
if(m_bDisplayPoints and (m_points>0)) {
appendage=" " + QString::number(m_points);
if(m_points<10) appendage=" " + appendage;
}
if (appendage.size ())
{
// allow for seconds
@ -398,12 +406,15 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con
QString const& mode,
bool displayDXCCEntity, LogBook const& logBook,
QString const& currentBand, bool ppfx, bool bCQonly,
bool haveFSpread, float fSpread)
bool haveFSpread, float fSpread, bool bDisplayPoints, int points)
{
m_points=points;
m_bDisplayPoints=bDisplayPoints;
m_bPrincipalPrefix=ppfx;
QColor bg;
QColor fg;
bool CQcall = false;
auto is_73 = decodedText.messageWords().filter (QRegularExpression {"^(73|RR73)$"}).size();
if (decodedText.string ().contains (" CQ ")
|| decodedText.string ().contains (" CQDX ")
|| decodedText.string ().contains (" QRZ "))
@ -413,19 +424,6 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con
else
{
if (bCQonly) return;
if (myCall.size ())
{
QString regexp {"[ <]" + myCall + "[ >]"};
if (Radio::is_compound_callsign (myCall))
{
regexp = "(?:" + regexp + "|[ <]" + Radio::base_callsign (myCall) + "[ >])";
}
if ((decodedText.clean_string () + " ").contains (QRegularExpression {regexp}))
{
highlight_types types {Highlight::MyCall};
set_colours (m_config, &bg, &fg, types);
}
}
}
auto message = decodedText.string();
QString dxCall;
@ -446,14 +444,14 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con
message = message.left (ap_pos).trimmed ();
}
m_CQPriority="";
if (CQcall)
if (CQcall || (is_73 && (m_config->highlight_73 ())))
{
if (displayDXCCEntity)
{
// if enabled add the DXCC entity and B4 status to the end of the
// preformated text line t1
auto currentMode = mode;
message = appendWorkedB4 (message, decodedText.CQersCall(), dxGrid, &bg, &fg
message = appendWorkedB4 (message, dxCall, dxGrid, &bg, &fg
, logBook, currentBand, currentMode, extra);
}
else
@ -472,6 +470,20 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con
message = leftJustifyAppendage (message, extra);
}
if (myCall.size ())
{
QString regexp {"[ <]" + myCall + "[ >]"};
if (Radio::is_compound_callsign (myCall))
{
regexp = "(?:" + regexp + "|[ <]" + Radio::base_callsign (myCall) + "[ >])";
}
if ((decodedText.clean_string () + " ").contains (QRegularExpression {regexp}))
{
highlight_types types {Highlight::MyCall};
set_colours (m_config, &bg, &fg, types);
}
}
appendText (message.trimmed (), bg, fg, decodedText.call (), dxCall);
}

View File

@ -30,12 +30,14 @@ public:
void displayDecodedText(DecodedText const& decodedText, QString const& myCall, QString const& mode,
bool displayDXCCEntity, LogBook const& logBook,
QString const& currentBand=QString {}, bool ppfx=false, bool bCQonly=false,
bool haveFSpread = false, float fSpread = 0.);
bool haveFSpread = false, float fSpread = 0.0, bool bDisplayPoints=false, int points=-99);
void displayTransmittedText(QString text, QString modeTx, qint32 txFreq, bool bFastMode, double TRperiod);
void displayQSY(QString text);
void displayFoxToBeCalled(QString t, QColor bg = QColor {}, QColor fg = QColor {});
void new_period ();
QString CQPriority(){return m_CQPriority;};
qint32 m_points;
bool m_bDisplayPoints;
Q_SIGNAL void selectCallsign (Qt::KeyboardModifiers);
Q_SIGNAL void erased ();

View File

@ -5,6 +5,7 @@
#include <QSettings>
#include <QStandardPaths>
#include <QDir>
#include <QPushButton>
#include "logbook/logbook.h"
#include "MessageBox.hpp"
@ -109,6 +110,15 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString
Radio::Frequency dialFreq, bool noSuffix, QString xSent, QString xRcvd)
{
if(!isHidden()) return;
QPushButton* okBtn = ui->buttonBox->button(QDialogButtonBox::Ok);
okBtn->setAutoDefault(true);
okBtn->setDefault(true);
okBtn->setFocus();
QPushButton* caBtn = ui->buttonBox->button(QDialogButtonBox::Cancel);
caBtn->setAutoDefault(false);
caBtn->setDefault(false);
ui->call->setText (hisCall);
ui->grid->setText (hisGrid);
ui->name->clear ();

File diff suppressed because it is too large Load Diff

View File

@ -78,6 +78,7 @@ class WideGraph;
class LogQSO;
class Transceiver;
class MessageAveraging;
class ActiveStations;
class FoxLogWindow;
class CabrilloLogWindow;
class ColorHighlighting;
@ -141,6 +142,12 @@ private:
private slots:
void initialize_fonts ();
void on_houndButton_clicked(bool checked);
void on_ft8Button_clicked();
void on_ft4Button_clicked();
void on_msk144Button_clicked();
void on_q65Button_clicked();
void on_jt65Button_clicked();
void on_tx1_editingFinished();
void on_tx2_editingFinished();
void on_tx3_editingFinished();
@ -204,6 +211,7 @@ private slots:
void on_addButton_clicked();
void on_dxCallEntry_textChanged (QString const&);
void on_dxGridEntry_textChanged (QString const&);
void on_dxCallEntry_editingFinished();
void on_dxCallEntry_returnPressed ();
void on_genStdMsgsPushButton_clicked();
void on_logQSOButton_clicked();
@ -260,6 +268,7 @@ private slots:
void stopTuneATU();
void auto_tx_mode(bool);
void on_actionMessage_averaging_triggered();
void on_actionActiveStations_triggered();
void on_contest_log_action_triggered ();
void on_fox_log_action_triggered ();
void on_actionColors_triggered();
@ -274,7 +283,6 @@ private slots:
void on_cbTx6_toggled(bool b);
void on_cbMenus_toggled(bool b);
void on_cbCQonly_toggled(bool b);
void on_cbFirst_toggled(bool b);
void on_cbAutoSeq_toggled(bool b);
void networkError (QString const&);
void on_ClrAvgButton_clicked();
@ -326,6 +334,7 @@ private slots:
void remote_configure (QString const& mode, quint32 frequency_tolerance, QString const& submode
, bool fast_mode, quint32 tr_period, quint32 rx_df, QString const& dx_call
, QString const& dx_grid, bool generate_messages);
void callSandP2(int nline);
private:
Q_SIGNAL void initializeAudioOutputStream (QAudioDeviceInfo,
@ -391,6 +400,7 @@ private:
QScopedPointer<HelpTextWindow> m_prefixes;
QScopedPointer<HelpTextWindow> m_mouseCmnds;
QScopedPointer<MessageAveraging> m_msgAvgWidget;
QScopedPointer<ActiveStations> m_ActiveStationsWidget;
QScopedPointer<FoxLogWindow> m_foxLogWindow;
QScopedPointer<CabrilloLogWindow> m_contestLogWindow;
QScopedPointer<ColorHighlighting> m_colorHighlighting;
@ -415,6 +425,7 @@ private:
qint64 m_fullFoxCallTime;
Frequency m_freqNominal;
Frequency m_freqNominalPeriod;
Frequency m_freqTxNominal;
Astro::Correction m_astroCorrection;
bool m_reverse_Doppler;
@ -450,6 +461,9 @@ private:
qint32 m_secID;
qint32 m_idleMinutes;
qint32 m_nSubMode;
qint32 m_nSubMode_Q65;
qint32 m_nSubMode_JT65;
qint32 m_nSubMode_JT4;
qint32 m_nclearave;
qint32 m_minSync;
qint32 m_dBm;
@ -482,6 +496,10 @@ private:
qint32 m_earlyDecode=41;
qint32 m_earlyDecode2=47;
qint32 m_nDecodes=0;
qint32 m_maxPoints=-1;
qint32 m_latestDecodeTime=-1;
qint32 m_points=-99;
qint32 m_score=0;
bool m_btxok; //True if OK to transmit
bool m_diskData;
@ -628,11 +646,15 @@ private:
QString m_xSent; //Contest exchange sent
QString m_xRcvd; //Contest exchange received
QString m_currentBand;
QString m_currentBandPeriod;
QString m_nextCall;
QString m_nextGrid;
QString m_fileDateTime;
QString m_inQSOwith;
QString m_BestCQpriority;
QString m_deCall;
QString m_deGrid;
QString m_ready2call[50];
QSet<QString> m_pfx;
QSet<QString> m_sfx;
@ -660,6 +682,34 @@ private:
};
QMap<QString,FixupQSO> m_fixupQSO; //Key = HoundCall, value = info for QSO in progress
struct ActiveCall
{
QString grid4;
QString bands;
qint32 az;
qint32 points;
};
QMap<QString,ActiveCall> m_activeCall; //Key = callsign, value = grid4, az, points for ARRL_DIGI
struct RecentCall
{
qint64 dialFreq;
qint32 audioFreq;
qint32 snr;
qint32 decodeTime;
bool txEven;
bool ready2call;
};
QMap<QString,RecentCall> m_recentCall; //Key = callsign, value = snr, dialFreq, audioFreq, decodeTime
struct ARRL_logged
{
QDateTime time;
QString band;
qint32 points;
};
QList<ARRL_logged> m_arrl_log;
QQueue<QString> m_houndQueue; //Selected Hounds available for starting a QSO
QQueue<QString> m_foxQSOinProgress; //QSOs in progress: Fox has sent a report
QQueue<qint64> m_foxRateQueue;
@ -740,6 +790,7 @@ private:
void CQTxFreq();
void useNextCall();
void abortQSO();
void updateRate();
void write_all(QString txRx, QString message);
bool isWorked(int itype, QString key, float fMHz=0, QString="");
@ -780,6 +831,9 @@ private:
void to_jt9(qint32 n, qint32 istart, qint32 idone);
bool is77BitMode () const;
void cease_auto_Tx_after_QSO ();
Q_SLOT void ARRL_Digi_Display();
void ARRL_Digi_Update(DecodedText dt);
void activeWorked(QString call, QString band);
};
extern int killbyname(const char* progName);

File diff suppressed because it is too large Load Diff

View File

@ -77,7 +77,7 @@ SignalMeter::SignalMeter (QWidget * parent)
outer_layout->setSpacing (0);
auto inner_layout = new QHBoxLayout;
inner_layout->setContentsMargins (9, 0, 9, 0);
inner_layout->setContentsMargins (1, 0, 1, 0);
inner_layout->setSpacing (0);
m_meter = new MeterWidget;

View File

@ -4,6 +4,7 @@ SOURCES += \
widgets/meterwidget.cpp widgets/signalmeter.cpp \
widgets/plotter.cpp widgets/widegraph.cpp widgets/about.cpp \
widgets/mainwindow.cpp widgets/messageaveraging.cpp \
widgets/activeStations.cpp \
widgets/echoplot.cpp widgets/echograph.cpp widgets/fastgraph.cpp \
widgets/fastplot.cpp widgets/MessageBox.cpp \
widgets/colorhighlighting.cpp widgets/ExportCabrillo.cpp \
@ -19,6 +20,7 @@ HEADERS += \
widgets/displaytext.h widgets/logqso.h widgets/LettersSpinBox.hpp \
widgets/FrequencyLineEdit.hpp widgets/FrequencyDeltaLineEdit.hpp widgets/signalmeter.h \
widgets/meterwidget.h widgets/messageaveraging.h \
widgets/activeStations.h \
widgets/echoplot.h widgets/echograph.h widgets/fastgraph.h \
widgets/fastplot.h widgets/MessageBox.hpp widgets/colorhighlighting.h \
widgets/ExportCabrillo.h widgets/AbstractLogWindow.hpp \
@ -31,6 +33,7 @@ FORMS += \
widgets/mainwindow.ui widgets/about.ui \
widgets/widegraph.ui widgets/astro.ui \
widgets/logqso.ui widgets/messageaveraging.ui \
widgets/activeStations.ui \
widgets/echograph.ui widgets/fastgraph.ui \
widgets/colorhighlighting.ui widgets/ExportCabrillo.ui \
widgets/FoxLogWindow.ui widgets/CabrilloLogWindow.ui