Merge branch 'develop' into feat-ft8-q3

This commit is contained in:
Joe Taylor 2022-01-07 11:38:10 -05:00
commit 6b2df37137
23 changed files with 1723 additions and 897 deletions

View File

@ -45,7 +45,7 @@ if (POLICY CMP0075)
endif () endif ()
project (wsjtx project (wsjtx
VERSION 2.5.2.0 VERSION 2.6.0
LANGUAGES C CXX Fortran LANGUAGES C CXX Fortran
) )
set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio") set (PROJECT_DESCRIPTION "WSJT-X: Digital Modes for Weak Signal Communications in Amateur Radio")
@ -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 GA) set_build_type (RC 1)
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}")
# #
@ -506,6 +506,7 @@ set (wsjt_FSRCS
lib/qra/q65/q65_set_list.f90 lib/qra/q65/q65_set_list.f90
lib/refspectrum.f90 lib/refspectrum.f90
lib/savec2.f90 lib/savec2.f90
lib/save_dxbase.f90
lib/sec0.f90 lib/sec0.f90
lib/sec_midn.f90 lib/sec_midn.f90
lib/setup65.f90 lib/setup65.f90

View File

@ -208,7 +208,7 @@ namespace
int const combo_box_item_disabled (0); int const combo_box_item_disabled (0);
// QRegExp message_alphabet {"[- A-Za-z0-9+./?]*"}; // 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 { QRegularExpression RTTY_roundup_exchange_re {
R"( R"(
( (
@ -735,7 +735,7 @@ bool Configuration::monitor_last_used () const {return m_->rig_is_dummy_ || m_->
bool Configuration::log_as_RTTY () const {return m_->log_as_RTTY_;} bool Configuration::log_as_RTTY () const {return m_->log_as_RTTY_;}
bool Configuration::report_in_comments () const {return m_->report_in_comments_;} bool Configuration::report_in_comments () const {return m_->report_in_comments_;}
bool Configuration::prompt_to_log () const {return m_->prompt_to_log_;} bool Configuration::prompt_to_log () const {return m_->prompt_to_log_;}
bool Configuration::autoLog() const {return m_->autoLog_ && m_->bSpecialOp_;} bool Configuration::autoLog() const {return m_->autoLog_;}
bool Configuration::decodes_from_top () const {return m_->decodes_from_top_;} bool Configuration::decodes_from_top () const {return m_->decodes_from_top_;}
bool Configuration::insert_blank () const {return m_->insert_blank_;} bool Configuration::insert_blank () const {return m_->insert_blank_;}
bool Configuration::DXCC () const {return m_->DXCC_;} bool Configuration::DXCC () const {return m_->DXCC_;}

View File

@ -11,7 +11,39 @@ extern "C" {
namespace namespace
{ {
QRegularExpression words_re {R"(^(?:(?<word1>(?:CQ|DE|QRZ)(?:\s?DX|\s(?:[A-Z]{1,4}|\d{3}))|[A-Z0-9/]+|\.{3})\s)(?:(?<word2>[A-Z0-9/]+)(?:\s(?<word3>[-+A-Z0-9]+)(?:\s(?<word4>(?:OOO|(?!RR73)[A-R]{2}[0-9]{2})))?)?)?)"}; QRegularExpression tokens_re {R"(
^
(?:(?<dual>[A-Z0-9/]+)\sRR73;\s)? # dual reply DXpedition message
(?:
(?<word1>
(?:CQ|DE|QRZ)
(?:\s?DX|\s
(?:[A-Z]{1,4}|\d{3}) # directional CQ
)
| [A-Z0-9/]+ # DX call
|\.{3} # unknown hash code
)\s
)
(?:
(?<word2>[A-Z0-9/]+) # DE call
(?:\s
(?<word3>[-+A-Z0-9]+) # report
(?:\s
(?<word4>
(?:
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
)?
)?
)?
)?
)"
, QRegularExpression::ExtendedPatternSyntaxOption};
} }
DecodedText::DecodedText (QString const& the_string) DecodedText::DecodedText (QString const& the_string)
@ -23,13 +55,13 @@ DecodedText::DecodedText (QString const& the_string)
, is_standard_ {false} , is_standard_ {false}
{ {
// discard appended AP info // 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); // qDebug () << "DecodedText: the_string:" << the_string << "Nbsp pos:" << the_string.indexOf (QChar::Nbsp);
if (message_.length() >= 1) if (message_.length() >= 1)
{ {
message0_ = message_.left(36); message0_ = message_.left(37);
message_ = message_.left(36).remove (QRegularExpression {"[<>]"}); message_ = message_.left(37).remove (QRegularExpression {"[<>]"});
int i1 = message_.indexOf ('\r'); int i1 = message_.indexOf ('\r');
if (i1 > 0) if (i1 > 0)
{ {
@ -60,11 +92,13 @@ QStringList DecodedText::messageWords () const
// extract up to the first four message words // extract up to the first four message words
QString t=message_; QString t=message_;
if(t.left(4)=="TU; ") t=message_.mid(4,-1); if(t.left(4)=="TU; ") t=message_.mid(4,-1);
return words_re.match(t).capturedTexts(); return tokens_re.match(t).capturedTexts();
} }
// simple word split for free text messages // simple word split for free text messages
auto words = message_.split (' ', SkipEmptyParts); 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_); words.prepend (message_);
return words; return words;
} }
@ -94,7 +128,7 @@ bool DecodedText::isTX() const
bool DecodedText::isLowConfidence () 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 int DecodedText::frequencyOffset() const
@ -128,18 +162,23 @@ bool DecodedText::report(QString const& myBaseCall, QString const& dxBaseCall, /
if (message_.size () < 1) return false; if (message_.size () < 1) return false;
QStringList const& w = message_.split(" ", SkipEmptyParts); QStringList const& w = message_.split(" ", SkipEmptyParts);
if (w.size () int offset {0};
&& is_standard_ && (w[0] == myBaseCall if (w.size () > 2)
|| w[0].endsWith ("/" + myBaseCall) {
|| w[0].startsWith (myBaseCall + "/") if ("RR73;" == w[1] && w.size () > 3)
|| (w.size () > 1 && !dxBaseCall.isEmpty () {
&& (w[1] == dxBaseCall offset = 2;
|| w[1].endsWith ("/" + dxBaseCall) }
|| w[1].startsWith (dxBaseCall + "/"))))) if (is_standard_ && (w[offset] == myBaseCall
|| w[offset].endsWith ("/" + myBaseCall)
|| w[offset].startsWith (myBaseCall + "/")
|| (w.size () > offset + 1 && !dxBaseCall.isEmpty ()
&& (w[offset + 1] == dxBaseCall
|| w[offset + 1].endsWith ("/" + dxBaseCall)
|| w[offset + 1].startsWith (dxBaseCall + "/")))))
{ {
QString tt="";
if(w.size() > 2) tt=w[2];
bool ok; bool ok;
auto tt = w[offset + 2];
auto i1=tt.toInt(&ok); auto i1=tt.toInt(&ok);
if (ok and i1>=-50 and i1<50) if (ok and i1>=-50 and i1<50)
{ {
@ -157,13 +196,14 @@ bool DecodedText::report(QString const& myBaseCall, QString const& dxBaseCall, /
} }
} }
} }
}
return is_standard_; return is_standard_;
} }
// get the first text word, usually the call // get the first text word, usually the call
QString DecodedText::call() const QString DecodedText::call() const
{ {
return words_re.match (message_).captured ("word1"); return tokens_re.match (message_).captured ("word1");
} }
// get the second word, most likely the de call and the third word, most likely grid // get the second word, most likely the de call and the third word, most likely grid
@ -175,7 +215,7 @@ void DecodedText::deCallAndGrid(/*out*/QString& call, QString& grid) const
{ {
msg = msg.mid (p + 2); msg = msg.mid (p + 2);
} }
auto const& match = words_re.match (msg); auto const& match = tokens_re.match (msg);
call = match.captured ("word2"); call = match.captured ("word2");
grid = match.captured ("word3"); grid = match.captured ("word3");
if ("R" == grid) grid = match.captured ("word4"); if ("R" == grid) grid = match.captured ("word4");

50
NEWS
View File

@ -11,6 +11,56 @@
Copyright 2001 - 2021 by Joe Taylor, K1JT. Copyright 2001 - 2021 by Joe Taylor, K1JT.
Release: WSJT-X 2.5.2
Nov 4, 2021
----------------------
This is mostly a bug fix release. It has the following changes since
release 2.5.1:
- Repair a longstanding regression that caused signal reports from
tail-ended Tx2 messages to be omitted from logged information
- Parse "dx-call-1 RR73; dx-call-2 <de-call> +nn" messages (i3=0,
n3=1 DXpedition mode) in regular 77-bit modes
- Repair a regression associated with setting the main window width
on program startup.
- Repair a problem with Q65 decodes of type 'q3' for messages of the
form "<Call_1> Call_2"
- Execute code associated with Q65 decodes of type 'q5' only when the
Max Drift control is set to 50. This fix prevents
double-incrementing of the message averaging counter on the first
decoding sequence.
- Polarization offset 'Dpol' from the astronomical data window is now
written to file azel.dat if environment variable
WSJT_AZEL_EXTRA_LINES has been defined as 1 or greater. Dpol is
especially useful for EME on the higher microwave bands.
- The Auto Log QSO option in "Settings->Reporting" now behaves the
same as the Prompt to log QSO option when not in a special
operating context mode.
- The Fast/Normal/Deep setting in Q65 mode is now a sticky setting
and is no longer reset to Fast on program startup or when Settings
has been opened. The user selection is used for automatic decodes,
but Deep is used for any subsequent manual decode attempts.
- New hamlib code to correct minor flaws in controlling several rigs.
- Update the Chinese and Hong Kong translations of the user
interface.
- Note that since the WSJT-X v2.5.0 GA release we have not been
providing pre-built 32-bit packages for Linux on Intel CPUs, this
is due to the mainstream Linux Desktop distributions no longer
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 Release: WSJT-X 2.5.1
Oct 21, 2021 Oct 21, 2021
---------------------- ----------------------

View File

@ -11,6 +11,90 @@
Copyright 2001 - 2021 by Joe Taylor, K1JT. Copyright 2001 - 2021 by Joe Taylor, K1JT.
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
----------------------
This is mostly a bug fix release. It has the following changes since
release 2.5.1:
- Repair a longstanding regression that caused signal reports from
tail-ended Tx2 messages to be omitted from logged information
- Parse "dx-call-1 RR73; dx-call-2 <de-call> +nn" messages (i3=0,
n3=1 DXpedition mode) in regular 77-bit modes
- Repair a regression associated with setting the main window width
on program startup.
- Repair a problem with Q65 decodes of type 'q3' for messages of the
form "<Call_1> Call_2"
- Execute code associated with Q65 decodes of type 'q5' only when the
Max Drift control is set to 50. This fix prevents
double-incrementing of the message averaging counter on the first
decoding sequence.
- Polarization offset 'Dpol' from the astronomical data window is now
written to file azel.dat if environment variable
WSJT_AZEL_EXTRA_LINES has been defined as 1 or greater. Dpol is
especially useful for EME on the higher microwave bands.
- The Auto Log QSO option in "Settings->Reporting" now behaves the
same as the Prompt to log QSO option when not in a special
operating context mode.
- The Fast/Normal/Deep setting in Q65 mode is now a sticky setting
and is no longer reset to Fast on program startup or when Settings
has been opened. The user selection is used for automatic decodes,
but Deep is used for any subsequent manual decode attempts.
- New hamlib code to correct minor flaws in controlling several rigs.
- Update the Chinese and Hong Kong translations of the user
interface.
- Note that since the WSJT-X v2.5.0 GA release we have not been
providing pre-built 32-bit packages for Linux on Intel CPUs, this
is due to the mainstream Linux Desktop distributions no longer
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 Release: WSJT-X 2.5.1
Oct 21, 2021 Oct 21, 2021
---------------------- ----------------------

View File

@ -385,7 +385,7 @@ auto DXLabSuiteCommanderTransceiver::get_mode () -> MODE
void DXLabSuiteCommanderTransceiver::simple_command (QString const& cmd) void DXLabSuiteCommanderTransceiver::simple_command (QString const& cmd)
{ {
Q_ASSERT (commander_); if (!commander_) return;
CAT_TRACE (cmd); CAT_TRACE (cmd);
@ -398,7 +398,7 @@ void DXLabSuiteCommanderTransceiver::simple_command (QString const& cmd)
QString DXLabSuiteCommanderTransceiver::command_with_reply (QString const& cmd) QString DXLabSuiteCommanderTransceiver::command_with_reply (QString const& cmd)
{ {
Q_ASSERT (commander_); if (!commander_) return QString {};
if (!write_to_port (cmd)) if (!write_to_port (cmd))
{ {

View File

@ -1005,7 +1005,7 @@ void HRDTransceiver::do_poll ()
QString HRDTransceiver::send_command (QString const& cmd, bool prepend_context, bool recurse) QString HRDTransceiver::send_command (QString const& cmd, bool prepend_context, bool recurse)
{ {
Q_ASSERT (hrd_); if (!hrd_) return QString {};
QString result; QString result;

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 // for the 1st time as a band change may cause a recalled mode to be
// set // 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); update_rx_frequency (f);
if (m_->mode_query_works_ && UNK != m) 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; rmode_t current_mode;
pbwidth_t current_width; pbwidth_t current_width;
auto new_mode = m_->map_mode (m); 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); CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
if (new_mode != current_mode) if (new_mode != current_mode)
{ {
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_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 // for the 2nd time because a mode change may have caused a
// frequency change // frequency change
@ -905,7 +910,7 @@ void HamlibTransceiver::do_frequency (Frequency f, MODE m, bool no_ignore)
// for the second time because some rigs change mode according // for the second time because some rigs change mode according
// to frequency such as the TS-2000 auto mode setting // to frequency such as the TS-2000 auto mode setting
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_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"));
} }
update_mode (m); update_mode (m);
} }
@ -1037,16 +1042,22 @@ void HamlibTransceiver::do_mode (MODE mode)
pbwidth_t current_width; pbwidth_t current_width;
auto new_mode = m_->map_mode (mode); 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 // only change when receiving or simplex if direct VFO addressing unavailable
if (!(state ().ptt () && state ().split () && m_->one_VFO_)) 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); CAT_TRACE ("rig_get_mode mode=" << rig_strrmode (current_mode) << " bw=" << current_width);
if (new_mode != current_mode) if (new_mode != current_mode)
{ {
CAT_TRACE ("rig_set_mode mode=" << rig_strrmode (new_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"));
} }
} }

1584
cty.dat

File diff suppressed because it is too large Load Diff

View File

@ -11,7 +11,9 @@ image::main-ui-controls.png[align="center",width=650,alt="Main UI Controls"]
* *Log QSO* raises a dialog window pre-filled with known information * *Log QSO* raises a dialog window pre-filled with known information
about a QSO you have nearly completed. You can edit or add to this about a QSO you have nearly completed. You can edit or add to this
information before clicking *OK* to log the QSO. If you check *Prompt information before clicking *OK* to log the QSO. If you check *Prompt
me to log QSO* on the *File -> Settings -> Reporting* tab, the program raises the confirmation screen automatically when you send a message containing +73+. *Start Date* and *Start Time* are set when you click me to log QSO* on the *File -> Settings -> Reporting* tab, the program
raises the confirmation screen automatically when you send a message
containing +73+. *Start Date* and *Start Time* are set when you click
to send the *Tx 2* or *Tx 3* message, and backed up by one or two to send the *Tx 2* or *Tx 3* message, and backed up by one or two
sequence lengths, respectively. (Note that the actual start time may sequence lengths, respectively. (Note that the actual start time may
have been earlier if repeats of early transmissions were required.) have been earlier if repeats of early transmissions were required.)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -7,8 +7,11 @@ messages such as the examples shown below.
image::tx-macros.png[align="center",alt="Tx Macros Screen"] 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 - To add a new message to the list, enter the desired text in the
characters) in the entry field at top, then click *Add*. 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 - To remove an unwanted message, click on the message and then on
*Delete*. *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* - Messages can also be added from the main window's *Tx5*
field. Simply hit [Enter] after the message has been entered. 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

@ -333,6 +333,27 @@ correlation algorithm. JT65 and Q65 offer _a priori_ (AP)
decoding, which takes advantage of naturally accumulating information decoding, which takes advantage of naturally accumulating information
during a QSO. during a QSO.
For CW mode on SHF and microwave EME WSJT-X can be used to do Doppler
shift correction if desired:
- Check the *Settings -> Radio -> Mode -> None* option, this stops _WSJT-X_
from trying to set the mode of your rig.
- Put you rig into CW mode as normal.
- Before transmitting press *Tune* in _WSJT-X_, no tones will be
transmitted as the rig is in CW mode, but importantly WSJT-X knows
your are transmitting and adjusts the Doppler shift correction as
needed for the currently selected Doppler shift correction mode in
transmit.
- When you have finish transmitting CW press *Tune* again to revert to
receive mode and the correct Doppler shift correction for receiving.
NOTE: The above assumes you are already set up for _WSJT-X_
<<VHF_SETUP,Doppler shift correction>> with working CAT control, and
*Monitor* enabled etc..
//// ////
The following tutorial aims to familiarize you with The following tutorial aims to familiarize you with
these program features, all of which are of special interest for EME these program features, all of which are of special interest for EME

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), dimension(1:MAXRECENT) :: recent_calls=''
character (len=13) :: mycall13='' character (len=13) :: mycall13=''
character (len=13) :: dxcall13='' character (len=13) :: dxcall13=''
character (len=6) :: dxbase=''
integer, dimension(1:MAXHASH) :: ihash22=-1 integer, dimension(1:MAXHASH) :: ihash22=-1
integer :: nzhash=0 integer :: nzhash=0
integer n28a,n28b integer n28a,n28b
@ -124,6 +125,11 @@ subroutine pack77(msg0,i3,n3,c77)
integer ntel(3) integer ntel(3)
msg=msg0 msg=msg0
if(msg(1:3).eq.'$DX') then
i1=index(msg,' ')
msg=trim(dxbase)//' '//msg(i1+1:)
endif
i3_hint=i3 i3_hint=i3
n3_hint=n3 n3_hint=n3
i3=-1 i3=-1

View File

@ -9,7 +9,7 @@ module q65
integer apmask(13),apsymbols(13) integer apmask(13),apsymbols(13)
integer,dimension(22) :: isync = (/1,9,12,13,15,22,23,26,27,33,35, & integer,dimension(22) :: isync = (/1,9,12,13,15,22,23,26,27,33,35, &
38,46,50,55,60,62,66,69,74,76,85/) 38,46,50,55,60,62,66,69,74,76,85/)
integer codewords(63,207) integer codewords(63,206)
integer ibwa,ibwb,ncw,nsps,mode_q65,nfa,nfb,nqd integer ibwa,ibwb,ncw,nsps,mode_q65,nfa,nfb,nqd
integer idfbest,idtbest,ibw,ndistbest,maxiters,max_drift integer idfbest,idtbest,ibw,ndistbest,maxiters,max_drift
integer istep,nsmo,lag1,lag2,npasses,nused,iseq,ncand,nrc integer istep,nsmo,lag1,lag2,npasses,nused,iseq,ncand,nrc

View File

@ -1,6 +1,6 @@
subroutine q65_set_list(mycall,hiscall,hisgrid,codewords,ncw) subroutine q65_set_list(mycall,hiscall,hisgrid,codewords,ncw)
parameter (MAX_NCW=207) parameter (MAX_NCW=206)
character*12 mycall,hiscall character*12 mycall,hiscall
character*6 hisgrid character*6 hisgrid
character*37 msg0,msg,msgsent character*37 msg0,msg,msgsent
@ -44,7 +44,6 @@ subroutine q65_set_list(mycall,hiscall,hisgrid,codewords,ncw)
if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+' if(msg(j0+1:j0+1).eq.' ') msg(j0+1:j0+1)='+'
endif endif
endif endif
if(i.eq.207) msg='TNX 73 GL'
10 call genq65(msg,0,msgsent,itone,i3,n3) 10 call genq65(msg,0,msgsent,itone,i3,n3)
i0=1 i0=1

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

View File

@ -1410,7 +1410,7 @@ void MainWindow::readFromStdout() //readFromStdout
#ifdef WIN32 #ifdef WIN32
m=3; m=3;
#endif #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(); n=ui->decodedTextBrowser->verticalScrollBar()->maximum();
ui->decodedTextBrowser->verticalScrollBar()->setValue(n); ui->decodedTextBrowser->verticalScrollBar()->setValue(n);
m_messagesText=""; m_messagesText="";
@ -1439,7 +1439,6 @@ void MainWindow::readFromStdout() //readFromStdout
int n=t.size(); int n=t.size();
qDebug() << t.mid(1,n-3).trimmed(); qDebug() << t.mid(1,n-3).trimmed();
} }
} }
} }

View File

@ -15,7 +15,10 @@ CAboutDlg::CAboutDlg(QWidget *parent) :
ui->labelTxt->setText ("<h2>" + QString {"WSJT-X v" ui->labelTxt->setText ("<h2>" + QString {"WSJT-X v"
+ QCoreApplication::applicationVersion () + 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 />" "WSJT-X implements a number of digital modes designed for <br />"
"weak-signal Amateur Radio communication. <br /><br />" "weak-signal Amateur Radio communication. <br /><br />"
"&copy; 2001-2021 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />" "&copy; 2001-2021 by Joe Taylor, K1JT, Bill Somerville, G4WJS, <br />"

View File

@ -184,6 +184,8 @@ extern "C" {
void get_ft4msg_(int* idecode, char* line, int len); void get_ft4msg_(int* idecode, char* line, int len);
void chk_samples_(int* m_ihsym,int* k, int* m_hsymStop); void chk_samples_(int* m_ihsym,int* k, int* m_hsymStop);
void save_dxbase_(char* dxbase, int len);
} }
int volatile itone[MAX_NUM_SYMBOLS]; //Audio tones for all Tx symbols int volatile itone[MAX_NUM_SYMBOLS]; //Audio tones for all Tx symbols
@ -210,7 +212,7 @@ using SpecOp = Configuration::SpecialOperatingActivity;
namespace namespace
{ {
Radio::Frequency constexpr default_frequency {14076000}; Radio::Frequency constexpr default_frequency {14076000};
QRegExp message_alphabet {"[- @A-Za-z0-9+./?#<>;]*"}; QRegExp message_alphabet {"[- @A-Za-z0-9+./?#<>;$]*"};
// grid exact match excluding RR73 // grid exact match excluding RR73
QRegularExpression grid_regexp {"\\A(?![Rr]{2}73)[A-Ra-r]{2}[0-9]{2}([A-Xa-x]{2}){0,1}\\z"}; QRegularExpression grid_regexp {"\\A(?![Rr]{2}73)[A-Ra-r]{2}[0-9]{2}([A-Xa-x]{2}){0,1}\\z"};
auto quint32_max = std::numeric_limits<quint32>::max (); auto quint32_max = std::numeric_limits<quint32>::max ();
@ -3641,9 +3643,11 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler
{ {
auto const& message_words = message.messageWords (); auto const& message_words = message.messageWords ();
auto is_73 = message_words.filter (QRegularExpression {"^(73|RR73)$"}).size(); auto is_73 = message_words.filter (QRegularExpression {"^(73|RR73)$"}).size();
auto msg_no_hash = message.clean_string();
msg_no_hash = msg_no_hash.mid(22).remove("<").remove(">");
bool is_OK=false; bool is_OK=false;
if(m_mode=="MSK144" and message.clean_string ().indexOf(ui->dxCallEntry->text()+" R ")>0) is_OK=true; if(m_mode=="MSK144" && msg_no_hash.indexOf(ui->dxCallEntry->text()+" R ")>0) is_OK=true;
if (message_words.size () > 2 && (message.isStandardMessage() || (is_73 or is_OK))) { if (message_words.size () > 3 && (message.isStandardMessage() || (is_73 or is_OK))) {
auto df = message.frequencyOffset (); auto df = message.frequencyOffset ();
auto within_tolerance = (qAbs (ui->RxFreqSpinBox->value () - df) <= int (start_tolerance) auto within_tolerance = (qAbs (ui->RxFreqSpinBox->value () - df) <= int (start_tolerance)
|| qAbs (ui->TxFreqSpinBox->value () - df) <= int (start_tolerance)); || qAbs (ui->TxFreqSpinBox->value () - df) <= int (start_tolerance));
@ -3657,7 +3661,7 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler
|| message_words.contains ("DE"))) || message_words.contains ("DE")))
|| !message.isStandardMessage ()); // free text 73/RR73 || !message.isStandardMessage ()); // free text 73/RR73
QStringList w=message.clean_string ().mid(22).remove("<").remove(">").split(" ",SkipEmptyParts); auto const& w = msg_no_hash.split(" ",SkipEmptyParts);
QString w2; QString w2;
int nrpt=0; int nrpt=0;
if (w.size () > 2) if (w.size () > 2)
@ -3675,27 +3679,29 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler
if (m_auto if (m_auto
&& (m_QSOProgress==REPLYING or (!ui->tx1->isEnabled () and m_QSOProgress==REPORT)) && (m_QSOProgress==REPLYING or (!ui->tx1->isEnabled () and m_QSOProgress==REPORT))
&& qAbs (ui->TxFreqSpinBox->value () - df) <= int (stop_tolerance) && qAbs (ui->TxFreqSpinBox->value () - df) <= int (stop_tolerance)
&& message_words.at (1) != "DE" && message_words.at (2) != "DE"
&& !message_words.at (1).contains (QRegularExpression {"(^(CQ|QRZ))|" + m_baseCall}) && !message_words.at (2).contains (QRegularExpression {"(^(CQ|QRZ))|" + m_baseCall})
&& message_words.at (2).contains (Radio::base_callsign (ui->dxCallEntry->text ()))) { && message_words.at (3).contains (Radio::base_callsign (ui->dxCallEntry->text ()))) {
// auto stop to avoid accidental QRM // auto stop to avoid accidental QRM
ui->stopTxButton->click (); // halt any transmission ui->stopTxButton->click (); // halt any transmission
} else if (m_auto // transmit allowed } else if (m_auto // transmit allowed
&& ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isEnabled () && ui->cbAutoSeq->isChecked () // auto-sequencing allowed && ui->cbAutoSeq->isVisible () && ui->cbAutoSeq->isEnabled () && ui->cbAutoSeq->isChecked () // auto-sequencing allowed
&& ((!m_bCallingCQ // not calling CQ/QRZ && ((!m_bCallingCQ // not calling CQ/QRZ
&& !m_sentFirst73 // not finished QSO && !m_sentFirst73 // not finished QSO
&& ((message_words.at (1).contains (m_baseCall) && ((message_words.at (2).contains (m_baseCall)
// being called and not already in a QSO // being called and not already in a QSO
&& (message_words.at(2).contains(Radio::base_callsign(ui->dxCallEntry->text())) or bEU_VHF)) && (message_words.at(3).contains(Radio::base_callsign(ui->dxCallEntry->text()))
or bEU_VHF))
|| message_words.at(1) == m_baseCall // <de-call> RR73; ...
// type 2 compound replies // type 2 compound replies
|| (within_tolerance && || (within_tolerance &&
(acceptable_73 || (acceptable_73 ||
("DE" == message_words.at (1) && ("DE" == message_words.at (2) &&
w2.contains(Radio::base_callsign (m_hisCall))))))) w2.contains(Radio::base_callsign (m_hisCall)))))))
|| (m_bCallingCQ && m_bAutoReply || (m_bCallingCQ && m_bAutoReply
// look for type 2 compound call replies on our Tx and Rx offsets // look for type 2 compound call replies on our Tx and Rx offsets
&& ((within_tolerance && "DE" == message_words.at (1)) && ((within_tolerance && "DE" == message_words.at (2))
|| message_words.at (1).contains (m_baseCall))))) { || message_words.at (2).contains (m_baseCall))))) {
if(SpecOp::FOX != m_config.special_op_id()) processMessage (message); if(SpecOp::FOX != m_config.special_op_id()) processMessage (message);
} }
} }
@ -4806,7 +4812,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
ui->txFirstCheckBox->setChecked(m_txFirst); ui->txFirstCheckBox->setChecked(m_txFirst);
auto const& message_words = message.messageWords (); auto const& message_words = message.messageWords ();
if (message_words.size () < 2) return; if (message_words.size () < 3) return;
QString hiscall; QString hiscall;
QString hisgrid; QString hisgrid;
@ -4824,7 +4830,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
QStringList w=message.clean_string ().mid(22).remove("<").remove(">").split(" ",SkipEmptyParts); QStringList w=message.clean_string ().mid(22).remove("<").remove(">").split(" ",SkipEmptyParts);
int nw=w.size(); int nw=w.size();
if(nw>=4) { if(nw>=4) {
if(message_words.size()<3) return; if(message_words.size()<4) return;
int n=w.at(nw-2).toInt(); int n=w.at(nw-2).toInt();
if(n>=520001 and n<=592047) { if(n>=520001 and n<=592047) {
hiscall=w.at(1); hiscall=w.at(1);
@ -4847,7 +4853,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
// ignore calls by other hounds // ignore calls by other hounds
if (SpecOp::HOUND == m_config.special_op_id() if (SpecOp::HOUND == m_config.special_op_id()
&& message.messageWords ().indexOf (QRegularExpression {R"(R\+-[0-9]+)"}) >= 0) && message.messageWords ().indexOf (QRegularExpression {R"(R\+-[0-9]+)"}) >= 1)
{ {
return; return;
} }
@ -4926,22 +4932,22 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
MessageBox::information_message (this, tr ("Should you switch to RTTY contest mode?")); MessageBox::information_message (this, tr ("Should you switch to RTTY contest mode?"));
} }
if(SpecOp::EU_VHF==m_config.special_op_id() and message_words.at(1).contains(m_baseCall) and if(SpecOp::EU_VHF==m_config.special_op_id() and message_words.at(2).contains(m_baseCall) and
(!message_words.at(2).contains(qso_partner_base_call)) and (!m_bDoubleClicked)) { (!message_words.at(3).contains(qso_partner_base_call)) and (!m_bDoubleClicked)) {
return; return;
} }
bool bContestOK=(m_mode=="FT4" or m_mode=="FT8" or m_mode=="Q65" or m_mode=="MSK144"); bool bContestOK=(m_mode=="FT4" or m_mode=="FT8" or m_mode=="Q65" or m_mode=="MSK144");
if(message_words.size () > 3 // enough fields for a normal message if(message_words.size () > 4 // enough fields for a normal message
&& (message_words.at(1).contains(m_baseCall) || "DE" == message_words.at(1)) && (message_words.at(2).contains(m_baseCall) || "DE" == message_words.at(2))
&& (message_words.at(2).contains(qso_partner_base_call) or m_bDoubleClicked && (message_words.at(3).contains(qso_partner_base_call) or m_bDoubleClicked
or bEU_VHF_w2 or (m_QSOProgress==CALLING))) { or bEU_VHF_w2 or (m_QSOProgress==CALLING))) {
if(message_words.at(3).contains(grid_regexp) and SpecOp::EU_VHF!=m_config.special_op_id()) { if(message_words.at(4).contains(grid_regexp) and SpecOp::EU_VHF!=m_config.special_op_id()) {
if((SpecOp::NA_VHF==m_config.special_op_id() or SpecOp::WW_DIGI==m_config.special_op_id()) and bContestOK){ if((SpecOp::NA_VHF==m_config.special_op_id() or SpecOp::WW_DIGI==m_config.special_op_id()) and bContestOK){
setTxMsg(3); setTxMsg(3);
m_QSOProgress=ROGER_REPORT; m_QSOProgress=ROGER_REPORT;
} else { } else {
if(m_mode=="JT65" and message_words.size()>4 and message_words.at(4)=="OOO") { if(m_mode=="JT65" and message_words.size()>5 and message_words.at(5)=="OOO") {
setTxMsg(3); setTxMsg(3);
m_QSOProgress=ROGER_REPORT; m_QSOProgress=ROGER_REPORT;
} else { } else {
@ -4981,7 +4987,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
m_QSOProgress=ROGER_REPORT; m_QSOProgress=ROGER_REPORT;
} }
} else { // no grid on end of msg } else { // no grid on end of msg
auto const& word_3 = message_words.at (3); auto const& word_3 = message_words.at (4);
auto word_3_as_number = word_3.toInt (); auto word_3_as_number = word_3.toInt ();
if (("RRR" == word_3 if (("RRR" == word_3
|| (word_3_as_number == 73 && ROGERS == m_QSOProgress) || (word_3_as_number == 73 && ROGERS == m_QSOProgress)
@ -5103,17 +5109,29 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
} }
} }
} }
else if (5 == message_words.size ()
&& m_baseCall == message_words.at (1)) {
// dual Fox style message, possibly from MSHV
if (m_config.prompt_to_log() || m_config.autoLog()) {
logQSOTimer.start(0);
}
else {
cease_auto_Tx_after_QSO ();
}
m_ntx=6;
ui->txrb6->setChecked(true);
}
else if (m_QSOProgress >= ROGERS else if (m_QSOProgress >= ROGERS
&& message_words.size () > 2 && message_words.at (1).contains (m_baseCall) && message_words.size () > 3 && message_words.at (2).contains (m_baseCall)
&& message_words.at (2) == "73") { && message_words.at (3) == "73") {
// 73 back to compound call holder // 73 back to compound call holder
m_ntx=5; m_ntx=5;
ui->txrb5->setChecked(true); ui->txrb5->setChecked(true);
m_QSOProgress = SIGNOFF; m_QSOProgress = SIGNOFF;
} }
else if (!(m_bAutoReply && (m_QSOProgress > CALLING))) { else if (!(m_bAutoReply && (m_QSOProgress > CALLING))) {
if ((message_words.size () > 4 && message_words.at (1).contains (m_baseCall) if ((message_words.size () > 5 && message_words.at (2).contains (m_baseCall)
&& message_words.at (4) == "OOO")) { && message_words.at (5) == "OOO")) {
// EME short code report or MSK144/FT8 contest mode reply, send back Tx3 // EME short code report or MSK144/FT8 contest mode reply, send back Tx3
m_ntx=3; m_ntx=3;
m_QSOProgress = ROGER_REPORT; m_QSOProgress = ROGER_REPORT;
@ -5136,7 +5154,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
return; return;
} }
} }
else if (firstcall == "DE" && message_words.size () > 3 && message_words.at (3) == "73") { else if (firstcall == "DE" && message_words.size () > 4 && message_words.at (4) == "73") {
if (m_QSOProgress >= ROGERS && base_call == qso_partner_base_call && m_currentMessageType) { if (m_QSOProgress >= ROGERS && base_call == qso_partner_base_call && m_currentMessageType) {
// 73 back to compound call holder // 73 back to compound call holder
m_ntx=5; m_ntx=5;
@ -5356,6 +5374,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
auto is_type_one = !is77BitMode () && is_compound && shortList (my_callsign); auto is_type_one = !is77BitMode () && is_compound && shortList (my_callsign);
auto const& my_grid = m_config.my_grid ().left (4); auto const& my_grid = m_config.my_grid ().left (4);
auto const& hisBase = Radio::base_callsign (hisCall); auto const& hisBase = Radio::base_callsign (hisCall);
save_dxbase_(const_cast <char *> ((hisBase + " ").left (6).toLatin1().constData()),6);
auto eme_short_codes = m_config.enable_VHF_features () && ui->cbShMsgs->isChecked () auto eme_short_codes = m_config.enable_VHF_features () && ui->cbShMsgs->isChecked ()
&& m_mode == "JT65"; && m_mode == "JT65";
@ -5837,6 +5856,13 @@ void MainWindow::on_dxCallEntry_textChanged (QString const& call)
statusUpdate (); statusUpdate ();
} }
void MainWindow::on_dxCallEntry_editingFinished()
{
auto const& dxBase = Radio::base_callsign (m_hisCall);
save_dxbase_(const_cast <char *> ((dxBase + " ").left (6).toLatin1().constData()),6);
}
void MainWindow::on_dxCallEntry_returnPressed () void MainWindow::on_dxCallEntry_returnPressed ()
{ {
on_lookupButton_clicked(); on_lookupButton_clicked();
@ -7743,10 +7769,11 @@ void MainWindow::replyToCQ (QTime time, qint32 snr, float delta_time, quint32 de
, bool /*low_confidence*/, quint8 modifiers) , bool /*low_confidence*/, quint8 modifiers)
{ {
QString format_string {"%1 %2 %3 %4 %5 %6"}; QString format_string {"%1 %2 %3 %4 %5 %6"};
auto const& time_string = time.toString ("~" == mode || "&" == mode auto const& time_string = time.toString ("~" == mode || "&" == mode || "+" == mode
|| "+" == mode ? "hhmmss" : "hhmm"); || (m_TRperiod < 60. && ("`" == mode || ":" == mode))
? "hhmmss" : "hhmm");
auto text = message_text; auto text = message_text;
auto ap_pos = text.lastIndexOf (QRegularExpression {R"((?:\?\s)?a[0-9]$)"}); auto ap_pos = text.lastIndexOf (QRegularExpression {R"((?:\?\s)?(?:a[0-9]|q[0-9][0-9]?)$)"});
if (ap_pos >= 0) if (ap_pos >= 0)
{ {
// beware of decodes ending on shorter version of wanted call so // beware of decodes ending on shorter version of wanted call so
@ -7867,7 +7894,7 @@ void MainWindow::postDecode (bool is_new, QString const& message)
, parts[1].toInt () , parts[1].toInt ()
, parts[2].toFloat (), parts[3].toUInt (), parts[4] , parts[2].toFloat (), parts[3].toUInt (), parts[4]
, decode.mid (has_seconds ? 24 : 22) , decode.mid (has_seconds ? 24 : 22)
, QChar {'?'} == decode.mid (has_seconds ? 24 + 21 : 22 + 21, 1) , QChar {'?'} == decode.mid (has_seconds ? 24 + 36 : 22 + 36, 1)
, m_diskData); , m_diskData);
} }
} }

View File

@ -204,6 +204,7 @@ private slots:
void on_addButton_clicked(); void on_addButton_clicked();
void on_dxCallEntry_textChanged (QString const&); void on_dxCallEntry_textChanged (QString const&);
void on_dxGridEntry_textChanged (QString const&); void on_dxGridEntry_textChanged (QString const&);
void on_dxCallEntry_editingFinished();
void on_dxCallEntry_returnPressed (); void on_dxCallEntry_returnPressed ();
void on_genStdMsgsPushButton_clicked(); void on_genStdMsgsPushButton_clicked();
void on_logQSOButton_clicked(); void on_logQSOButton_clicked();

View File

@ -1701,9 +1701,6 @@ When not checked you can view the calibration results.</string>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="maxLength">
<number>30</number>
</property>
</widget> </widget>
</item> </item>
<item row="4" column="1"> <item row="4" column="1">
@ -1755,9 +1752,6 @@ Double click to toggle the use of the Tx1 message to start a QSO with a station
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="maxLength">
<number>30</number>
</property>
</widget> </widget>
</item> </item>
<item row="5" column="2"> <item row="5" column="2">
@ -1804,9 +1798,6 @@ Double-click to reset to the standard 73 message</string>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="maxLength">
<number>30</number>
</property>
</widget> </widget>
</item> </item>
<item row="0" column="2"> <item row="0" column="2">
@ -1846,9 +1837,6 @@ Double-click to reset to the standard 73 message</string>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="maxLength">
<number>30</number>
</property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
@ -1859,9 +1847,6 @@ Double-click to reset to the standard 73 message</string>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="maxLength">
<number>30</number>
</property>
</widget> </widget>
</item> </item>
<item row="0" column="0"> <item row="0" column="0">
@ -2863,6 +2848,14 @@ Yellow when too low</string>
</layout> </layout>
</widget> </widget>
<widget class="QMenuBar" name="menuBar"> <widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>842</width>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menuFile"> <widget class="QMenu" name="menuFile">
<property name="title"> <property name="title">
<string>File</string> <string>File</string>