Merge branch 'release-2.4.0'

This commit is contained in:
Bill Somerville 2021-05-22 01:12:27 +01:00
commit 9bb987834e
No known key found for this signature in database
GPG Key ID: D864B06D1E81618F
21 changed files with 968 additions and 820 deletions

View File

@ -3,8 +3,7 @@
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
#include <memory> #include <memory>
#include <locale>
#include <locale.h>
#include <QCoreApplication> #include <QCoreApplication>
#include <QTextStream> #include <QTextStream>
@ -239,11 +238,9 @@ int main(int argc, char *argv[])
QCoreApplication app {argc, argv}; QCoreApplication app {argc, argv};
try try
{ {
::setlocale (LC_NUMERIC, "C"); // ensure number forms are in // ensure number forms are in consistent format, do this after
// consistent format, do this // instantiating QApplication so that Qt has correct l18n
// after instantiating std::locale::global (std::locale::classic ());
// QApplication so that Qt has
// correct l18n
// Override programs executable basename as application name. // Override programs executable basename as application name.
app.setApplicationName ("WSJT-X Record Time Signal"); app.setApplicationName ("WSJT-X Record Time Signal");

View File

@ -71,7 +71,7 @@ message (STATUS "******************************************************")
include (set_build_type) include (set_build_type)
# RC 0 or omitted is a development build, GA is a General Availability release build # RC 0 or omitted is a development build, GA is a General Availability release build
set_build_type (RC 4) set_build_type (GA)
set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}") set (wsjtx_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}${BUILD_TYPE_REVISION}")
# #

View File

@ -66,7 +66,7 @@ private:
double m_dphi; double m_dphi;
double m_amp; double m_amp;
double m_nsps; double m_nsps;
double volatile m_frequency; double m_frequency;
double m_frequency0; double m_frequency0;
double m_snr; double m_snr;
double m_fac; double m_fac;
@ -80,9 +80,9 @@ private:
qint16 m_ramp; qint16 m_ramp;
unsigned m_frameRate; unsigned m_frameRate;
ModulatorState volatile m_state; ModulatorState m_state;
bool volatile m_tuning; bool m_tuning;
bool m_addNoise; bool m_addNoise;
bool m_bFastMode; bool m_bFastMode;

76
NEWS
View File

@ -46,7 +46,7 @@ discovered in the RC3 and v2.3.0 GA releases.
Release: WSJT-X 2.4.0-rc3 Release: WSJT-X 2.4.0-rc3
Mar 16, 2021 Mar 15, 2021
------------------------- -------------------------
WSJT-X 2.4.0 Release Candidate 3 adds new Q65 mode functionality and WSJT-X 2.4.0 Release Candidate 3 adds new Q65 mode functionality and
@ -61,7 +61,7 @@ the RC2 and v2.3.0 GA releases.
- Behavior of "Save decoded" has been corrected. - Behavior of "Save decoded" has been corrected.
- Repaied a defect that caused crash when displaying the Wide Graph - Repaired a defect that caused crash when displaying the Wide Graph
with lower frequency limit set to 0. with lower frequency limit set to 0.
- Program no longer terminates a transmission when Settings is - Program no longer terminates a transmission when Settings is
@ -131,7 +131,7 @@ the RC1 release.
Release: WSJT-X 2.3.1 Release: WSJT-X 2.3.1
Mar 18, 2021 Mar 26, 2021
--------------------- ---------------------
WSJT-X 2.3.1 General Availability release updates the User Guide to WSJT-X 2.3.1 General Availability release updates the User Guide to
@ -578,7 +578,7 @@ of course the updated WSJT-X 2.2 User Guide.
Release: WSJT-X 2.2.0-rc3 Release: WSJT-X 2.2.0-rc3
May 30, 2020 May 29, 2020
------------------------- -------------------------
WSJT-X 2.2.0-rc3 is the third release candidate for WSJT-X 2.2.0. WSJT-X 2.2.0-rc3 is the third release candidate for WSJT-X 2.2.0.
@ -801,6 +801,74 @@ We now provide a separate installation package for 64-bit Windows 7
and later, with significant improvements in decoding speed. and later, with significant improvements in decoding speed.
- New "Call Best" button for FT4 mode to select the best reply to a
CQ call based on neediness.
- Fixed UTC display on FT4 waterfall.
This release is made by invitation only to selected testers to trial
the FT4 mode in semi-realistic contest simulations and to elicit
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-rc3
April 5, 2019
-------------------------
WSJT-X 2.1.0 third release candidate is an enhancement release to
change the implementation of the new FT4 mode to a synchronous T/R
period of 6 seconds.
This release is made by invitation only to selected testers to trial
the FT4 mode in semi-realistic contest simulations and to elicit
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-rc2
March 29, 2019
-------------------------
WSJT-X 2.1.0 second release candidate is a bug fix release to repair
some usability issues with FT4 contest mode. The following new
features are also included.
- Better options for QSO flow by clicking Tx# buttons to transmit
- A 64-bit package for Windows 64-bit systems
- Improved FT4 sync detection speed
This release is made by invitation only to selected testers to trial
the FT4 mode in semi-realistic contest simulations and to elicit
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
-------------------------
WSJT-X 2.1.0 first release candidate is a preview alpha quality
release containing the following new features.
- FT4 mode, a new mode targeted at HF digital contesting
- GMSK modulation for FT4 and FT8
- New waterfall option to select between raw sensitivity or a
filtered signal representation for best visualization of signal
quality
This release is made by invitation only to selected testers to trial
the FT4 mode in semi-realistic contest simulations and to elicit
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.0.1 Release: WSJT-X 2.0.1
February 25, 2019 February 25, 2019
--------------------- ---------------------

View File

@ -11,6 +11,44 @@
Copyright 2001 - 2021 by Joe Taylor, K1JT. Copyright 2001 - 2021 by Joe Taylor, K1JT.
Release: WSJT-X 2.4.0
May 24, 2021
---------------------
WSJT-X 2.4.0 General Availability Release adds new Q65 mode
functionality and decoder optimizations and repairs several defects
and regressions discovered in the RC4 and v2.3.1 GA releases. Since
the release candidates documented below this final release includes
the following enhancements and defect repairs.
- On MS Windows WSJT-X now ships with a DLL version of the Hamlib
library, specifically Hamlib version 4.2. This should allow Hamlib
bug fixes to resolved by the user replacing the DLL with an updated
version.
- Repair a defect with own call decode highlighting when callsigns
with a common root are decoded.
- Q65 message averaging correctly disabled as be menu option.
- Repair a regression with missing timestamps in AlL.TXT for the
MSK144 mode.
- Repair a defect in the selection of working frequencies matching
the current band and mode combination.
- WSPR band hopping mode now generates a tune up tone for bands where
it is scheduled to transmit.
- Repair a long standing defect per band tune and Tx power level
memories.
- More flexibility for inputting calls into the DX Call field,
leading and trailing white space characters are allowed but
ignored.
Release: WSJT-X 2.4.0-rc4 Release: WSJT-X 2.4.0-rc4
Mar 26, 2021 Mar 26, 2021
------------------------- -------------------------
@ -130,7 +168,7 @@ the RC1 release.
Release: WSJT-X 2.3.1 Release: WSJT-X 2.3.1
Mar 18, 2021 Mar 26, 2021
--------------------- ---------------------
WSJT-X 2.3.1 General Availability release updates the User Guide to WSJT-X 2.3.1 General Availability release updates the User Guide to

View File

@ -31,7 +31,7 @@
// menu that allows each dock window to be hidden or revealed. // menu that allows each dock window to be hidden or revealed.
// //
#include <clocale> #include <locale>
#include <iostream> #include <iostream>
#include <exception> #include <exception>
@ -52,10 +52,9 @@ int main (int argc, char * argv[])
QApplication app {argc, argv}; QApplication app {argc, argv};
try try
{ {
setlocale (LC_NUMERIC, "C"); // ensure number forms are in // ensure number forms are in consistent format, do this after
// consistent format, do this after // instantiating QApplication so that GUI has correct l18n
// instantiating QApplication so std::locale::global (std::locale::classic ());
// that GUI has correct l18n
app.setApplicationName ("WSJT-X Reference UDP Message Aggregator Server"); app.setApplicationName ("WSJT-X Reference UDP Message Aggregator Server");
app.setApplicationVersion ("1.0"); app.setApplicationVersion ("1.0");

View File

@ -17,6 +17,7 @@
#include <iostream> #include <iostream>
#include <exception> #include <exception>
#include <locale>
#include <cstdlib> #include <cstdlib>
#include <QCoreApplication> #include <QCoreApplication>
@ -263,10 +264,9 @@ int main (int argc, char * argv[])
QCoreApplication app {argc, argv}; QCoreApplication app {argc, argv};
try try
{ {
setlocale (LC_NUMERIC, "C"); // ensure number forms are in // ensure number forms are in consistent format, do this after
// consistent format, do this after // instantiating QApplication so that GUI has correct l18n
// instantiating QApplication so std::locale::global (std::locale::classic ());
// that GUI has correct l18n
app.setApplicationName ("WSJT-X UDP Message Server Daemon"); app.setApplicationName ("WSJT-X UDP Message Server Daemon");
app.setApplicationVersion ("1.0"); app.setApplicationVersion ("1.0");

View File

@ -473,7 +473,6 @@ auto WSPRBandHopping::next_hop (bool tx_enabled) -> Hop
, frequencies_index >= 0 // new band , frequencies_index >= 0 // new band
&& tx_enabled // transmit is allowed && tx_enabled // transmit is allowed
&& !tx_next // not going to Tx anyway
&& m_->bands_[4].testBit (band_index) // tune up required && m_->bands_[4].testBit (band_index) // tune up required
&& !m_->bands_[5].testBit (band_index) // not an Rx only band && !m_->bands_[5].testBit (band_index) // not an Rx only band

View File

@ -24,7 +24,8 @@ class QWidget;
// //
// Along with selecting bands a flag indicating that a short tune up // Along with selecting bands a flag indicating that a short tune up
// signal is required for specified bands before they are used for // signal is required for specified bands before they are used for
// receive. // transmit or receive, unless they are flagged as Rx Only (intended
// to protect Rx active aerials and non-licensed bands).
// //
// Provides a Qt property that holds the Tx percentage which is used // Provides a Qt property that holds the Tx percentage which is used
// to generate a semi-randomized schedule of period to transmit. This // to generate a semi-randomized schedule of period to transmit. This

1420
cty.dat

File diff suppressed because it is too large Load Diff

View File

@ -18,12 +18,12 @@ Here is an overview list, details are filled out below:
* MSYS2 *nix like command line environment * MSYS2 *nix like command line environment
* Hamlib rig control library * Hamlib rig control library
* Pkg Config Lite * Pkg Config Lite
* Boost C++ libraries * Boost C++ libraries (see separate document)
Qt Framework Qt Framework
------------ ------------
At the time of writing I recommend using Qt v5.15.0 64-bit, v5.15.1 At the time of writing I recommend using Qt v5.15.2 64-bit, v5.15.1
has a defect that affects us so is best avoided. You need the MinGW has a defect that affects us so is best avoided. You need the MinGW
version as we do not support the MSVC version due to lack of a version as we do not support the MSVC version due to lack of a
suitable FOSS Fortran complier. To install the Qt developer SDK you suitable FOSS Fortran complier. To install the Qt developer SDK you
@ -31,7 +31,7 @@ should download the official Qt on-line installer, this allows you to
install one or more variants of the Qt SDK and also to maintain and install one or more variants of the Qt SDK and also to maintain and
update the installation at a later date. There are many versions and update the installation at a later date. There are many versions and
components within versions available, you only need the base 64-bit components within versions available, you only need the base 64-bit
MinGW framework for Qt v5.15.0 and the matching MinGW 8.1.0 64-bit MinGW framework for Qt v5.15.2 and the matching MinGW 8.1.0 64-bit
developer tools, other components can be unchecked within the on-line developer tools, other components can be unchecked within the on-line
installer. The default install location is C:\Qt which is fine, do installer. The default install location is C:\Qt which is fine, do
not attempt to move the location of the installed libraries if you not attempt to move the location of the installed libraries if you
@ -85,14 +85,10 @@ Hamlib from sources.
Hamlib Hamlib
------ ------
Currently we statically link Hamlib to avoid clashes with There is a fork of the official Hamlib project which we keep up to
pre-installed DLLs that may be older versions than we support. Once date with the official project master branch, we recommend building
Hamlib v1.4 is officially released and commonly available we will move from the 'integration' branch, or a suitable tag on that fork. The
to dynamic linking. Until then Hamlib must be built from fork is a git repository which can be cloned with this command:
sources. There is a fork of the official Hamlib project which we keep
up to date with the official project master branch, we recommend
building from the 'integration' branch of that fork. The fork is a git
repository which can be cloned with this command:
mkdir -p ~/src/sf/bsomervi mkdir -p ~/src/sf/bsomervi
cd !$ cd !$
@ -105,7 +101,7 @@ Qt. As you will build Hamlib again when there are updates you should
set up you Msys2 command line environment for this. I use a set up you Msys2 command line environment for this. I use a
$HOME/.bash_profile file containing these lines: $HOME/.bash_profile file containing these lines:
dll_paths_64bit=/c/Tools/libusb-1.0.23/MinGW64/dll dll_paths_64bit=/c/Tools/libusb-1.0.23/MinGW64/dll:$HOME/local/hamlib/mingw64/release/bin
export PATH=/c/Qt/Tools/mingw810_64/bin:$dll_paths_64bit:$PATH export PATH=/c/Qt/Tools/mingw810_64/bin:$dll_paths_64bit:$PATH
Test the amended ~/.bash_profile file by opening a new Msys2 shell and Test the amended ~/.bash_profile file by opening a new Msys2 shell and
@ -127,7 +123,7 @@ then change working directory to that build directory.
mkdir -p ~/build/hamlib/release mkdir -p ~/build/hamlib/release
cd !$ cd !$
~/src/sf/bsomervi/hamlib/configure --disable-shared \ ~/src/sf/bsomervi/hamlib/configure --enable-shared --disable-static \
--prefix=$HOME/local/hamlib/mingw64/release \ --prefix=$HOME/local/hamlib/mingw64/release \
CFLAGS="-DNDEBUG -g -O2 -fdata-sections -ffunction-sections -I/c/Tools/libusb-1.0.23/include" \ CFLAGS="-DNDEBUG -g -O2 -fdata-sections -ffunction-sections -I/c/Tools/libusb-1.0.23/include" \
CXXFLAGS="-DNDEBUG -g -O2 -fdata-sections -ffunction-sections" \ CXXFLAGS="-DNDEBUG -g -O2 -fdata-sections -ffunction-sections" \
@ -144,7 +140,7 @@ for tracking down issues:
mkdir -p ~/build/hamlib/debug mkdir -p ~/build/hamlib/debug
cd !$ cd !$
~/src/sf/bsomervi/hamlib/configure --disable-shared \ ~/src/sf/bsomervi/hamlib/configure --enable-shared --disable-static \
--prefix=$HOME/local/hamlib/mingw64/debug \ --prefix=$HOME/local/hamlib/mingw64/debug \
CFLAGS="-g -O0 -I/c/Tools/libusb-1.0.23/include" \ CFLAGS="-g -O0 -I/c/Tools/libusb-1.0.23/include" \
CXXFLAGS="-g -O0" \ CXXFLAGS="-g -O0" \
@ -160,6 +156,12 @@ To update the Hamlib sources to the latest commit and rebuild:
cd ~/build/hamlib/debug cd ~/build/hamlib/debug
make && make install make && make install
Note that the WSJT-X CMake build script will not detect an updated
build of the Hamlib DLL, so to avoid using an out-of-date Hamlib DLL
you should delete the Hamlib DLL (libhamlib-4.dll) from your WSJT-X
release configuration install tree before rebuilding and installing
WSJT-X after a Hamlib update.
Pkg Config Lite Pkg Config Lite
--------------- ---------------

View File

@ -112,7 +112,7 @@ summarized in the following Table:
|=========================================== |===========================================
|Mode |Mode character|Sync character|End of line information |Mode |Mode character|Sync character|End of line information
|FST4 | ` | | ? &#160; aP |FST4 | ` | | ? &#160; aP
|FT4 | ~ | | ? &#160; aP |FT4 | + | | ? &#160; aP
|FT8 | ~ | | ? &#160; aP |FT8 | ~ | | ? &#160; aP
|JT4 | $ | *, # | f, fN, dCN |JT4 | $ | *, # | f, fN, dCN
|JT9 | @ | | |JT9 | @ | |

View File

@ -341,8 +341,7 @@ contains
endif endif
endif endif
enddo ! icand enddo ! icand
if(iavg.eq.0 .and.navg(iseq).ge.2) go to 50 if(iavg.eq.0 .and.navg(iseq).ge.2 .and. iand(ndepth,16).ne.0) go to 50
900 return 900 return
end subroutine decode end subroutine decode

View File

@ -130,12 +130,8 @@ int main(int argc, char *argv[])
QLocale locale; // get the current system locale QLocale locale; // get the current system locale
// Set C/C++ locale used for logging etc. // reset the C+ & C global locales to the classic C locale
#if defined (Q_OS_WIN) std::locale::global (std::locale::classic ());
std::locale::global (std::locale ("C"));
#else
std::locale::global (std::locale ("en_US.UTF-8"));
#endif
// Override programs executable basename as application name. // Override programs executable basename as application name.
a.setApplicationName ("WSJT-X"); a.setApplicationName ("WSJT-X");

View File

@ -965,8 +965,11 @@ auto FrequencyList_v2::all_bands (Region region, Mode mode) const -> BandSet
BandSet result; BandSet result;
for (auto const& item : m_->frequency_list_) for (auto const& item : m_->frequency_list_)
{ {
if (region == IARURegions::ALL || item.region_ == region // Match frequencies that are for all regions, for the specified
|| mode == Modes::ALL || item.mode_ == mode) // region (which can also be "all"), and where the mode matches
// the specified mode (which can also be "all").
if ((region == IARURegions::ALL || item.region_ == IARURegions::ALL || item.region_ == region)
&& (mode == Modes::ALL || item.mode_ == Modes::ALL || item.mode_ == mode))
{ {
result << m_->bands_->find (item.frequency_); result << m_->bands_->find (item.frequency_);
} }

View File

@ -2285,12 +2285,12 @@ Fejl(%2): %3</translation>
<message> <message>
<location filename="../widgets/mainwindow.ui" line="3399"/> <location filename="../widgets/mainwindow.ui" line="3399"/>
<source>Quick-Start Guide to Q65</source> <source>Quick-Start Guide to Q65</source>
<translation type="unfinished"></translation> <translation>Quick Start Guide for Q65</translation>
</message> </message>
<message> <message>
<location filename="../widgets/mainwindow.ui" line="3407"/> <location filename="../widgets/mainwindow.ui" line="3407"/>
<source>Auto Clear Avg after decode</source> <source>Auto Clear Avg after decode</source>
<translation type="unfinished"></translation> <translation>Auto Slet Avg efter Dekodning</translation>
</message> </message>
<message> <message>
<location filename="../widgets/mainwindow.ui" line="573"/> <location filename="../widgets/mainwindow.ui" line="573"/>
@ -2992,7 +2992,7 @@ listen. Makro listen kan også ændfres i Inderstillinger (F2).</translation>
<message> <message>
<location filename="../widgets/mainwindow.ui" line="3383"/> <location filename="../widgets/mainwindow.ui" line="3383"/>
<source>Q65</source> <source>Q65</source>
<translation type="unfinished"></translation> <translation>Q65</translation>
</message> </message>
<message> <message>
<location filename="../widgets/mainwindow.ui" line="3391"/> <location filename="../widgets/mainwindow.ui" line="3391"/>
@ -4107,7 +4107,9 @@ listen. Makro listen kan også ændfres i Inderstillinger (F2).</translation>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work: <source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FST4, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source> &quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FST4, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translation type="unfinished"></translation> <translation>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FST4, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</translation>
</message> </message>
<message> <message>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work: <source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
@ -5290,7 +5292,7 @@ Fejl(%2): %3</translation>
<message> <message>
<location filename="../widgets/widegraph.ui" line="340"/> <location filename="../widgets/widegraph.ui" line="340"/>
<source>Q65_Sync</source> <source>Q65_Sync</source>
<translation type="unfinished"></translation> <translation>Q65_Sync</translation>
</message> </message>
<message> <message>
<location filename="../widgets/widegraph.ui" line="348"/> <location filename="../widgets/widegraph.ui" line="348"/>

View File

@ -2480,12 +2480,12 @@ Error(%2): %3</translation>
<message> <message>
<location filename="../widgets/mainwindow.ui" line="3399"/> <location filename="../widgets/mainwindow.ui" line="3399"/>
<source>Quick-Start Guide to Q65</source> <source>Quick-Start Guide to Q65</source>
<translation type="unfinished"></translation> <translation>Guía de inicio rápido de Q65</translation>
</message> </message>
<message> <message>
<location filename="../widgets/mainwindow.ui" line="3407"/> <location filename="../widgets/mainwindow.ui" line="3407"/>
<source>Auto Clear Avg after decode</source> <source>Auto Clear Avg after decode</source>
<translation type="unfinished"></translation> <translation>Auto Clear Avg después de decodificar</translation>
</message> </message>
<message> <message>
<location filename="../widgets/mainwindow.ui" line="1588"/> <location filename="../widgets/mainwindow.ui" line="1588"/>
@ -2610,7 +2610,7 @@ Error(%2): %3</translation>
<message> <message>
<location filename="../widgets/mainwindow.ui" line="3383"/> <location filename="../widgets/mainwindow.ui" line="3383"/>
<source>Q65</source> <source>Q65</source>
<translation type="unfinished"></translation> <translation>Q65</translation>
</message> </message>
<message> <message>
<location filename="../widgets/mainwindow.ui" line="3391"/> <location filename="../widgets/mainwindow.ui" line="3391"/>
@ -4442,7 +4442,9 @@ Error al cargar datos de usuarios de LotW</translatorcomment>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work: <source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FST4, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source> &quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FST4, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, MSK144 are Copyright (C) 2001-2021 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translation type="unfinished"></translation> <translation>Si hace un uso legítimo de cualquier parte del programa WSJT-X según los términos de la Licencia Pública General GNU, debe mostrar el siguiente aviso de derechos de autor en un lugar destacado en su trabajo derivado:
&quot;Los algoritmos, código fuente, apariencia de WSJT-X y programas relacionados, y especificaciones de protocolo para los modos FSK441, FST4, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, Q65, MSK144 son Copyright (C) 2001-2021 por uno o más de los siguientes autores: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; y otros miembros del Grupo de Desarrollo WSJT &quot;.</translation>
</message> </message>
<message> <message>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work: <source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
@ -5698,7 +5700,7 @@ Error(%2): %3</translation>
<message> <message>
<location filename="../widgets/widegraph.ui" line="340"/> <location filename="../widgets/widegraph.ui" line="340"/>
<source>Q65_Sync</source> <source>Q65_Sync</source>
<translation type="unfinished"></translation> <translation>Q65_Sync</translation>
</message> </message>
<message> <message>
<location filename="../widgets/widegraph.ui" line="348"/> <location filename="../widgets/widegraph.ui" line="348"/>

View File

@ -2,14 +2,24 @@
CallsignValidator::CallsignValidator (QObject * parent, bool allow_compound) CallsignValidator::CallsignValidator (QObject * parent, bool allow_compound)
: QValidator {parent} : QValidator {parent}
, re_ {allow_compound ? R"(^[A-Za-z0-9/]+$)" : R"(^[A-Za-z0-9]+$)"} , re_ {allow_compound ? R"(^[A-Z0-9/]+$)" : R"(^[A-Z0-9]+$)"}
{ {
} }
auto CallsignValidator::validate (QString& input, int& pos) const -> State auto CallsignValidator::validate (QString& input, int& pos) const -> State
{ {
auto match = re_.match (input, 0, QRegularExpression::PartialPreferCompleteMatch);
input = input.toUpper (); input = input.toUpper ();
while (input.size () && input[0].isSpace ())
{
input.remove (0, 1);
if (pos > 0) --pos;
}
while (input.size () && input[input.size ()].isSpace ())
{
if (pos > input.size ()) --pos;
input.chop (1);
}
auto match = re_.match (input, 0, QRegularExpression::PartialPreferCompleteMatch);
if (match.hasMatch ()) return Acceptable; if (match.hasMatch ()) return Acceptable;
if (!input.size () || match.hasPartialMatch ()) return Intermediate; if (!input.size () || match.hasPartialMatch ()) return Intermediate;
pos = input.size (); pos = input.size ();

View File

@ -413,18 +413,20 @@ void DisplayText::displayDecodedText(DecodedText const& decodedText, QString con
else else
{ {
if (bCQonly) return; if (bCQonly) return;
if (myCall != "" && (decodedText.indexOf (" " + myCall + " ") >= 0 if (myCall.size ())
or decodedText.indexOf (" " + myCall + "/") >= 0 {
or decodedText.indexOf ("<" + myCall + "/") >= 0 QString regexp {"[ <]" + myCall + "[ >]"};
or decodedText.indexOf ("/" + myCall + " ") >= 0 if (Radio::is_compound_callsign (myCall))
or decodedText.indexOf ("/" + myCall + ">") >= 0 {
or decodedText.indexOf ("<" + myCall + " ") >= 0 regexp = "(?:" + regexp + "|[ <]" + Radio::base_callsign (myCall) + "[ >])";
or decodedText.indexOf ("<" + myCall + ">") >= 0 }
or decodedText.indexOf (" " + myCall + ">") >= 0)) { if ((decodedText.clean_string () + " ").contains (QRegularExpression {regexp}))
{
highlight_types types {Highlight::MyCall}; highlight_types types {Highlight::MyCall};
set_colours (m_config, &bg, &fg, types); set_colours (m_config, &bg, &fg, types);
} }
} }
}
auto message = decodedText.string(); auto message = decodedText.string();
QString dxCall; QString dxCall;
QString dxGrid; QString dxGrid;

View File

@ -825,7 +825,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
connect(&logQSOTimer, &QTimer::timeout, this, &MainWindow::on_logQSOButton_clicked); connect(&logQSOTimer, &QTimer::timeout, this, &MainWindow::on_logQSOButton_clicked);
tuneButtonTimer.setSingleShot(true); tuneButtonTimer.setSingleShot(true);
connect(&tuneButtonTimer, &QTimer::timeout, this, &MainWindow::on_stopTxButton_clicked); connect(&tuneButtonTimer, &QTimer::timeout, this, &MainWindow::end_tuning);
tuneATU_Timer.setSingleShot(true); tuneATU_Timer.setSingleShot(true);
connect(&tuneATU_Timer, &QTimer::timeout, this, &MainWindow::stopTuneATU); connect(&tuneATU_Timer, &QTimer::timeout, this, &MainWindow::stopTuneATU);
@ -1493,7 +1493,7 @@ void MainWindow::dataSink(qint64 frames)
freqcal_(&dec_data.d2[0],&k,&nkhz,&RxFreq,&ftol,&line[0],80); freqcal_(&dec_data.d2[0],&k,&nkhz,&RxFreq,&ftol,&line[0],80);
QString t=QString::fromLatin1(line); QString t=QString::fromLatin1(line);
DecodedText decodedtext {t}; DecodedText decodedtext {t};
ui->decodedTextBrowser->displayDecodedText (decodedtext,m_baseCall,m_mode,m_config.DXCC(), ui->decodedTextBrowser->displayDecodedText (decodedtext, m_config.my_callsign (), m_mode, m_config.DXCC (),
m_logBook, m_currentBand, m_config.ppfx ()); m_logBook, m_currentBand, m_config.ppfx ());
if (ui->measure_check_box->isChecked ()) { if (ui->measure_check_box->isChecked ()) {
// Append results text to file "fmt.all". // Append results text to file "fmt.all".
@ -1748,7 +1748,7 @@ void MainWindow::fastSink(qint64 frames)
if(bmsk144 and (line[0]!=0)) { if(bmsk144 and (line[0]!=0)) {
QString message {QString::fromLatin1 (line)}; QString message {QString::fromLatin1 (line)};
DecodedText decodedtext {message.replace (QChar::LineFeed, "")}; DecodedText decodedtext {message.replace (QChar::LineFeed, "")};
ui->decodedTextBrowser->displayDecodedText (decodedtext,m_baseCall,m_mode,m_config.DXCC(), ui->decodedTextBrowser->displayDecodedText (decodedtext, m_config.my_callsign (), m_mode, m_config.DXCC(),
m_logBook, m_currentBand, m_config.ppfx ()); m_logBook, m_currentBand, m_config.ppfx ());
m_bDecoded=true; m_bDecoded=true;
auto_sequence (decodedtext, ui->sbFtol->value (), std::numeric_limits<unsigned>::max ()); auto_sequence (decodedtext, ui->sbFtol->value (), std::numeric_limits<unsigned>::max ());
@ -3253,7 +3253,7 @@ void::MainWindow::fast_decode_done()
//Left (Band activity) window //Left (Band activity) window
DecodedText decodedtext {message.replace (QChar::LineFeed, "")}; DecodedText decodedtext {message.replace (QChar::LineFeed, "")};
if(!m_bFastDone) { if(!m_bFastDone) {
ui->decodedTextBrowser->displayDecodedText (decodedtext,m_baseCall,m_mode,m_config.DXCC(), ui->decodedTextBrowser->displayDecodedText (decodedtext, m_config.my_callsign (), m_mode, m_config.DXCC (),
m_logBook, m_currentBand, m_config.ppfx ()); m_logBook, m_currentBand, m_config.ppfx ());
} }
@ -3460,13 +3460,13 @@ void MainWindow::readFromStdout() //readFromStdout
if(!m_bDisplayedOnce) { if(!m_bDisplayedOnce) {
// This hack sets the font. Surely there's a better way! // This hack sets the font. Surely there's a better way!
DecodedText dt{"."}; DecodedText dt{"."};
ui->decodedTextBrowser->displayDecodedText(dt,m_baseCall,m_mode,m_config.DXCC(), ui->decodedTextBrowser->displayDecodedText (dt, m_config.my_callsign (), m_mode, m_config.DXCC (),
m_logBook, m_currentBand, m_config.ppfx ()); m_logBook, m_currentBand, m_config.ppfx ());
m_bDisplayedOnce=true; m_bDisplayedOnce=true;
} }
} else { } else {
DecodedText decodedtext1=decodedtext0; DecodedText decodedtext1=decodedtext0;
ui->decodedTextBrowser->displayDecodedText(decodedtext1,m_baseCall,m_mode,m_config.DXCC(), ui->decodedTextBrowser->displayDecodedText (decodedtext1, m_config.my_callsign (), m_mode, m_config.DXCC (),
m_logBook, m_currentBand, m_config.ppfx (), m_logBook, m_currentBand, m_config.ppfx (),
ui->cbCQonly->isVisible() && ui->cbCQonly->isChecked(), ui->cbCQonly->isVisible() && ui->cbCQonly->isChecked(),
haveFSpread, fSpread); haveFSpread, fSpread);
@ -3498,7 +3498,6 @@ void MainWindow::readFromStdout() //readFromStdout
bool bDisplayRight=bAvgMsg; bool bDisplayRight=bAvgMsg;
int audioFreq=decodedtext.frequencyOffset(); int audioFreq=decodedtext.frequencyOffset();
if(m_mode=="FT8" or m_mode=="FT4" or m_mode=="FST4" or m_mode=="Q65") { if(m_mode=="FT8" or m_mode=="FT4" or m_mode=="FST4" or m_mode=="Q65") {
// if(m_mode=="FT8" or m_mode=="FT4" or m_mode=="FST4") {
int ftol=10; int ftol=10;
if(m_mode=="Q65") ftol=ui->sbFtol->value(); if(m_mode=="Q65") ftol=ui->sbFtol->value();
auto const& parts = decodedtext.string().remove("<").remove(">") auto const& parts = decodedtext.string().remove("<").remove(">")
@ -3506,7 +3505,23 @@ void MainWindow::readFromStdout() //readFromStdout
if (parts.size() > 6) { if (parts.size() > 6) {
auto for_us = parts[5].contains (m_baseCall) auto for_us = parts[5].contains (m_baseCall)
|| ("DE" == parts[5] && qAbs (ui->RxFreqSpinBox->value () - audioFreq) <= ftol); || ("DE" == parts[5] && qAbs (ui->RxFreqSpinBox->value () - audioFreq) <= ftol);
if(m_baseCall==m_config.my_callsign() and m_baseCall!=parts[5]) for_us=false; if(m_baseCall == m_config.my_callsign())
{
if (m_baseCall != parts[5])
{
for_us=false;
}
}
else
{
if (m_config.my_callsign () != parts[5])
{
for_us = false; // same base call as ours but
// different prefix or suffix, rare
// but can happen with multi station
// special events
}
}
if(m_bCallingCQ && !m_bAutoReply && for_us && ui->cbFirst->isChecked() and if(m_bCallingCQ && !m_bAutoReply && for_us && ui->cbFirst->isChecked() and
SpecOp::FOX > m_config.special_op_id()) { SpecOp::FOX > m_config.special_op_id()) {
m_bDoubleClicked=true; m_bDoubleClicked=true;
@ -3527,7 +3542,7 @@ void MainWindow::readFromStdout() //readFromStdout
// This msg is within 10 hertz of our tuned frequency, or a JT4 or JT65 avg, // This msg is within 10 hertz of our tuned frequency, or a JT4 or JT65 avg,
// or contains MyCall // or contains MyCall
if(!m_bBestSPArmed or m_mode!="FT4") { if(!m_bBestSPArmed or m_mode!="FT4") {
ui->decodedTextBrowser2->displayDecodedText(decodedtext0,m_baseCall,m_mode,m_config.DXCC(), ui->decodedTextBrowser2->displayDecodedText (decodedtext0, m_config.my_callsign (), m_mode, m_config.DXCC (),
m_logBook, m_currentBand, m_config.ppfx ()); m_logBook, m_currentBand, m_config.ppfx ());
} }
m_QSOText = decodedtext.string ().trimmed (); m_QSOText = decodedtext.string ().trimmed ();
@ -5194,7 +5209,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
QString s2 = message.clean_string ().trimmed(); QString s2 = message.clean_string ().trimmed();
if (s1!=s2 and !message.isTX()) { if (s1!=s2 and !message.isTX()) {
if (!s2.contains(m_baseCall) or m_mode=="MSK144") { // Taken care of elsewhere if for_us and slow mode if (!s2.contains(m_baseCall) or m_mode=="MSK144") { // Taken care of elsewhere if for_us and slow mode
ui->decodedTextBrowser2->displayDecodedText(message, m_baseCall,m_mode,m_config.DXCC(), ui->decodedTextBrowser2->displayDecodedText (message, m_config.my_callsign (), m_mode, m_config.DXCC (),
m_logBook, m_currentBand, m_config.ppfx ()); m_logBook, m_currentBand, m_config.ppfx ());
} }
m_QSOText = s2; m_QSOText = s2;
@ -6920,8 +6935,8 @@ void MainWindow::on_bandComboBox_activated (int index)
void MainWindow::band_changed (Frequency f) void MainWindow::band_changed (Frequency f)
{ {
// Set the attenuation value if options are checked // Set the attenuation value if options are checked
QString curBand = ui->bandComboBox->currentText();
if (m_config.pwrBandTxMemory() && !m_tune) { if (m_config.pwrBandTxMemory() && !m_tune) {
auto const&curBand = ui->bandComboBox->currentText();
if (m_pwrBandTxMemory.contains(curBand)) { if (m_pwrBandTxMemory.contains(curBand)) {
ui->outAttenuation->setValue(m_pwrBandTxMemory[curBand].toInt()); ui->outAttenuation->setValue(m_pwrBandTxMemory[curBand].toInt());
} }
@ -6997,9 +7012,9 @@ void MainWindow::on_tuneButton_clicked (bool checked)
static bool lastChecked = false; static bool lastChecked = false;
if (lastChecked == checked) return; if (lastChecked == checked) return;
lastChecked = checked; lastChecked = checked;
QString curBand = ui->bandComboBox->currentText();
if (checked && m_tune==false) { // we're starting tuning so remember Tx and change pwr to Tune value if (checked && m_tune==false) { // we're starting tuning so remember Tx and change pwr to Tune value
if (m_config.pwrBandTuneMemory ()) { if (m_config.pwrBandTuneMemory ()) {
auto const& curBand = ui->bandComboBox->currentText();
m_pwrBandTxMemory[curBand] = ui->outAttenuation->value(); // remember our Tx pwr m_pwrBandTxMemory[curBand] = ui->outAttenuation->value(); // remember our Tx pwr
m_PwrBandSetOK = false; m_PwrBandSetOK = false;
if (m_pwrBandTuneMemory.contains(curBand)) { if (m_pwrBandTuneMemory.contains(curBand)) {
@ -7008,15 +7023,6 @@ void MainWindow::on_tuneButton_clicked (bool checked)
m_PwrBandSetOK = true; m_PwrBandSetOK = true;
} }
} }
else { // we're turning off so remember our Tune pwr setting and reset to Tx pwr
if (m_config.pwrBandTuneMemory() || m_config.pwrBandTxMemory()) {
stopTx();
m_pwrBandTuneMemory[curBand] = ui->outAttenuation->value(); // remember our Tune pwr
m_PwrBandSetOK = false;
ui->outAttenuation->setValue(m_pwrBandTxMemory[curBand].toInt()); // set to Tx pwr
m_PwrBandSetOK = true;
}
}
if (m_tune) { if (m_tune) {
tuneButtonTimer.start(250); tuneButtonTimer.start(250);
} else { } else {
@ -7028,6 +7034,19 @@ void MainWindow::on_tuneButton_clicked (bool checked)
Q_EMIT tune (checked); Q_EMIT tune (checked);
} }
void MainWindow::end_tuning ()
{
on_stopTxButton_clicked ();
// we're turning off so remember our Tune pwr setting and reset to Tx pwr
if (m_config.pwrBandTuneMemory() || m_config.pwrBandTxMemory()) {
auto const& curBand = ui->bandComboBox->currentText();
m_pwrBandTuneMemory[curBand] = ui->outAttenuation->value(); // remember our Tune pwr
m_PwrBandSetOK = false;
ui->outAttenuation->setValue(m_pwrBandTxMemory[curBand].toInt()); // set to Tx pwr
m_PwrBandSetOK = true;
}
}
void MainWindow::stop_tuning () void MainWindow::stop_tuning ()
{ {
on_tuneButton_clicked(false); on_tuneButton_clicked(false);
@ -9199,7 +9218,7 @@ void MainWindow::write_all(QString txRx, QString message)
t = t.asprintf("%5d",ui->TxFreqSpinBox->value()); t = t.asprintf("%5d",ui->TxFreqSpinBox->value());
if (txRx=="Tx") msg=" 0 0.0" + t + " " + message; if (txRx=="Tx") msg=" 0 0.0" + t + " " + message;
auto time = QDateTime::currentDateTimeUtc (); auto time = QDateTime::currentDateTimeUtc ();
if( txRx=="Rx" ) time=m_dateTimeSeqStart; if( txRx=="Rx" && !m_bFastMode ) time=m_dateTimeSeqStart;
t = t.asprintf("%10.3f ",m_freqNominal/1.e6); t = t.asprintf("%10.3f ",m_freqNominal/1.e6);
if (m_diskData) { if (m_diskData) {

View File

@ -254,6 +254,7 @@ private slots:
void on_actionShort_list_of_add_on_prefixes_and_suffixes_triggered(); void on_actionShort_list_of_add_on_prefixes_and_suffixes_triggered();
void band_changed (Frequency); void band_changed (Frequency);
void monitor (bool); void monitor (bool);
void end_tuning ();
void stop_tuning (); void stop_tuning ();
void stopTuneATU(); void stopTuneATU();
void auto_tx_mode(bool); void auto_tx_mode(bool);