Merge branch 'hotfix-2.1.1'

This commit is contained in:
Bill Somerville 2019-11-24 21:18:55 +00:00
commit 9c331103fe
No known key found for this signature in database
GPG Key ID: D864B06D1E81618F
42 changed files with 1631 additions and 1327 deletions

View File

@ -571,6 +571,7 @@ private:
DecodeHighlightingModel decode_highlighing_model_;
DecodeHighlightingModel next_decode_highlighing_model_;
bool highlight_by_mode_;
bool highlight_only_fields_;
bool include_WAE_entities_;
int LotW_days_since_upload_;
@ -753,6 +754,7 @@ bool Configuration::pwrBandTuneMemory () const {return m_->pwrBandTuneMemory_;}
LotWUsers const& Configuration::lotw_users () const {return m_->lotw_users_;}
DecodeHighlightingModel const& Configuration::decode_highlighting () const {return m_->decode_highlighing_model_;}
bool Configuration::highlight_by_mode () const {return m_->highlight_by_mode_;}
bool Configuration::highlight_only_fields () const {return m_->highlight_only_fields_;}
bool Configuration::include_WAE_entities () const {return m_->include_WAE_entities_;}
void Configuration::set_calibration (CalibrationParams params)
@ -959,6 +961,7 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
, station_insert_action_ {tr ("&Insert ..."), nullptr}
, station_dialog_ {new StationDialog {&next_stations_, &bands_, this}}
, highlight_by_mode_ {false}
, highlight_only_fields_ {false}
, include_WAE_entities_ {false}
, LotW_days_since_upload_ {0}
, last_port_type_ {TransceiverFactory::Capabilities::none}
@ -1325,6 +1328,7 @@ void Configuration::impl::initialize_models ()
next_decode_highlighing_model_.items (decode_highlighing_model_.items ());
ui_->highlight_by_mode_check_box->setChecked (highlight_by_mode_);
ui_->only_fields_check_box->setChecked (highlight_only_fields_);
ui_->include_WAE_check_box->setChecked (include_WAE_entities_);
ui_->LotW_days_since_upload_spin_box->setValue (LotW_days_since_upload_);
@ -1474,6 +1478,7 @@ void Configuration::impl::read_settings ()
if (!highlight_items.size ()) highlight_items = DecodeHighlightingModel::default_items ();
decode_highlighing_model_.items (highlight_items);
highlight_by_mode_ = settings_->value("HighlightByMode", false).toBool ();
highlight_only_fields_ = settings_->value("OnlyFieldsSought", false).toBool ();
include_WAE_entities_ = settings_->value("IncludeWAEEntities", false).toBool ();
LotW_days_since_upload_ = settings_->value ("LotWDaysSinceLastUpload", 365).toInt ();
lotw_users_.set_age_constraint (LotW_days_since_upload_);
@ -1588,6 +1593,7 @@ void Configuration::impl::write_settings ()
settings_->setValue ("stations", QVariant::fromValue (stations_.station_list ()));
settings_->setValue ("DecodeHighlighting", QVariant::fromValue (decode_highlighing_model_.items ()));
settings_->setValue ("HighlightByMode", highlight_by_mode_);
settings_->setValue ("OnlyFieldsSought", highlight_only_fields_);
settings_->setValue ("IncludeWAEEntities", include_WAE_entities_);
settings_->setValue ("LotWDaysSinceLastUpload", LotW_days_since_upload_);
settings_->setValue ("toRTTY", log_as_RTTY_);
@ -2130,6 +2136,7 @@ void Configuration::impl::accept ()
Q_EMIT self_->decode_highlighting_changed (decode_highlighing_model_);
}
highlight_by_mode_ = ui_->highlight_by_mode_check_box->isChecked ();
highlight_only_fields_ = ui_->only_fields_check_box->isChecked ();
include_WAE_entities_ = ui_->include_WAE_check_box->isChecked ();
LotW_days_since_upload_ = ui_->LotW_days_since_upload_spin_box->value ();
lotw_users_.set_age_constraint (LotW_days_since_upload_);

View File

@ -177,6 +177,7 @@ public:
LotWUsers const& lotw_users () const;
DecodeHighlightingModel const& decode_highlighting () const;
bool highlight_by_mode () const;
bool highlight_only_fields () const;
bool include_WAE_entities () const;
enum class SpecialOperatingActivity {NONE, NA_VHF, EU_VHF, FIELD_DAY, RTTY, FOX, HOUND};

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>546</width>
<height>553</height>
<width>554</width>
<height>563</height>
</rect>
</property>
<property name="windowTitle">
@ -2206,8 +2206,45 @@ Right click for insert and delete options.</string>
<property name="title">
<string>Decode Highlightling</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
<layout class="QGridLayout" name="gridLayout_5">
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_15">
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="rescan_log_push_button">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Click to scan the wsjtx_log.adi ADIF file again for worked before information&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Rescan ADIF Log</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0" colspan="2">
<widget class="QPushButton" name="reset_highlighting_to_defaults_push_button">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Push to reset all highlight items above to default values and priorities.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Reset Highlighting</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="DecodeHighlightingListView" name="highlighting_list_view">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
@ -2247,19 +2284,7 @@ Right click for insert and delete options.</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="reset_highlighting_to_defaults_push_button">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Push to reset all highlight items above to default values and priorities.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Reset Highlighting</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_15">
<item>
<item row="2" column="0">
<widget class="QCheckBox" name="highlight_by_mode_check_box">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check to indicate new DXCC entities, grid squares, and callsigns per mode.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
@ -2269,47 +2294,22 @@ Right click for insert and delete options.</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="rescan_log_push_button">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Click to scan the wsjtx_log.adi ADIF file again for worked before information&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Rescan ADIF Log</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QFormLayout" name="formLayout_20">
<item row="0" column="0">
<widget class="QCheckBox" name="include_WAE_check_box"/>
</item>
<item row="0" column="1">
<widget class="QLabel" name="includeExtraWAEEntitiesLabel">
<item row="4" column="0">
<widget class="QCheckBox" name="include_WAE_check_box">
<property name="text">
<string>Include extra WAE entities</string>
</property>
<property name="buddy">
<cstring>include_WAE_check_box</cstring>
</property>
</widget>
</item>
</layout>
<item row="3" column="0">
<widget class="QCheckBox" name="only_fields_check_box">
<property name="toolTip">
<string>Check to for grid highlighting to only apply to unworked grid fields</string>
</property>
<property name="text">
<string>Only grid Fields sought</string>
</property>
</widget>
</item>
</layout>
</widget>
@ -3102,13 +3102,13 @@ Right click for insert and delete options.</string>
</connection>
</connections>
<buttongroups>
<buttongroup name="special_op_activity_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="special_op_activity_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
</buttongroups>
</ui>

View File

@ -37,7 +37,7 @@ alterations. Otherwise you must edit the file to increase shmall according to t
Now move this file into place for the system to use by typing: (Note this assumes that
you really did drag this file to your Desktop as required earlier.)
sudo cp $HOME/Desktop/sysctl.conf /etc/
sudo cp "$HOME/Desktop/sysctl.conf" /etc/
sudo chmod 664 /etc/sysctl.conf
sudo chown root:wheel /etc/sysctl.conf

View File

@ -1023,6 +1023,7 @@ QString HRDTransceiver::send_command (QString const& cmd, bool no_debug, bool pr
if (!recurse && prepend_context)
{
auto radio_name = send_command ("get radio", true, current_radio_, true);
qDebug () << "HRDTransceiver::send_command: radio_name:" << radio_name;
auto radio_iter = std::find_if (radios_.begin (), radios_.end (), [this, &radio_name] (RadioMap::value_type const& radio)
{
return std::get<1> (radio) == radio_name;

26
NEWS
View File

@ -13,6 +13,32 @@
Copyright 2001 - 2019 by Joe Taylor, K1JT.
Release: WSJT-X 2.1.1
November 25, 2019
---------------------
WSJT-X 2.1.1 is a bug fix only release addressing regressions in the
prior v2.1.0 release.
- Document rules for the UDP message protocol.
- Fix bug that could cause display of a blank Settings window.
- Fix message parsing to properly handle 4-character directed CQs
- Fix a potential crash in the interface to Omni-Rig.
- Improve handling of unexpected rig off line status changes from
Omni-Rig.
- Add an option to highlight unworked 2-character grid fields rather
than 4-character grid squares.
- Fix bug that caused unwanted disabling of "Enable Tx" in Fox mode.
- Log duplicate contacts in FT8 DXpedition Fox mode.
- Regenerate the GFSK Tx waveform if Tx audio frequency is changed.
- Fix the behavior of double-clicking on a decoded message with first
callsign displayed as an unresolved hash code <...>.
- Fix a problem with determining "worked before" status after a band
change.
- Updates to the WSJT-X 2.1 User Guide.
- Fix a production issue with the macOS tool chain that generated
broken executables.
Release: WSJT-X 2.1
July 15, 2019
-------------------

View File

@ -37,7 +37,8 @@
* offset qint32 only present if timespec=2
* timezone several-fields only present if timespec=3
*
* we will avoid using QDateTime fields with time zones for simplicity.
* we will avoid using QDateTime fields with time zones for
* simplicity.
*
* Type utf8 is a utf-8 byte string formatted as a QByteArray for
* serialization purposes (currently a quint32 size followed by size
@ -49,6 +50,7 @@
* strings and null strings. Empty strings have a length of zero
* whereas null strings have a length field of 0xffffffff.
*
*
* Schema Negotiation
* ------------------
*
@ -72,6 +74,36 @@
* Schema Version 3:- this schema uses the QDataStream::Qt_5_4 version.
*
*
* Backward Compatibility
* ----------------------
*
* It is important that applications developed at different times
* remain compatible with this protocol and with older or newer
* versions of WSJT-X. This is achieved by both third-party
* applications and WSJT-X honouring two basic rules.
*
* 1. New message types may be added to the protocol in the future,
* third-party applications and WSJT-X shall ignore silently any
* message types they do not recognize.
*
* 2. New fields may be added to existing message types, they will
* always be added to the end of the existing fields and the number
* and type of existing fields shall not change. If a field type
* must be changed; a new field will be added and the existing
* field will remain. The originator of such a message shall
* populate both the new and old field with reasonable
* values. Third-party applications and WSJT-X shall ignore
* silently any extra data received in datagrams after the fields
* they know about.
*
* Note that these rules are unrelated to the schema number above
* whose purpose is to distinguish between non-compatible encodings of
* field data types. New message types and extra fields in existing
* messages can and will be added without any change in schema number.
*
*
* Message Types
* -------------
*
* Message Direction Value Type
* ------------- --------- ---------------------- -----------

View File

@ -1,6 +1,5 @@
#include "OmniRigTransceiver.hpp"
#include <QTimer>
#include <QDebug>
#include <objbase.h>
#include <QThread>
@ -158,6 +157,12 @@ int OmniRigTransceiver::do_start ()
Q_ASSERT (rig_);
Q_ASSERT (!rig_->isNull ());
offline_timer_.reset (new QTimer); // instantiate here as
// constructor runs in wrong
// thread
offline_timer_->setSingleShot (true);
connect (offline_timer_.data (), &QTimer::timeout, [this] () {offline ("Rig went offline");});
if (use_for_ptt_ && (TransceiverFactory::PTT_method_DTR == ptt_type_ || TransceiverFactory::PTT_method_RTS == ptt_type_))
{
// fetch the interface for the serial port if we need it for PTT
@ -204,6 +209,8 @@ int OmniRigTransceiver::do_start ()
{
throw_qstring ("OmniRig: " + rig_->StatusStr ());
}
QThread::msleep (500); // leave some time for Omni-Rig to get
// the rig status for the 1st. time
auto f = rig_->GetRxFrequency ();
for (int i = 0; (f == 0) && (i < 5); ++i)
{
@ -297,6 +304,11 @@ void OmniRigTransceiver::do_stop ()
{
QThread::msleep (200); // leave some time for pending
// commands at the server end
offline_timer_.reset (); // destroy here rather than in
// destructor as destructor runs in
// wrong thread
if (port_)
{
port_->Unlock (); // release serial port
@ -358,10 +370,17 @@ void OmniRigTransceiver::handle_status_change (int rig_number)
TRACE_CAT ("OmniRigTransceiver", "OmniRig status change: new status = " << status);
if (OmniRig::ST_ONLINE != rig_->Status ())
{
offline ("Rig went offline");
if (!offline_timer_->isActive ())
{
// Omni-Rig is prone to reporting the rig offline and
// then recovering autonomously, so we will give it a
// few seconds to make its mind up
offline_timer_->start (10000);
}
}
else
{
offline_timer_->stop (); // good to go again
Q_EMIT notified ();
}
// else
@ -662,10 +681,9 @@ void OmniRigTransceiver::do_ptt (bool on)
port_->SetDtr (on);
}
}
else
else if (wrapped_)
{
TRACE_CAT ("OmniRigTransceiver", "set PTT using basic transceiver");
Q_ASSERT (wrapped_);
TransceiverState new_state {wrapped_->state ()};
new_state.ptt (on);
wrapped_->set (new_state, 0);

View File

@ -5,6 +5,7 @@
#include <QScopedPointer>
#include <QString>
#include <QTimer>
#include "TransceiverFactory.hpp"
#include "TransceiverBase.hpp"
@ -63,7 +64,7 @@ private:
QString rig_type_;
int readable_params_;
int writable_params_;
// QScopedPointer<QTimer> offline_timer_;
QScopedPointer<QTimer> offline_timer_;
bool send_update_signal_;
bool reversed_; // some rigs can reverse VFOs
};

97
README
View File

@ -11,70 +11,85 @@
Copyright (C) 2001 - 2018 by Joe Taylor, K1JT.
Copyright (C) 2001 - 2019 by Joe Taylor, K1JT.
WSJT-X is a computer program designed to facilitate basic amateur
radio communication using very weak signals. The first four letters in
the program name stand for “Weak Signal communication by K1JT,” while
the suffix “-X” indicates that WSJT-X started as an extended (and
experimental) branch of the program WSJT.
WSJT-X Version 2.1 offers ten different protocols or modes: FT4, FT8,
JT4, JT9, JT65, QRA64, ISCAT, MSK144, WSPR, and Echo. The first six
are designed for making reliable QSOs under weak-signal
conditions. They use nearly identical message structure and source
encoding. JT65 and QRA64 were designed for EME (“moonbounce”) on the
VHF/UHF bands and have also proven very effective for worldwide QRP
communication on the HF bands. QRA64 has a number of advantages over
JT65, including better performance on the very weakest signals. We
imagine that over time it may replace JT65 for EME use. JT9 was
originally designed for the LF, MF, and lower HF bands. Its submode
JT9A is 2 dB more sensitive than JT65 while using less than 10% of the
bandwidth. JT4 offers a wide variety of tone spacings and has proven
highly effective for EME on microwave bands up to 24 GHz. These four
“slow” modes use one-minute timed sequences of alternating
transmission and reception, so a minimal QSO takes four to six minutes
— two or three transmissions by each station, one sending in odd UTC
minutes and the other even. FT8 is operationally similar but four
times faster (15-second T/R sequences) and less sensitive by a few
dB. FT4 is faster still (7.5 s T/R sequences) and especially well
suited for radio contesting. On the HF bands, world-wide QSOs are
possible with any of these modes using power levels of a few watts (or
even milliwatts) and compromise antennas. QSOs are possible at signal
levels 10 to 15 dB below those required for CW.
WSJT-X Version 1.6 offers five protocols or “modes”: JT4, JT9, JT65
WSPR, and Echo. The first three are designed for making reliable QSOs
under extreme weak-signal conditions. They use nearly identical
message structure and source encoding. JT65 was designed for EME
(“moonbounce”) on the VHF/UHF bands and has also proven very effective
for worldwide QRP communication on the HF bands. JT9 is optimized for
the LF, MF, and lower HF bands. It is 2 dB more sensitive than JT65
while using less than 10% of the bandwidth. JT4 offers a wide variety
of tone spacings and has proved very effective for EME on microwave
bands up to 24 GHz. All three of these modes use one-minute timed
sequences of alternating transmission and reception, so a minimal QSO
takes four to six minutes — two or three transmissions by each
station, one sending in odd UTC minutes and the other even. On the HF
bands, world-wide QSOs are possible using power levels of a few watts
and compromise antennas. On VHF bands and higher, QSOs are possible
(by EME and other propagation types) at signal levels 10 to 15 dB
below those required for CW.
Note that even though their T/R sequences are short, FT4 and FT8 are
classified as slow modes because their message frames are sent only
once per transmission. All fast modes in WSJT-X send their message
frames repeatedly, as many times as will fit into the Tx sequence
length.
ISCAT, MSK144, and optionally submodes JT9E-H are “fast” protocols
designed to take advantage of brief signal enhancements from ionized
meteor trails, aircraft scatter, and other types of scatter
propagation. These modes use timed sequences of 5, 10, 15, or 30 s
duration. User messages are transmitted repeatedly at high rate (up to
250 characters per second, for MSK144) to make good use of the
shortest meteor-trail reflections or “pings”. ISCAT uses free-form
messages up to 28 characters long, while MSK144 uses the same
structured messages as the slow modes and optionally an abbreviated
format with hashed callsigns.
WSPR (pronounced “whisper”) stands for Weak Signal Propagation
Reporter. The WSPR protocol was designed for probing potential
propagation paths using low-power transmissions. WSPR messages
normally carry the transmitting stations callsign, grid locator, and
transmitter power in dBm, and they can be decoded at signal-to-noise
ratios as low as -28 dB in a 2500 Hz bandwidth. WSPR users with
internet access can automatically upload their reception reports to a
central database called {wsprnet} that provides a mapping facility,
ratios as low as -31 dB in a 2500 Hz bandwidth. WSPR users with
internet access can automatically upload reception reports to a
central database called WSPRnet that provides a mapping facility,
archival storage, and many other features.
Echo mode allows you to detect and measure your own lunar echoes, even
if they are far below the audible threshold.
Echo mode allows you to detect and measure your own stations echoes
from the moon, even if they are far below the audible threshold.
WSJT-X provides spectral displays for passbands up to 5 kHz, flexible
rig control for nearly all modern radios used by amateurs, and a wide
variety of special aids such as automatic Doppler tracking for EME
QSOs and Echo testing. The program runs equally well on Windows,
Macintosh, and Linux systems, and installation packages are available
for all three platforms.
WSJT-X provides spectral displays for receiver passbands as wide as 5
kHz, flexible rig control for nearly all modern radios used by
amateurs, and a wide variety of special aids such as automatic Doppler
tracking for EME QSOs and Echo testing. The program runs equally well
on Windows, Macintosh, and Linux systems, and installation packages
are available for all three platforms.
WSJT-X is an open-source project released under the GPLv3 license (See
COPYING). If you have programming or documentation skills or would
like to contribute to the project in other ways, please make your
interests known to the development team. The projects source-code
repository can be found at https://sourceforge.net/projects/wsjt, and
most communication among the developers takes place on the email
reflector https://sourceforge.net/p/wsjt/mailman. User-level
questions and answers, and general communication among users is found
on the https://groups.yahoo.com/neo/groups/wsjtgroup/info email
reflector.
communication among the developers takes place on the email reflector
https://sourceforge.net/p/wsjt/mailman. User-level questions and
answers, and general communication among users is found on the
https://groups.yahoo.com/neo/groups/wsjtgroup/info email reflector.
Project web site:
http://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html
https://www.physics.princeton.edu/pulsar/K1JT/wsjtx.html
Project mailing list (shared with other applications from the same
team):
https://groups.yahoo.com/neo/groups/wsjtgroup

View File

@ -12,6 +12,32 @@
Copyright 2001 - 2019 by Joe Taylor, K1JT.
Release: WSJT-X 2.1.1
November 25, 2019
---------------------
WSJT-X 2.1.1 is a bug fix only release addressing regressions in the
prior v2.1.0 release.
- Document rules for the UDP message protocol.
- Fix bug that could cause display of a blank Settings window.
- Fix message parsing to properly handle 4-character directed CQs
- Fix a potential crash in the interface to Omni-Rig.
- Improve handling of unexpected rig off line status changes from
Omni-Rig.
- Add an option to highlight unworked 2-character grid fields rather
than 4-character grid squares.
- Fix bug that caused unwanted disabling of "Enable Tx" in Fox mode.
- Log duplicate contacts in FT8 DXpedition Fox mode.
- Regenerate the GFSK Tx waveform if Tx audio frequency is changed.
- Fix the behavior of double-clicking on a decoded message with first
callsign displayed as an unresolved hash code <...>.
- Fix a problem with determining "worked before" status after a band
change.
- Updates to the WSJT-X 2.1 User Guide.
- Fix a production issue with the macOS tool chain that generated
broken executables.
Release: WSJT-X 2.1
July 15, 2019
-------------------

View File

@ -1,6 +1,6 @@
# Version number components
set (WSJTX_VERSION_MAJOR 2)
set (WSJTX_VERSION_MINOR 1)
set (WSJTX_VERSION_PATCH 0)
set (WSJTX_RC 8) # release candidate number, comment out or zero for development versions
set (WSJTX_VERSION_PATCH 1)
set (WSJTX_RC 0) # release candidate number, comment out or zero for development versions
set (WSJTX_VERSION_IS_RELEASE 1) # set to 1 for final release build

2243
cty.dat

File diff suppressed because it is too large Load Diff

View File

@ -10,7 +10,7 @@ extern "C" {
namespace
{
QRegularExpression words_re {R"(^(?:(?<word1>(?:CQ|DE|QRZ)(?:\s?DX|\s(?:[A-Z]{2}|\d{3}))|[A-Z0-9/]+)\s)(?:(?<word2>[A-Z0-9/]+)(?:\s(?<word3>[-+A-Z0-9]+)(?:\s(?<word4>(?:OOO|(?!RR73)[A-R]{2}[0-9]{2})))?)?)?)"};
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})))?)?)?)"};
}
DecodedText::DecodedText (QString const& the_string)
@ -168,11 +168,6 @@ void DecodedText::deCallAndGrid(/*out*/QString& call, QString& grid) const
call = match.captured ("word2");
grid = match.captured ("word3");
if ("R" == grid) grid = match.captured ("word4");
if(match.captured("word1")=="CQ" and call.length()<=4 and !call.contains(QRegExp("[0-9]"))) {
//Second word has length 1-4 and contains no digits
call = match.captured ("word3");
grid = match.captured ("word4");
}
}
unsigned DecodedText::timeInSeconds() const

View File

@ -67,6 +67,7 @@ set (UG_IMGS
images/Astronomical_data.png
images/auto-seq.png
images/band-settings.png
images/Best_S+P.png
images/colors.png
images/config-menu.png
images/decode-menu.png

View File

@ -12,6 +12,12 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this documentation. If not, see {gnu_gpl}.
Development _{prog}_ is a cooperative project to which many authors
have contributed. If you use our source code, please have the
courtesy to let us know about it. If you find bugs or make
improvements to the code, please report them to us in a timely
fashion.
Except where otherwise noted, all algorithms, protocol designs, source
code, and supporting files contained in the _{prog}_ package are the
intellectual property of the program's authors. The authors assert
@ -21,9 +27,9 @@ our work under terms of the GNU General Public License must display
the following copyright notice prominently:
*The algorithms, source code, look-and-feel of _{prog}_ and related
programs, and protocol specifications for the modes FSK441, FT8, JT4,
JT6M, JT9, JT65, JTMS, QRA64, ISCAT, and MSK144 are Copyright (C)
2001-2018 by one or more of the following authors: Joseph Taylor,
programs, and protocol specifications for the modes FSK441, FT4, FT8,
JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, and MSK144 are Copyright (C)
2001-2019 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.*

View File

@ -91,8 +91,8 @@ d). Edit lines as needed. Keeping them in alphabetic order help see dupes.
:sourceforge-jtsdk: https://sourceforge.net/projects/jtsdk[SourceForge JTSDK]
:ubuntu_sdk: https://launchpad.net/~ubuntu-sdk-team/+archive/ppa[Ubuntu SDK Notice]
:win_openssl_packages: https://slproweb.com/products/Win32OpenSSL.html[Windows OpenSSL Packages]
:win32_openssl: https://slproweb.com/download/Win32OpenSSL_Light-1_0_2r.exe[Win32 OpenSSL Lite Package]
:win64_openssl: https://slproweb.com/download/Win64OpenSSL_Light-1_0_2r.exe[Win64 OpenSSL Lite Package]
:win32_openssl: https://slproweb.com/download/Win32OpenSSL_Light-1_0_2t.exe[Win32 OpenSSL Light Package]
:win64_openssl: https://slproweb.com/download/Win64OpenSSL_Light-1_1_0L.exe[Win64 OpenSSL Light Package]
:writelog: https://writelog.com/[Writelog]
:wsjt_yahoo_group: https://groups.yahoo.com/neo/groups/wsjtgroup/info[WSJT Group]
:wsjtx: http://physics.princeton.edu/pulsar/K1JT/wsjtx.html[WSJT-X]

View File

@ -28,7 +28,7 @@ decoded text or a signal in the waterfall.
* For modes lacking a multi-decode feature, or when *Enable
VHF/UHF/Microwave features* has been checked on the *Settings ->
General* tab, the *F Tol* control sets a frequency toilerance range
General* tab, the *F Tol* control sets a frequency tolerance range
over which decoding will be attempted, centered on the Rx frequency.
* The *Report* control lets you change a signal report that has been

View File

@ -30,7 +30,7 @@ Pressing *Enter* on a modified message #5 automatically adds that
message to the stored macros.
* In some circumstances it may be desirable to make your QSOs as
shiort as possible. To configure the program to start contacts with
short as possible. To configure the program to start contacts with
message #2, disable message #1 by double-clicking on its round
radio-button or rectangular *Tx 1* button. Similarly, to send RR73
rather than RRR for message #4, double-click on one of its buttons.

View File

@ -17,7 +17,7 @@ displayed exactly as it will be decoded by receiving stations. The
second label (as shown above) will be absent if you are using the
*Default* setting on the *Configurations* menu. A progress bar shows
the elapsed fraction of a Tx or Rx sequence. Finally, if the Watchdog
(WD) timer was enabled on the *settings | General* tab, a label in the
(WD) timer was enabled on the *Settings | General* tab, a label in the
lower right-hand corner displays the number of minutes remaining
before timeout.

View File

@ -53,7 +53,7 @@ You need to install suitable _OpenSSL_ libraries - see <<OPENSSL,Instructions to
I occasionally get Rig Control Errors if I adjust my Icom rig's VFO. What's wrong?::
By default most Icom transceivers have *CI-V Tranceive Mode" enabled,
By default, most Icom transceivers have *CI-V Tranceive Mode" enabled,
this will cause unsolicited CAT traffic from the rig that disrupts CAT
control by a PC. Disable this option in the rig's menu.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -29,7 +29,7 @@ sudo dpkg -P wsjtx
[example]
sudo dpkg -i wsjtx_{VERSION}_amd64.deb
* 64-bit: {raspbian}
* 32-bit: {raspbian}
- To install:
+
[example]

View File

@ -34,15 +34,16 @@ TIP: Your computer may be configured so that this directory is
role="right"] _WSJT-X_ requires the _OpenSSL_ libraries to be
installed. Suitable libraries may already be installed on your
system, if they are not you will see this error shortly after
startup. To fix this you need to install the _OpenSSL_ libraries.
requesting a fetch of the latest LoTW users database. To fix this
you need to install the _OpenSSL_ libraries.
** You can download a suitable _OpenSSL_ package for from
{win_openssl_packages}, you need the latest *Windows v1.0.2 Lite*
version. For the 32-bit _WSJT-X_ build use the Win32 version of the
_OpenSSL_ libraries, for the 64-bit _WSJT-X_ use the Win64 version
of the _OpenSSL_ libraries (Note it is OK to install both versions
on a 64-bit system) which at the time of writing were
{win32_openssl} and {win64_openssl} respectively.
{win_openssl_packages}, you need the latest *Windows Light*
version. For the 32-bit _WSJT-X_ build use the latest Win32 v1.0.2
version of the _OpenSSL_ libraries, for the 64-bit _WSJT-X_ use the
latest Win64 v1.1.0 version of the _OpenSSL_ libraries (Note it is
OK to install both versions on a 64-bit system) which at the time
of writing were {win32_openssl} and {win64_openssl} respectively.
** Install the package and accept the default options, including the
option to copy the _OpenSSL_ DLLs to the Windows system
@ -69,7 +70,7 @@ TIP: If you cannot install the _OpenSSL_ libraries or do not have an
To ensure that this will be so when running under recent versions of
Windows, open the system's *Sound* control panel and select in turn
the *Recording* and *Playback* tabs. Click on *Properties*, then
*Advanced*, and select *16 bit, 48000 Hz (DVD Quality)*. Switch of
*Advanced*, and select *16 bit, 48000 Hz (DVD Quality)*. Switch off
all audio enhancement features for these devices.
* You can uninstall _WSJT-X_ by clicking its *Uninstall* link in the

View File

@ -20,7 +20,7 @@ signal report, R plus a signal report, or the final acknowledgements
RRR or 73. These messages are compressed and encoded in a highly
efficient and reliable way. In uncompressed form (as displayed
on-screen) they may contain as many as 22 characters. Some operators
prefer ro send RR73 rather than RRR. This is workable because RR73 is
prefer to send RR73 rather than RRR. This is workable because RR73 is
encoded as a valid grid locator, one unlikely ever to be occupied by
an amateur station.
@ -81,7 +81,7 @@ fully automated QSOs.
=== Contest Messages
The new FT8 and MSK144 protocols support special messages optimized
The new FT4, FT8, and MSK144 protocols support special messages optimized
for *NA VHF* and *EU VHF* contests. FT8 also supports messages for
*ARRL Field Day* and the *ARRL RTTY Roundup*. The decoders recognize
and decode these messages at any time. Configure the program to
@ -128,7 +128,7 @@ Either callsign (or both) may have /P appended.
[[COMP-CALL]]
=== Nonstandard Callsigns
*FT8 and MSK144*
*FT4, FT8, and MSK144*
Compound callsigns like xx/K1ABC or K1ABC/x and special event
callsigns like YW18FIFA are supported for normal QSOs but not for

View File

@ -36,7 +36,7 @@ in other parts of the world.
frequencies, check *Execute frequency calibration cycle* on the
*Tools* menu. _WSJT-X_ will spend 30 seconds at each
frequency. Initially no measurement data is saved to the `fmt.all`
file although it is displayed on screen, this allows you to check you
file although it is displayed on screen, this allows you to check your
current calibration parameters.
- During the calibration procedure, the radio's USB dial frequency is
@ -44,11 +44,11 @@ offset 1500 Hz below each *FreqCal* entry in the default frequencies
list. As shown in the screen shot below, detected signal carriers
therefore appear at about 1500 Hz in the _WSJT-X_ waterfall.
- To start a measurement session check the *Measure* option and let
- To start a measurement session, check the *Measure* option and let
the calibration cycle run for at least one complete sequence. Note
that, while measuring, any existing calibration parameters are
automatically disabled so you may have to increase the *FTol* range if
your rig is off freqeuncy by more than a few Hertz in order to capture
your rig is off frequency by more than a few Hertz in order to capture
valid measurements.
image::FreqCal.png[align="left",alt="FreqCal"]

View File

@ -17,7 +17,7 @@ In this manual the following icons call attention to particular types
of information:
NOTE: *Notes* containing information that may be of interest to
particuar classes of users.
particular classes of users.
TIP: *Tips* on program features or capabilities that might otherwise be
overlooked.

View File

@ -52,9 +52,10 @@ were the callsigns `E9AA` through `E9ZZ`. Upon reception they are
converted back to the form `CQ AA` through `CQ ZZ`, for display to the
user.
The new FT8 and MSK144 protocols use a different lossless compression
algorithm with features to generate and recognize the special messages
used for contesting and the like. (More to come, here ...)
The new FT4, FT8, and MSK144 protocols use a different lossless
compression algorithm with features to generate and recognize the
special messages used for contesting and the like. (More to come,
here ...)
To be useful on channels with low signal-to-noise ratio, this kind of
lossless message compression requires use of a strong forward error
@ -224,7 +225,7 @@ the sync bit.
[[SLOW_SUMMARY]]
==== Summary
Table 2 provides a brief summary parameters for the slow modes in
Table 7 provides a brief summary parameters for the slow modes in
_WSJT-X_. Parameters K and r specify the constraint length and rate
of the convolutional codes; n and k specify the sizes of the
(equivalent) block codes; Q is the alphabet size for the
@ -250,7 +251,7 @@ which the probability of decoding is 50% or higher.
Submodes of JT4, JT9, JT65, and QRA64 offer wider tone spacings for
circumstances that may require them, such significant Doppler spread.
Table 3 summarizes the tone spacings, bandwidths, and approximate
Table 8 summarizes the tone spacings, bandwidths, and approximate
threshold sensitivities of the various submodes when spreading is
comparable to tone spacing.
@ -335,7 +336,7 @@ The JT9 slow modes all use keying rate 12000/6912 = 1.736 baud. By contrast, wi
the *Fast* setting submodes JT9E-H adjust the keying rate to match the
increased tone spacings. Message durations are therefore much
shorter, and they are sent repeatedly throughout each Tx sequence.
For details see Table 4, below.
For details see Table 9, below.
==== MSK144

View File

@ -38,7 +38,7 @@ with twice or four times the normal tone spacing. This feature is
intended for use with specialized LF/MF transmitters that divide
generated frequencies by 2 or 4 as part of the transmission process.
_Special Operating Activity: Generation of FT8 and MSk144 messages_
_Special Operating Activity: Generation of FT8 and MSK144 messages_
- Check this box and select the type of activity to enable
auto-generation of special message formats for contesting and

View File

@ -42,6 +42,6 @@ this is available on line.
* *Fetch Now* will download a fresh dataset from the *Users CSV file
URL*. The LoTW team normally update this data weekly.
* Adjust *Age of of last upload less than* to set the period within
* Adjust *Age of last upload less than* to set the period within
which a station must have uploaded their log to LoTW to trigger
highlighting.

View File

@ -3,7 +3,7 @@
[[FIG_BAND_SETTINGS]]
image::settings-frequencies.png[align="center",alt="Frequency Screen"]
_Working Frequencies_: By default the *Working Frequencies* table
_Working Frequencies_: By default, the *Working Frequencies* table
contains a list of frequencies conventionally used for modes FT8, JT4,
JT9, JT65, MSK144, WSPR, and Echo. Conventions may change with time
or by user preference; you can modify the frequency table as desired.

View File

@ -42,7 +42,7 @@ NOTE: _Omni-Rig_ is available only under Windows.
NOTE: A special value of *USB* is available for custom USB devices
like those used by some SDR kits. This is not the same a virtual
serial port provided by USB connected transcivers and CAT
serial port provided by USB connected transceivers and CAT
interfaces, for those use the COM or serial port name that
refers to them.
@ -69,7 +69,7 @@ NOTE: CAT interfaces that require handshaking will be non-responsive
NOTE: When using a proxy application for rig control, *CAT* is usually
the correct option for _PTT Method_ assuming the proxy
application is capable of keying your transceiver idependently.
application is capable of keying your transceiver independently.
* _Transmit Audio Source_: some radios permit you to choose the
connector that will accept Tx audio. If this choice is enabled,

View File

@ -10,12 +10,15 @@ Call*.
reception reports to the {pskreporter} mapping facility.
- _UDP Server_: This group of options controls the network name or
address and port number used by a program that will receive status
updates from _WSJT-X_. Cooperating applications like _JTAlert_ use
this feature to obtain information about a running _WSJT-X_ instance.
If you are using _JTAlert_, be sure to check the three boxes at lower
right.
address and port number used to exchange information with a third
party application that interoperates with _WSJT-X_. Exchanged
information includes decoded messages, general program status, QSOs
logged, highlighting of callsigns in the _WSJT-X_ band activity
window, and limited facilities to initiate QSOs in response to CQ or
QRZ messages. Full details of the protocol can be found in comments
at the top of this file in our source code repository:
https://sourceforge.net/p/wsjt/wsjtx/ci/master/tree/NetworkMessage.hpp
- _N1MM Logger+ Broadcasts_: To send information on logged QSOs
directly to _N1MM Logger+_, check the box and enter the IP address and
port number for _N1MM_.
Programs like _JTAlert_ use the _UDP Server_ feature to obtain
information about a running _WSJT-X_ instance. If you are using
_JTAlert_, be sure to check the three boxes at lower right.

View File

@ -28,7 +28,7 @@ When this file was recorded KF4RWA was finishing a QSO with K1JT.
Since the green marker was placed at his audio frequency, 1224 Hz, his
message `K1JT KF4RWA 73` is decoded first and appears in the *Rx
Frequency* window. The *Band Activity* window shows this message plus
all decodes at other frequencies. By default lines containing `CQ`
all decodes at other frequencies. By default, lines containing `CQ`
are highlighted in green, and lines with *My Call* (in this case K1JT)
in red.

View File

@ -39,7 +39,7 @@ things just described and also invokes the decoder in a small range
around the Rx frequency. To decode a particular signal, double-click
near the left edge of its waterfall trace.
- Now double-click on any of the the lines of decoded text in the Band
- Now double-click on any of the lines of decoded text in the Band
Activity window. Any line will show the same behavior, setting
Rx frequency to that of the selected message and leaving Tx frequency
unchanged. To change both Rx and Tx frequencies, hold *Ctrl* down

View File

@ -1,4 +1,8 @@
// Status=review
FT4 is designed for contesting, particularly on the HF bands.
Compared with FT8 it is 3.5 dB less sensitive and requires 1.6 times
the bandwidth, but it offers the potential for twice the QSO rate.
FT4 is not recommended for everyday use.
.Main Window:
- Select *FT4* on the *Mode* menu.
- Double-click on *Erase* to clear both text windows.
@ -33,17 +37,38 @@ follow your frequency selections.
- Do the same thing with the *Ctrl* key held down. Now the both colored
markers and both spinner controls will follow your selections.
- Now double-click on any of the the lines of decoded text in the Band
- Now double-click on any of the lines of decoded text in the Band
Activity window. Any line will show similar behavior, setting
Rx frequency to that of the selected message and leaving Tx frequency
unchanged. To change both Rx and Tx frequencies, hold *Ctrl* down
when double-clicking.
TIP: To avoid QRM from competing callers, it is frequently desirable
to answer a CQ on a different frequency from that of the CQing
station. The same is true when you tail-end another QSO. Choose a Tx
frequency that appears to be not in use. You might want to check the
box *Hold Tx Freq*.
.Best S+P Button
The FT4 user interface includes a new button labeled *Best S+P*.
image::Best_S+P.png[align="center"]
Clicking *Best S+P* during an Rx cycle arms the program to examine all
CQ messages decoded at the end of the Rx sequence. The program will
select the best potential QSO partner (from a contesting perspective),
and treat it as if you had double-clicked on that line of decoded
text. Here "best potential QSO partner" means "New Multiplier" (1st
priority) or "New Call on Band" (2nd priority). "New Multiplier" is
currently interpreted to mean "New DXCC"; a more broadly defined
multiplier category (for the ARRL RTTY Roundup rules) will be
implemented in due course. We may provide additional priority
rankings, for example “New Grid on Band” (useful for North American
VHF contests), sorting by signal strength, etc.
*Best S+P* is a useful feature only if you have defined what "best" is
supposed to mean. This is done by configuring suitable options on the
*Settings | Colors* tab. Selection and ordering of color-highlighting
options determines what potential QSO partners will be chosen by the
"Best S+P" feature. Optimum choices will be different for different
contests. In a contest using RTTY Roundup rules we recommend
activating *My Call in message*, *New DXCC*, *New Call on Band*, *CQ
in message* and *Transmitted message*, reading from top to bottom.
TIP: Keyboard shortcuts *Shift+F11* and *Shift+F12* provide an easy
way to move your FT4 Tx frequency down or up in 90 Hz steps.

View File

@ -1,4 +1,4 @@
_WSJT-X_ v{VERSION_MAJOR}.{VERSION_MINOR} suppports a number of
_WSJT-X_ v{VERSION_MAJOR}.{VERSION_MINOR} supports a number of
features designed for use on the VHF and higher bands. These features
include:
@ -111,7 +111,7 @@ retune their receiver as the Doppler changes. Sked frequency in this
case is set to that announced by your QSO partner.
- Select *Call DX* after tuning the radio manually to find a station,
with the Doppler mode initally set to *None*. You may be tuning the band
with the Doppler mode initially set to *None*. You may be tuning the band
looking for random stations, or to a frequency where a station has been
seen on an SDR display. It is usually necessary to hold down the Ctrl key
while tuning the radio. From the moment *Call DX* is pressed, your
@ -221,7 +221,7 @@ to indicate to the other station that you are ready to receive messages.
TIP: QRA64 is different from JT65 in that the decoder attempts to find
and decode only a single signal in the receiver passband. If many
signals are present you may be able to decode them by double-clicking
signals are present, you may be able to decode them by double-clicking
on the lowest tone of each one in the waterfall.
TIP: G3WDG has prepared a more detailed tutorial on using {QRA64_EME}.
@ -236,11 +236,11 @@ error-correction facility.
=== MSK144
Meteor-scatter QSOs can be made any time on the VHF bands at distances
Meteor scatter QSOs can be made any time on the VHF bands at distances
up to about 2100 km (1300 miles). Completing a QSO takes longer in
the evening than in the morning, longer at higher frequencies, and
longer at distances close to the upper limit. But with patience, 100
Watts or more, and a single yagi it can usually be done. The
W or more, and a single yagi it can usually be done. The
following screen shot shows two 15-second reception intervals
containing MSK144 signals from three different stations.
@ -271,7 +271,7 @@ image::Rx_pct_MSK144.png[align="center",alt="MSK144 Percent CPU"]
- The displayed number (here 17%) indicates the fraction of available
time being used for execution of the MSK144 real-time decoder. If
this number is well below 100% you may increase the decoding depth
this number is well below 100%, you may increase the decoding depth
from *Fast* to *Normal* or *Deep*, and increase *F Tol* from 100 to
200 Hz.

View File

@ -7,6 +7,7 @@
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/key_extractors.hpp>
#include <boost/range/iterator_range.hpp>
#include <QtConcurrent/QtConcurrentRun>
#include <QFuture>
#include <QFutureWatcher>
@ -362,7 +363,8 @@ class WorkedBefore::impl final
{
public:
impl (Configuration const * configuration)
: path_ {QDir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}.absoluteFilePath (logFileName)}
: configuration_ {configuration}
, path_ {QDir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}.absoluteFilePath (logFileName)}
, prefixes_ {configuration}
{
}
@ -373,6 +375,7 @@ public:
loader_watcher_.setFuture (async_loader_);
}
Configuration const * configuration_;
QString path_;
AD1CCty prefixes_;
QFutureWatcher<worked_before_database_type> loader_watcher_;
@ -490,19 +493,39 @@ bool WorkedBefore::country_worked (QString const& country, QString const& mode,
}
bool WorkedBefore::grid_worked (QString const& grid, QString const& mode, QString const& band) const
{
auto gridsquare = grid.left (4).toUpper ();
if (m_->configuration_->highlight_only_fields ())
{
// can't use a direct set find operation or a set operation with
// a (CompatibleKey, CompatibleCompare) concept so we must
// partially scan the index
auto range = boost::make_iterator_range (
m_->worked_.get<grid_mode_band> ().lower_bound (gridsquare.left (2))
, m_->worked_.get<grid_mode_band> ().upper_bound (gridsquare.left (2) + "99"));
for (worked_entry const& worked : range)
{
if ((!mode.size () || mode.toUpper () == worked.mode_)
&& (!band.size () || worked.band_ == band.toUpper ()))
{
return true;
}
}
}
else
{
if (mode.size ())
{
if (band.size ())
{
return m_->worked_.get<grid_mode_band> ().end ()
!= m_->worked_.get<grid_mode_band> ().find (std::make_tuple (grid.left (4).toUpper (), mode.toUpper (), band.toUpper ()));
!= m_->worked_.get<grid_mode_band> ().find (std::make_tuple (gridsquare, mode.toUpper (), band.toUpper ()));
}
else
{
// partial key lookup
return m_->worked_.get<grid_mode_band> ().end ()
!= m_->worked_.get<grid_mode_band> ().find (std::make_tuple (grid.left (4).toUpper (), mode.toUpper ()));
!= m_->worked_.get<grid_mode_band> ().find (std::make_tuple (gridsquare, mode.toUpper ()));
}
}
else
@ -510,16 +533,18 @@ bool WorkedBefore::grid_worked (QString const& grid, QString const& mode, QStrin
if (band.size ())
{
return m_->worked_.get<grid_band> ().end ()
!= m_->worked_.get<grid_band> ().find (std::make_tuple (grid.left (4).toUpper (), band.toUpper ()));
!= m_->worked_.get<grid_band> ().find (std::make_tuple (gridsquare, band.toUpper ()));
}
else
{
// partial key lookup
return m_->worked_.get<grid_band> ().end ()
!= m_->worked_.get<grid_band> ().find (grid.left (4).toUpper ());
!= m_->worked_.get<grid_band> ().find (gridsquare);
}
}
}
return false;
}
bool WorkedBefore::call_worked (QString const& call, QString const& mode, QString const& band) const
{

View File

@ -47,6 +47,21 @@ public:
#include "FoxLog.moc"
namespace
{
QString const fox_log_ddl {
"CREATE %1 TABLE fox_log%2 ("
" id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
" \"when\" DATETIME NOT NULL,"
" call VARCHAR(20) NOT NULL,"
" grid VARCHAR(4),"
" report_sent VARCHAR(3),"
" report_rcvd VARCHAR(3),"
" band VARCHAR(6) NOT NULL"
")"
};
}
FoxLog::impl::impl (Configuration const * configuration)
: configuration_ {configuration}
{
@ -54,16 +69,37 @@ FoxLog::impl::impl (Configuration const * configuration)
{
QSqlQuery query;
SQL_error_check (query, static_cast<bool (QSqlQuery::*) (QString const&)> (&QSqlQuery::exec),
"CREATE TABLE fox_log ("
" id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
" \"when\" DATETIME NOT NULL,"
" call VARCHAR(20) NOT NULL,"
" grid VARCHAR(4),"
" report_sent VARCHAR(3),"
" report_rcvd VARCHAR(3),"
" band VARCHAR(6) NOT NULL,"
" CONSTRAINT no_dupes UNIQUE (call, band)"
")");
fox_log_ddl.arg ("").arg (""));
}
else
{
QSqlQuery query;
// query to check if table has a unique constraint
SQL_error_check (query, static_cast<bool (QSqlQuery::*) (QString const&)> (&QSqlQuery::exec),
"SELECT COUNT(*)"
" FROM sqlite_master"
" WHERE"
" type = 'index' AND tbl_name = 'fox_log'");
query.next ();
if (query.value (0).toInt ())
{
// update to new schema with no dupe disallowing unique
// constraint
database ().transaction ();
SQL_error_check (query, static_cast<bool (QSqlQuery::*) (QString const&)> (&QSqlQuery::exec),
fox_log_ddl.arg ("TEMPORARY").arg ("_backup"));
SQL_error_check (query, static_cast<bool (QSqlQuery::*) (QString const&)> (&QSqlQuery::exec),
"INSERT INTO fox_log_backup SELECT * from fox_log");
SQL_error_check (query, static_cast<bool (QSqlQuery::*) (QString const&)> (&QSqlQuery::exec),
"DROP TABLE fox_log");
SQL_error_check (query, static_cast<bool (QSqlQuery::*) (QString const&)> (&QSqlQuery::exec),
fox_log_ddl.arg ("").arg (""));
SQL_error_check (query, static_cast<bool (QSqlQuery::*) (QString const&)> (&QSqlQuery::exec),
"INSERT INTO fox_log SELECT * from fox_log_backup");
SQL_error_check (query, static_cast<bool (QSqlQuery::*) (QString const&)> (&QSqlQuery::exec),
"DROP TABLE fox_log_backup");
database ().commit ();
}
}
SQL_error_check (dupe_query_, &QSqlQuery::prepare,

View File

@ -970,7 +970,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
if(QCoreApplication::applicationVersion().contains("-devel") or
QCoreApplication::applicationVersion().contains("-rc")) {
QTimer::singleShot (0, this, SLOT (not_GA_warning_message ()));
// QTimer::singleShot (0, this, SLOT (not_GA_warning_message ()));
}
ui->pbBestSP->setVisible(m_mode=="FT4");
@ -3116,6 +3116,27 @@ void MainWindow::readFromStdout() //readFromStdout
ui->decodedTextBrowser->displayDecodedText(decodedtext0,m_baseCall,m_mode,m_config.DXCC(),
m_logBook,m_currentBand,m_config.ppfx(),
(ui->cbCQonly->isVisible() and ui->cbCQonly->isChecked()));
/*
//### TEST CODE
{
if(decodedtext0.CQersCall()!="") {
// For CQ messages, find best one to answer, for contest purposes...
QString dxCall;
QString dxGrid;
QString messagePriority=ui->decodedTextBrowser->CQPriority();
decodedtext0.deCallAndGrid(dxCall,dxGrid); //OUTPUT to dxCall and dxGrid!
double utch=0.0;
int nAz,nEl,nDmiles,nDkm,nHotAz,nHotABetter,qsoPoints;
azdist_(const_cast <char *> ((m_config.my_grid().left(4) + " ").toLatin1().constData()),
const_cast <char *> ((dxGrid.left(4) + " ").toLatin1().constData()),&utch,
&nAz,&nEl,&nDmiles,&nDkm,&nHotAz,&nHotABetter,6,6);
qsoPoints=1 + nDkm/3000;
qDebug() << "aa" << dxCall << dxGrid << messagePriority << nDkm << qsoPoints;
}
}
//###
*/
if(m_bBestSPArmed and m_mode=="FT4") {
QString messagePriority=ui->decodedTextBrowser->CQPriority();
if(messagePriority!="") {
@ -3133,6 +3154,7 @@ void MainWindow::readFromStdout() //readFromStdout
}
}
}
}
}
@ -3295,7 +3317,9 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler
}
}
bool bEU_VHF_w2=(nrpt>=520001 and nrpt<=594000);
if(bEU_VHF_w2) m_xRcvd=message.string().trimmed().right(13);
if(bEU_VHF_w2 and message.string().contains(m_config.my_callsign() + " ")) {
m_xRcvd=message.string().trimmed().right(13);
}
if (m_auto
&& (m_QSOProgress==REPLYING or (!ui->tx1->isEnabled () and m_QSOProgress==REPORT))
&& qAbs (ui->TxFreqSpinBox->value () - df) <= int (stop_tolerance)
@ -5463,6 +5487,14 @@ void MainWindow::on_genStdMsgsPushButton_clicked() //genStdMsgs button
void MainWindow::on_logQSOButton_clicked() //Log QSO button
{
if (SpecOp::FOX != m_config.special_op_id ())
{
// ensure that auto Tx is disabled even if clear DX call & grid
// on 73 is not checked, unless in Fox mode where it is allowed
// to be a robot.
auto_tx_mode (false);
}
if (!m_hisCall.size ()) {
MessageBox::warning_message (this, tr ("Warning: DX Call field is empty."));
}
@ -5515,7 +5547,7 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call,
, QByteArray const& ADIF)
{
QString date = QSO_date_on.toString("yyyyMMdd");
if (!m_logBook.add (m_hisCall, grid, m_config.bands()->find(m_freqNominal), m_modeTx, ADIF))
if (!m_logBook.add (call, grid, m_config.bands()->find(dial_freq), mode, ADIF))
{
MessageBox::warning_message (this, tr ("Log file error"),
tr ("Cannot open \"%1\"").arg (m_logBook.path ()));
@ -5540,7 +5572,6 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call,
}
if(m_config.clear_DX () and SpecOp::HOUND != m_config.special_op_id()) clearDX ();
auto_tx_mode (false);
m_dateTimeQSOOn = QDateTime {};
auto special_op = m_config.special_op_id ();
if (SpecOp::NONE < special_op && special_op < SpecOp::FOX &&
@ -6760,6 +6791,12 @@ void MainWindow::setFreq4(int rxFreq, int txFreq)
} else {
if (ui->TxFreqSpinBox->isEnabled ()) {
ui->TxFreqSpinBox->setValue(txFreq);
if ("FT8" == m_mode || "FT4" == m_mode)
{
// we need to regenerate the current transmit waveform for
// GFSK modulated modes
if (m_transmitting) m_restart = true;
}
}
else if (m_config.enable_VHF_features ()
&& (Qt::ControlModifier & QApplication::keyboardModifiers ())) {