Merge branch 'develop' into feat-fst280

This commit is contained in:
Bill Somerville 2020-10-06 19:25:06 +01:00
commit 314be8ccb7
No known key found for this signature in database
GPG Key ID: D864B06D1E81618F
62 changed files with 8861 additions and 7263 deletions

1
.gitignore vendored
View File

@ -14,6 +14,7 @@ jnq*
*.txt
*.bak
!**/CMakeLists.txt
!**/*.txt
__pycache__
cmake-build-debug
cmake-build-release

View File

@ -7,4 +7,3 @@ bool AudioDevice::initialize (OpenMode mode, Channel channel)
// open and ensure we are unbuffered if possible
return QIODevice::open (mode | QIODevice::Unbuffered);
}

View File

@ -33,8 +33,8 @@ public:
Channel channel () const {return m_channel;}
protected:
AudioDevice (QObject * parent = 0)
: QIODevice (parent)
AudioDevice (QObject * parent = nullptr)
: QIODevice {parent}
{
}

View File

@ -1,5 +1,7 @@
#include "soundin.h"
#include <cstdlib>
#include <cmath>
#include <QAudioDeviceInfo>
#include <QAudioFormat>
#include <QAudioInput>
@ -8,11 +10,9 @@
#include "moc_soundin.cpp"
bool SoundInput::audioError () const
bool SoundInput::checkStream ()
{
bool result (true);
Q_ASSERT_X (m_stream, "SoundInput", "programming error");
bool result (false);
if (m_stream)
{
switch (m_stream->error ())
@ -25,16 +25,18 @@ bool SoundInput::audioError () const
Q_EMIT error (tr ("An error occurred during read from the audio input device."));
break;
case QAudio::UnderrunError:
Q_EMIT error (tr ("Audio data not being fed to the audio input device fast enough."));
break;
// case QAudio::UnderrunError:
// Q_EMIT error (tr ("Audio data not being fed to the audio input device fast enough."));
// break;
case QAudio::FatalError:
Q_EMIT error (tr ("Non-recoverable error, audio input device not usable at this time."));
break;
case QAudio::UnderrunError: // TODO G4WJS: stop ignoring this
// when we find the cause on macOS
case QAudio::NoError:
result = false;
result = true;
break;
}
}
@ -72,12 +74,13 @@ void SoundInput::start(QAudioDeviceInfo const& device, int framesPerBuffer, Audi
// qDebug () << "Selected audio input format:" << format;
m_stream.reset (new QAudioInput {device, format});
if (audioError ())
if (!checkStream ())
{
return;
}
connect (m_stream.data(), &QAudioInput::stateChanged, this, &SoundInput::handleStateChanged);
connect (m_stream.data(), &QAudioInput::notify, [this] () {checkStream ();});
//qDebug () << "SoundIn default buffer size (bytes):" << m_stream->bufferSize () << "period size:" << m_stream->periodSize ();
// the Windows MME version of QAudioInput uses 1/5 of the buffer
@ -87,10 +90,10 @@ void SoundInput::start(QAudioDeviceInfo const& device, int framesPerBuffer, Audi
#else
Q_UNUSED (framesPerBuffer);
#endif
if (sink->initialize (QIODevice::WriteOnly, channel))
if (m_sink->initialize (QIODevice::WriteOnly, channel))
{
m_stream->start (sink);
audioError ();
checkStream ();
cummulative_lost_usec_ = -1;
//qDebug () << "SoundIn selected buffer size (bytes):" << m_stream->bufferSize () << "peirod size:" << m_stream->periodSize ();
}
@ -105,7 +108,7 @@ void SoundInput::suspend ()
if (m_stream)
{
m_stream->suspend ();
audioError ();
checkStream ();
}
}
@ -120,14 +123,12 @@ void SoundInput::resume ()
if (m_stream)
{
m_stream->resume ();
audioError ();
checkStream ();
}
}
void SoundInput::handleStateChanged (QAudio::State newState)
{
//qDebug () << "SoundInput::handleStateChanged: newState:" << newState;
switch (newState)
{
case QAudio::IdleState:
@ -150,7 +151,7 @@ void SoundInput::handleStateChanged (QAudio::State newState)
#endif
case QAudio::StoppedState:
if (audioError ())
if (!checkStream ())
{
Q_EMIT status (tr ("Error"));
}
@ -166,15 +167,21 @@ void SoundInput::reset (bool report_dropped_frames)
{
if (m_stream)
{
if (cummulative_lost_usec_ >= 0 // don't report first time as we
// don't yet known latency
&& report_dropped_frames)
auto elapsed_usecs = m_stream->elapsedUSecs ();
while (std::abs (elapsed_usecs - m_stream->processedUSecs ())
> 24 * 60 * 60 * 500000ll) // half day
{
auto lost_usec = m_stream->elapsedUSecs () - m_stream->processedUSecs () - cummulative_lost_usec_;
// QAudioInput::elapsedUSecs() wraps after 24 hours
elapsed_usecs += 24 * 60 * 60 * 1000000ll;
}
// don't report first time as we don't yet known latency
if (cummulative_lost_usec_ != std::numeric_limits<qint64>::min () && report_dropped_frames)
{
auto lost_usec = elapsed_usecs - m_stream->processedUSecs () - cummulative_lost_usec_;
Q_EMIT dropped_frames (m_stream->format ().framesForDuration (lost_usec), lost_usec);
//qDebug () << "SoundInput::reset: frames dropped:" << m_stream->format ().framesForDuration (lost_usec) << "sec:" << lost_usec / 1.e6;
}
cummulative_lost_usec_ = m_stream->elapsedUSecs () - m_stream->processedUSecs ();
cummulative_lost_usec_ = elapsed_usecs - m_stream->processedUSecs ();
}
}
@ -185,11 +192,6 @@ void SoundInput::stop()
m_stream->stop ();
}
m_stream.reset ();
if (m_sink)
{
m_sink->close ();
}
}
SoundInput::~SoundInput ()

View File

@ -2,6 +2,7 @@
#ifndef SOUNDIN_H__
#define SOUNDIN_H__
#include <limits>
#include <QObject>
#include <QString>
#include <QDateTime>
@ -23,8 +24,7 @@ class SoundInput
public:
SoundInput (QObject * parent = nullptr)
: QObject {parent}
, m_sink {nullptr}
, cummulative_lost_usec_ {0}
, cummulative_lost_usec_ {std::numeric_limits<qint64>::min ()}
{
}
@ -46,7 +46,7 @@ private:
// used internally
Q_SLOT void handleStateChanged (QAudio::State);
bool audioError () const;
bool checkStream ();
QScopedPointer<QAudioInput> m_stream;
QPointer<AudioDevice> m_sink;

View File

@ -7,11 +7,13 @@
#include <qmath.h>
#include <QDebug>
#include "Audio/AudioDevice.hpp"
#include "moc_soundout.cpp"
bool SoundOutput::audioError () const
bool SoundOutput::checkStream () const
{
bool result (true);
bool result {false};
Q_ASSERT_X (m_stream, "SoundOutput", "programming error");
if (m_stream) {
@ -34,7 +36,7 @@ bool SoundOutput::audioError () const
break;
case QAudio::NoError:
result = false;
result = true;
break;
}
}
@ -43,15 +45,19 @@ bool SoundOutput::audioError () const
void SoundOutput::setFormat (QAudioDeviceInfo const& device, unsigned channels, int frames_buffered)
{
if (!device.isNull ())
Q_ASSERT (0 < channels && channels < 3);
m_device = device;
m_channels = channels;
m_framesBuffered = frames_buffered;
}
void SoundOutput::restart (QIODevice * source)
{
if (!m_device.isNull ())
{
Q_ASSERT (0 < channels && channels < 3);
m_framesBuffered = frames_buffered;
QAudioFormat format (device.preferredFormat ());
QAudioFormat format (m_device.preferredFormat ());
// qDebug () << "Preferred audio output format:" << format;
format.setChannelCount (channels);
format.setChannelCount (m_channels);
format.setCodec ("audio/pcm");
format.setSampleRate (48000);
format.setSampleType (QAudioFormat::SignedInt);
@ -61,29 +67,25 @@ void SoundOutput::setFormat (QAudioDeviceInfo const& device, unsigned channels,
{
Q_EMIT error (tr ("Requested output audio format is not valid."));
}
else if (!device.isFormatSupported (format))
else if (!m_device.isFormatSupported (format))
{
Q_EMIT error (tr ("Requested output audio format is not supported on device."));
}
else
{
// qDebug () << "Selected audio output format:" << format;
m_stream.reset (new QAudioOutput (device, format));
audioError ();
m_stream.reset (new QAudioOutput (m_device, format));
checkStream ();
m_stream->setVolume (m_volume);
m_stream->setNotifyInterval(100);
m_stream->setNotifyInterval(1000);
error_ = false;
connect (m_stream.data(), &QAudioOutput::stateChanged, this, &SoundOutput::handleStateChanged);
connect (m_stream.data(), &QAudioOutput::notify, [this] () {checkStream ();});
// qDebug() << "A" << m_volume << m_stream->notifyInterval();
}
}
}
void SoundOutput::restart (QIODevice * source)
{
if (!m_stream)
{
if (!error_)
@ -118,7 +120,7 @@ void SoundOutput::suspend ()
if (m_stream && QAudio::ActiveState == m_stream->state ())
{
m_stream->suspend ();
audioError ();
checkStream ();
}
}
@ -127,7 +129,7 @@ void SoundOutput::resume ()
if (m_stream && QAudio::SuspendedState == m_stream->state ())
{
m_stream->resume ();
audioError ();
checkStream ();
}
}
@ -136,7 +138,7 @@ void SoundOutput::reset ()
if (m_stream)
{
m_stream->reset ();
audioError ();
checkStream ();
}
}
@ -144,9 +146,10 @@ void SoundOutput::stop ()
{
if (m_stream)
{
m_stream->reset ();
m_stream->stop ();
audioError ();
}
m_stream.reset ();
}
qreal SoundOutput::attenuation () const
@ -176,8 +179,6 @@ void SoundOutput::resetAttenuation ()
void SoundOutput::handleStateChanged (QAudio::State newState)
{
// qDebug () << "SoundOutput::handleStateChanged: newState:" << newState;
switch (newState)
{
case QAudio::IdleState:
@ -199,7 +200,7 @@ void SoundOutput::handleStateChanged (QAudio::State newState)
#endif
case QAudio::StoppedState:
if (audioError ())
if (!checkStream ())
{
Q_EMIT status (tr ("Error"));
}

View File

@ -7,6 +7,7 @@
#include <QAudioOutput>
#include <QAudioDeviceInfo>
class QIODevice;
class QAudioDeviceInfo;
// An instance of this sends audio data to a specified soundcard.
@ -41,12 +42,14 @@ Q_SIGNALS:
void status (QString message) const;
private:
bool audioError () const;
bool checkStream () const;
private Q_SLOTS:
void handleStateChanged (QAudio::State);
private:
QAudioDeviceInfo m_device;
unsigned m_channels;
QScopedPointer<QAudioOutput> m_stream;
int m_framesBuffered;
qreal m_volume;

View File

@ -293,6 +293,7 @@ set (wsjt_qt_CXXSRCS
logbook/WorkedBefore.cpp
logbook/Multiplier.cpp
Network/NetworkAccessManager.cpp
widgets/LazyFillComboBox.cpp
)
set (wsjt_qtmm_CXXSRCS
@ -909,6 +910,7 @@ message (STATUS "hamlib_LIBRARY_DIRS: ${hamlib_LIBRARY_DIRS}")
set (CMAKE_REQUIRED_INCLUDES "${hamlib_INCLUDE_DIRS}")
set (CMAKE_REQUIRED_LIBRARIES "${hamlib_LIBRARIES}")
check_symbol_exists (CACHE_ALL "hamlib/rig.h" HAVE_HAMLIB_OLD_CACHING)
check_symbol_exists (rig_set_cache_timeout_ms "hamlib/rig.h" HAVE_HAMLIB_CACHING)
@ -1713,6 +1715,7 @@ if (NOT is_debug_build)
PATTERN "*quick*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE
PATTERN "*webgl*${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE
PATTERN "*_debug${CMAKE_SHARED_LIBRARY_SUFFIX}" EXCLUDE
PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}.dSYM" EXCLUDE
)
install (
FILES

View File

@ -135,6 +135,7 @@
#include <cmath>
#include <QApplication>
#include <QCursor>
#include <QMetaType>
#include <QList>
#include <QPair>
@ -188,6 +189,7 @@
#include "Network/LotWUsers.hpp"
#include "models/DecodeHighlightingModel.hpp"
#include "logbook/logbook.h"
#include "widgets/LazyFillComboBox.hpp"
#include "ui_Configuration.h"
#include "moc_Configuration.cpp"
@ -432,7 +434,6 @@ private:
void read_settings ();
void write_settings ();
Q_SLOT void lazy_models_load (int);
void find_audio_devices ();
QAudioDeviceInfo find_audio_device (QAudio::Mode, QComboBox *, QString const& device_name);
void load_audio_devices (QAudio::Mode, QComboBox *, QAudioDeviceInfo *);
@ -653,9 +654,13 @@ private:
bool pwrBandTuneMemory_;
QAudioDeviceInfo audio_input_device_;
QAudioDeviceInfo next_audio_input_device_;
AudioDevice::Channel audio_input_channel_;
AudioDevice::Channel next_audio_input_channel_;
QAudioDeviceInfo audio_output_device_;
QAudioDeviceInfo next_audio_output_device_;
AudioDevice::Channel audio_output_channel_;
AudioDevice::Channel next_audio_output_channel_;
friend class Configuration;
};
@ -856,6 +861,16 @@ void Configuration::sync_transceiver (bool force_signal, bool enforce_mode_and_s
}
}
void Configuration::invalidate_audio_input_device (QString /* error */)
{
m_->audio_input_device_ = QAudioDeviceInfo {};
}
void Configuration::invalidate_audio_output_device (QString /* error */)
{
m_->audio_output_device_ = QAudioDeviceInfo {};
}
bool Configuration::valid_n1mm_info () const
{
// do very rudimentary checking on the n1mm server name and port number.
@ -1029,6 +1044,21 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
// this must be done after the default paths above are set
read_settings ();
connect (ui_->sound_input_combo_box, &LazyFillComboBox::about_to_show_popup, [this] () {
QGuiApplication::setOverrideCursor (QCursor {Qt::WaitCursor});
load_audio_devices (QAudio::AudioInput, ui_->sound_input_combo_box, &next_audio_input_device_);
update_audio_channels (ui_->sound_input_combo_box, ui_->sound_input_combo_box->currentIndex (), ui_->sound_input_channel_combo_box, false);
ui_->sound_input_channel_combo_box->setCurrentIndex (next_audio_input_channel_);
QGuiApplication::restoreOverrideCursor ();
});
connect (ui_->sound_output_combo_box, &LazyFillComboBox::about_to_show_popup, [this] () {
QGuiApplication::setOverrideCursor (QCursor {Qt::WaitCursor});
load_audio_devices (QAudio::AudioOutput, ui_->sound_output_combo_box, &next_audio_output_device_);
update_audio_channels (ui_->sound_output_combo_box, ui_->sound_output_combo_box->currentIndex (), ui_->sound_output_channel_combo_box, true);
ui_->sound_output_channel_combo_box->setCurrentIndex (next_audio_output_channel_);
QGuiApplication::restoreOverrideCursor ();
});
// set up LoTW users CSV file fetching
connect (&lotw_users_, &LotWUsers::load_finished, [this] () {
ui_->LotW_CSV_fetch_push_button->setEnabled (true);
@ -1102,7 +1132,6 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
//
// setup hooks to keep audio channels aligned with devices
//
connect (ui_->configuration_tabs, &QTabWidget::currentChanged, this, &Configuration::impl::lazy_models_load);
{
using namespace std;
using namespace std::placeholders;
@ -1199,6 +1228,11 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
enumerate_rigs ();
initialize_models ();
audio_input_device_ = next_audio_input_device_;
audio_input_channel_ = next_audio_input_channel_;
audio_output_device_ = next_audio_output_device_;
audio_output_channel_ = next_audio_output_channel_;
transceiver_thread_ = new QThread {this};
transceiver_thread_->start ();
}
@ -1210,31 +1244,14 @@ Configuration::impl::~impl ()
write_settings ();
}
void Configuration::impl::lazy_models_load (int current_tab_index)
{
switch (current_tab_index)
{
case 2: // Audio
//
// load combo boxes with audio setup choices
//
load_audio_devices (QAudio::AudioInput, ui_->sound_input_combo_box, &audio_input_device_);
load_audio_devices (QAudio::AudioOutput, ui_->sound_output_combo_box, &audio_output_device_);
update_audio_channels (ui_->sound_input_combo_box, ui_->sound_input_combo_box->currentIndex (), ui_->sound_input_channel_combo_box, false);
update_audio_channels (ui_->sound_output_combo_box, ui_->sound_output_combo_box->currentIndex (), ui_->sound_output_channel_combo_box, true);
ui_->sound_input_channel_combo_box->setCurrentIndex (audio_input_channel_);
ui_->sound_output_channel_combo_box->setCurrentIndex (audio_output_channel_);
break;
default:
break;
}
}
void Configuration::impl::initialize_models ()
{
next_audio_input_device_ = audio_input_device_;
next_audio_input_channel_ = audio_input_channel_;
next_audio_output_device_ = audio_output_device_;
next_audio_output_channel_ = audio_output_channel_;
restart_sound_input_device_ = false;
restart_sound_output_device_ = false;
{
SettingsGroup g {settings_, "Configuration"};
find_audio_devices ();
@ -1413,8 +1430,6 @@ void Configuration::impl::read_settings ()
save_directory_.setPath (settings_->value ("SaveDir", default_save_directory_.absolutePath ()).toString ());
azel_directory_.setPath (settings_->value ("AzElDir", default_azel_directory_.absolutePath ()).toString ());
find_audio_devices ();
type_2_msg_gen_ = settings_->value ("Type2MsgGen", QVariant::fromValue (Configuration::type_2_msg_3_full)).value<Configuration::Type2MsgGen> ();
monitor_off_at_startup_ = settings_->value ("MonitorOFF", false).toBool ();
@ -1522,19 +1537,25 @@ void Configuration::impl::find_audio_devices ()
// retrieve audio input device
//
auto saved_name = settings_->value ("SoundInName").toString ();
audio_input_device_ = find_audio_device (QAudio::AudioInput, ui_->sound_input_combo_box, saved_name);
audio_input_channel_ = AudioDevice::fromString (settings_->value ("AudioInputChannel", "Mono").toString ());
update_audio_channels (ui_->sound_input_combo_box, ui_->sound_input_combo_box->currentIndex (), ui_->sound_input_channel_combo_box, false);
ui_->sound_input_channel_combo_box->setCurrentIndex (audio_input_channel_);
if (next_audio_input_device_.deviceName () != saved_name || next_audio_input_device_.isNull ())
{
next_audio_input_device_ = find_audio_device (QAudio::AudioInput, ui_->sound_input_combo_box, saved_name);
next_audio_input_channel_ = AudioDevice::fromString (settings_->value ("AudioInputChannel", "Mono").toString ());
update_audio_channels (ui_->sound_input_combo_box, ui_->sound_input_combo_box->currentIndex (), ui_->sound_input_channel_combo_box, false);
ui_->sound_input_channel_combo_box->setCurrentIndex (next_audio_input_channel_);
}
//
// retrieve audio output device
//
saved_name = settings_->value("SoundOutName").toString();
audio_output_channel_ = AudioDevice::fromString (settings_->value ("AudioOutputChannel", "Mono").toString ());
audio_output_device_ = find_audio_device (QAudio::AudioOutput, ui_->sound_output_combo_box, saved_name);
update_audio_channels (ui_->sound_output_combo_box, ui_->sound_output_combo_box->currentIndex (), ui_->sound_output_channel_combo_box, true);
ui_->sound_output_channel_combo_box->setCurrentIndex (audio_output_channel_);
if (next_audio_output_device_.deviceName () != saved_name || next_audio_output_device_.isNull ())
{
next_audio_output_device_ = find_audio_device (QAudio::AudioOutput, ui_->sound_output_combo_box, saved_name);
next_audio_output_channel_ = AudioDevice::fromString (settings_->value ("AudioOutputChannel", "Mono").toString ());
update_audio_channels (ui_->sound_output_combo_box, ui_->sound_output_combo_box->currentIndex (), ui_->sound_output_channel_combo_box, true);
ui_->sound_output_channel_combo_box->setCurrentIndex (next_audio_output_channel_);
}
}
void Configuration::impl::write_settings ()
@ -1556,10 +1577,16 @@ void Configuration::impl::write_settings ()
settings_->setValue ("PTTport", rig_params_.ptt_port);
settings_->setValue ("SaveDir", save_directory_.absolutePath ());
settings_->setValue ("AzElDir", azel_directory_.absolutePath ());
settings_->setValue ("SoundInName", audio_input_device_.deviceName ());
settings_->setValue ("SoundOutName", audio_output_device_.deviceName ());
settings_->setValue ("AudioInputChannel", AudioDevice::toString (audio_input_channel_));
settings_->setValue ("AudioOutputChannel", AudioDevice::toString (audio_output_channel_));
if (!audio_input_device_.isNull ())
{
settings_->setValue ("SoundInName", audio_input_device_.deviceName ());
settings_->setValue ("AudioInputChannel", AudioDevice::toString (audio_input_channel_));
}
if (!audio_output_device_.isNull ())
{
settings_->setValue ("SoundOutName", audio_output_device_.deviceName ());
settings_->setValue ("AudioOutputChannel", AudioDevice::toString (audio_output_channel_));
}
settings_->setValue ("Type2MsgGen", QVariant::fromValue (type_2_msg_gen_));
settings_->setValue ("MonitorOFF", monitor_off_at_startup_);
settings_->setValue ("MonitorLastUsed", monitor_last_used_);
@ -1764,7 +1791,7 @@ void Configuration::impl::set_rig_invariants ()
bool Configuration::impl::validate ()
{
if (ui_->sound_input_combo_box->currentIndex () < 0
&& audio_input_device_.isNull ())
&& next_audio_input_device_.isNull ())
{
find_tab (ui_->sound_input_combo_box);
MessageBox::critical_message (this, tr ("Invalid audio input device"));
@ -1772,7 +1799,7 @@ bool Configuration::impl::validate ()
}
if (ui_->sound_input_channel_combo_box->currentIndex () < 0
&& audio_input_device_.isNull ())
&& next_audio_input_device_.isNull ())
{
find_tab (ui_->sound_input_combo_box);
MessageBox::critical_message (this, tr ("Invalid audio input device"));
@ -1780,7 +1807,7 @@ bool Configuration::impl::validate ()
}
if (ui_->sound_output_combo_box->currentIndex () < 0
&& audio_output_device_.isNull ())
&& next_audio_output_device_.isNull ())
{
find_tab (ui_->sound_output_combo_box);
MessageBox::information_message (this, tr ("Invalid audio output device"));
@ -1836,6 +1863,7 @@ int Configuration::impl::exec ()
rig_changed_ = false;
initialize_models ();
return QDialog::exec();
}
@ -1933,39 +1961,60 @@ void Configuration::impl::accept ()
// related configuration parameters
rig_is_dummy_ = TransceiverFactory::basic_transceiver_name_ == rig_params_.rig_name;
// Check to see whether SoundInThread must be restarted,
// and save user parameters.
{
auto const& selected_device = ui_->sound_input_combo_box->currentData ().value<audio_info_type> ().first;
if (selected_device != audio_input_device_)
if (selected_device != next_audio_input_device_)
{
audio_input_device_ = selected_device;
restart_sound_input_device_ = true;
next_audio_input_device_ = selected_device;
}
}
{
auto const& selected_device = ui_->sound_output_combo_box->currentData ().value<audio_info_type> ().first;
if (selected_device != audio_output_device_)
if (selected_device != next_audio_output_device_)
{
audio_output_device_ = selected_device;
restart_sound_output_device_ = true;
next_audio_output_device_ = selected_device;
}
}
if (audio_input_channel_ != static_cast<AudioDevice::Channel> (ui_->sound_input_channel_combo_box->currentIndex ()))
if (next_audio_input_channel_ != static_cast<AudioDevice::Channel> (ui_->sound_input_channel_combo_box->currentIndex ()))
{
audio_input_channel_ = static_cast<AudioDevice::Channel> (ui_->sound_input_channel_combo_box->currentIndex ());
next_audio_input_channel_ = static_cast<AudioDevice::Channel> (ui_->sound_input_channel_combo_box->currentIndex ());
}
Q_ASSERT (next_audio_input_channel_ <= AudioDevice::Right);
if (next_audio_output_channel_ != static_cast<AudioDevice::Channel> (ui_->sound_output_channel_combo_box->currentIndex ()))
{
next_audio_output_channel_ = static_cast<AudioDevice::Channel> (ui_->sound_output_channel_combo_box->currentIndex ());
}
Q_ASSERT (next_audio_output_channel_ <= AudioDevice::Both);
if (audio_input_device_ != next_audio_input_device_ || next_audio_input_device_.isNull ())
{
audio_input_device_ = next_audio_input_device_;
restart_sound_input_device_ = true;
}
Q_ASSERT (audio_input_channel_ <= AudioDevice::Right);
if (audio_output_channel_ != static_cast<AudioDevice::Channel> (ui_->sound_output_channel_combo_box->currentIndex ()))
if (audio_input_channel_ != next_audio_input_channel_)
{
audio_output_channel_ = static_cast<AudioDevice::Channel> (ui_->sound_output_channel_combo_box->currentIndex ());
audio_input_channel_ = next_audio_input_channel_;
restart_sound_input_device_ = true;
}
if (audio_output_device_ != next_audio_output_device_ || next_audio_output_device_.isNull ())
{
audio_output_device_ = next_audio_output_device_;
restart_sound_output_device_ = true;
}
Q_ASSERT (audio_output_channel_ <= AudioDevice::Both);
if (audio_output_channel_ != next_audio_output_channel_)
{
audio_output_channel_ = next_audio_output_channel_;
restart_sound_output_device_ = true;
}
// qDebug () << "Configure::accept: audio i/p:" << audio_input_device_.deviceName ()
// << "chan:" << audio_input_channel_
// << "o/p:" << audio_output_device_.deviceName ()
// << "chan:" << audio_output_channel_
// << "reset i/p:" << restart_sound_input_device_
// << "reset o/p:" << restart_sound_output_device_;
my_callsign_ = ui_->callsign_line_edit->text ();
my_grid_ = ui_->grid_line_edit->text ();
@ -2104,6 +2153,13 @@ void Configuration::impl::reject ()
}
}
// qDebug () << "Configure::reject: audio i/p:" << audio_input_device_.deviceName ()
// << "chan:" << audio_input_channel_
// << "o/p:" << audio_output_device_.deviceName ()
// << "chan:" << audio_output_channel_
// << "reset i/p:" << restart_sound_input_device_
// << "reset o/p:" << restart_sound_output_device_;
QDialog::reject ();
}
@ -2762,28 +2818,28 @@ QAudioDeviceInfo Configuration::impl::find_audio_device (QAudio::Mode mode, QCom
using std::copy;
using std::back_inserter;
combo_box->clear ();
int current_index = -1;
auto const& devices = QAudioDeviceInfo::availableDevices (mode);
Q_FOREACH (auto const& p, devices)
if (device_name.size ())
{
// qDebug () << "Audio device: input:" << (QAudio::AudioInput == mode) << "name:" << p.deviceName () << "preferred format:" << p.preferredFormat () << "endians:" << p.supportedByteOrders () << "codecs:" << p.supportedCodecs () << "channels:" << p.supportedChannelCounts () << "rates:" << p.supportedSampleRates () << "sizes:" << p.supportedSampleSizes () << "types:" << p.supportedSampleTypes ();
// convert supported channel counts into something we can store in the item model
QList<QVariant> channel_counts;
auto scc = p.supportedChannelCounts ();
copy (scc.cbegin (), scc.cend (), back_inserter (channel_counts));
combo_box->addItem (p.deviceName (), QVariant::fromValue (audio_info_type {p, channel_counts}));
if (p.deviceName () == device_name)
Q_EMIT self_->enumerating_audio_devices ();
auto const& devices = QAudioDeviceInfo::availableDevices (mode);
Q_FOREACH (auto const& p, devices)
{
current_index = combo_box->count () - 1;
combo_box->setCurrentIndex (current_index);
return p;
// qDebug () << "Configuration::impl::find_audio_device: input:" << (QAudio::AudioInput == mode) << "name:" << p.deviceName () << "preferred format:" << p.preferredFormat () << "endians:" << p.supportedByteOrders () << "codecs:" << p.supportedCodecs () << "channels:" << p.supportedChannelCounts () << "rates:" << p.supportedSampleRates () << "sizes:" << p.supportedSampleSizes () << "types:" << p.supportedSampleTypes ();
if (p.deviceName () == device_name)
{
// convert supported channel counts into something we can store in the item model
QList<QVariant> channel_counts;
auto scc = p.supportedChannelCounts ();
copy (scc.cbegin (), scc.cend (), back_inserter (channel_counts));
combo_box->insertItem (0, device_name, QVariant::fromValue (audio_info_type {p, channel_counts}));
combo_box->setCurrentIndex (0);
return p;
}
}
// insert a place holder for the not found device
combo_box->insertItem (0, device_name + " (" + tr ("Not found", "audio device missing") + ")", QVariant::fromValue (audio_info_type {}));
combo_box->setCurrentIndex (0);
}
combo_box->setCurrentIndex (current_index);
return {};
}
@ -2796,11 +2852,12 @@ void Configuration::impl::load_audio_devices (QAudio::Mode mode, QComboBox * com
combo_box->clear ();
Q_EMIT self_->enumerating_audio_devices ();
int current_index = -1;
auto const& devices = QAudioDeviceInfo::availableDevices (mode);
Q_FOREACH (auto const& p, devices)
{
// qDebug () << "Audio device: input:" << (QAudio::AudioInput == mode) << "name:" << p.deviceName () << "preferred format:" << p.preferredFormat () << "endians:" << p.supportedByteOrders () << "codecs:" << p.supportedCodecs () << "channels:" << p.supportedChannelCounts () << "rates:" << p.supportedSampleRates () << "sizes:" << p.supportedSampleSizes () << "types:" << p.supportedSampleTypes ();
// qDebug () << "Configuration::impl::load_audio_devices: input:" << (QAudio::AudioInput == mode) << "name:" << p.deviceName () << "preferred format:" << p.preferredFormat () << "endians:" << p.supportedByteOrders () << "codecs:" << p.supportedCodecs () << "channels:" << p.supportedChannelCounts () << "rates:" << p.supportedSampleRates () << "sizes:" << p.supportedSampleSizes () << "types:" << p.supportedSampleTypes ();
// convert supported channel counts into something we can store in the item model
QList<QVariant> channel_counts;

View File

@ -260,6 +260,8 @@ public:
// i.e. the transceiver is ready for use.
Q_SLOT void sync_transceiver (bool force_signal = false, bool enforce_mode_and_split = false);
Q_SLOT void invalidate_audio_input_device (QString error);
Q_SLOT void invalidate_audio_output_device (QString error);
//
// These signals indicate a font has been selected and accepted for
@ -293,6 +295,12 @@ public:
// the fault condition has been rectified or is transient.
Q_SIGNAL void transceiver_failure (QString const& reason) const;
// signal announces audio devices are being enumerated
//
// As this can take some time, particularly on Linux, consumers
// might like to notify the user.
Q_SIGNAL void enumerating_audio_devices ();
private:
class impl;
pimpl<impl> m_;

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>554</width>
<height>557</height>
<height>556</height>
</rect>
</property>
<property name="windowTitle">
@ -1364,71 +1364,8 @@ radio interface behave as expected.</string>
<string>Soundcard</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="1" column="0">
<widget class="QLabel" name="sound_output_label">
<property name="text">
<string>Ou&amp;tput:</string>
</property>
<property name="buddy">
<cstring>sound_output_combo_box</cstring>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="sound_input_label">
<property name="text">
<string>&amp;Input:</string>
</property>
<property name="buddy">
<cstring>sound_input_combo_box</cstring>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QComboBox" name="sound_output_channel_combo_box">
<property name="toolTip">
<string>Select the audio channel used for transmission.
Unless you have multiple radios connected on different
channels; then you will usually want to select mono or
both here.</string>
</property>
<item>
<property name="text">
<string>Mono</string>
</property>
</item>
<item>
<property name="text">
<string>Left</string>
</property>
</item>
<item>
<property name="text">
<string>Right</string>
</property>
</item>
<item>
<property name="text">
<string>Both</string>
</property>
</item>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="sound_input_combo_box">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Select the audio CODEC to use for receiving.</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="sound_output_combo_box">
<widget class="LazyFillComboBox" name="sound_output_combo_box">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
@ -1471,6 +1408,69 @@ transmitting periods.</string>
</item>
</widget>
</item>
<item row="0" column="1">
<widget class="LazyFillComboBox" name="sound_input_combo_box">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Select the audio CODEC to use for receiving.</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="sound_output_label">
<property name="text">
<string>Ou&amp;tput:</string>
</property>
<property name="buddy">
<cstring>sound_output_combo_box</cstring>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QComboBox" name="sound_output_channel_combo_box">
<property name="toolTip">
<string>Select the audio channel used for transmission.
Unless you have multiple radios connected on different
channels; then you will usually want to select mono or
both here.</string>
</property>
<item>
<property name="text">
<string>Mono</string>
</property>
</item>
<item>
<property name="text">
<string>Left</string>
</property>
</item>
<item>
<property name="text">
<string>Right</string>
</property>
</item>
<item>
<property name="text">
<string>Both</string>
</property>
</item>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="sound_input_label">
<property name="text">
<string>&amp;Input:</string>
</property>
<property name="buddy">
<cstring>sound_input_combo_box</cstring>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -2997,6 +2997,11 @@ Right click for insert and delete options.</string>
<extends>QListView</extends>
<header>widgets/DecodeHighlightingListView.hpp</header>
</customwidget>
<customwidget>
<class>LazyFillComboBox</class>
<extends>QComboBox</extends>
<header>widgets/LazyFillComboBox.hpp</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>configuration_tabs</tabstop>
@ -3187,13 +3192,13 @@ Right click for insert and delete options.</string>
</connection>
</connections>
<buttongroups>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="special_op_activity_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="split_mode_button_group"/>
</buttongroups>
</ui>

View File

@ -1,6 +1,5 @@
kern.sysv.shmmax=14680064
kern.sysv.shmmax=104857600
kern.sysv.shmmin=1
kern.sysv.shmmni=128
kern.sysv.shmseg=32
kern.sysv.shmall=17920
kern.sysv.shmall=25600

View File

@ -36,7 +36,7 @@ void Detector::setBlockSize (unsigned n)
bool Detector::reset ()
{
clear ();
// don't call base call reset because it calls seek(0) which causes
// don't call base class reset because it calls seek(0) which causes
// a warning
return isOpen ();
}
@ -56,7 +56,6 @@ void Detector::clear ()
qint64 Detector::writeData (char const * data, qint64 maxSize)
{
//qDebug () << "Detector::writeData: size:" << maxSize;
static unsigned mstr0=999999;
qint64 ms0 = QDateTime::currentMSecsSinceEpoch() % 86400000;
unsigned mstr = ms0 % int(1000.0*m_period); // ms into the nominal Tx start time

View File

@ -149,8 +149,6 @@ void Modulator::close ()
qint64 Modulator::readData (char * data, qint64 maxSize)
{
// qDebug () << "readData: maxSize:" << maxSize;
double toneFrequency=1500.0;
if(m_nsps==6) {
toneFrequency=1000.0;

93
NEWS
View File

@ -13,6 +13,99 @@
Copyright 2001 - 2020 by Joe Taylor, K1JT.
Release: WSJT-X 2.3.0-rc1
Sept 28, 2020
-------------------------
WSJT-X 2.3.0 is a program upgrade offering two new modes designed
especially for use on the LF and MF bands. FST4 is for 2-way QSOs,
and FST4W is for WSPR-like transmissions. Both modes offer a range of
options for T/R sequence lengths and threshold decoding sensitivities
extending well into the -40 dB range. Early tests have shown these
modes frequently spanning intercontinental distances on the 2200 m and
630 m bands. Further details and operating hints can be found in the
"Quick-Start Guide to FST4 and FST4W", posted on the WSJT web site:
https://physics.princeton.edu/pulsar/k1jt/FST4_Quick_Start.pdf
WSJT-X 2.3.0-rc1 is a beta-quality release candidate for a program
upgrade that provides a number of new features, capabilities, and
defect repairs. These include:
- New modes FST4 and FST4W targeting LF and MF bands.
- Improved noise baseline discovery for more reliable SNR estimates.
- On the waterfall and 2D spectrum a tool-tip shows the frequency
offset under the mouse pointer.
- The *On Dx Echo* Doppler compensation method has been modified in
response to feedback from Users. Basic functionality is unchanged.
See the User Guide (Section 8.1) for more information.
- Improved user_hardware script or program initiation for WSPR
band-hopping mode.
- Decoded QSO mode message display narrowed to make appended
information easier to view without scrolling the window.
- Option to record the propagation mode in logged QSO records.
- ADIF v3.1.1 compliance.
- Option to connect to PSKReporter using TCP/IP for those with very
poor Internet connections.
- Major rewrite of the PSKReporter interface to improve efficiency
and reduce traffic levels.
- Removal of the Tab 2 generated messages.
- Accessibility improvements to the UI.
- Tweaked decode speed options for a better user experience with
lower powered single-board computers like the Raspberry Pi.
- Updates to UI translations in Spanish, Italian, Catalan, Chinese,
Hong Kong Chinese, Danish, and Japanese.
- Audio devices only enumerated when starting up and opening the
"Settings->Audio" device lists.
- Option to select the default audio device removed to minimize the
likelihood of system sounds being transmitted.
- Better handling of missing audio devices.
- Improved and enhanced meta-data saved to .WAV files.
- More reliable multi-instance support.
- Included CTY.DAT file moved to installation share directory.
- The bundled Hamlib library is updated to the latest available which
fixes several regressions, defects, and adds new rig support.
- Fixed some edge-case message packing and unpacking defects and
ambiguities.
- Fix a defect that allowed non-CQ messages to be replied to via the
UDP Message Protocol.
- Fix a long-standing defect with Tx start timing.
- Repair a defect with style sheets when switching configurations.
- Repair defects that made the astronomical data window an several
main window controls unreadable when using the dark style sheet.
- Repair a regression with setting WSPR transmitted power levels.
- Repair a regression with newly created ADIF log file's header.
- Many other defects repaired.
Release: WSJT-X 2.2.2
June 22, 2020
---------------------

View File

@ -145,8 +145,10 @@ public:
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
connect (socket_.get (), &QAbstractSocket::errorOccurred, this, &PSKReporter::impl::handle_socket_error);
#else
#elif QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
connect (socket_.data (), QOverload<QAbstractSocket::SocketError>::of (&QAbstractSocket::error), this, &PSKReporter::impl::handle_socket_error);
#else
connect (socket_.data (), static_cast<void (QAbstractSocket::*) (QAbstractSocket::SocketError)> (&QAbstractSocket::error), this, &PSKReporter::impl::handle_socket_error);
#endif
// use this for pseudo connection with UDP, allows us to use

View File

@ -14,17 +14,97 @@ Copyright 2001 - 2020 by Joe Taylor, K1JT.
Release: WSJT-X 2.3.0-rc1
Sept DD, 2020
Sept 28, 2020
-------------------------
WSJT-X 2.3.0-rc1 is a beta-quality release candidate for a program
upgrade that provides a number of new features and capabilities.
These include:
WSJT-X 2.3.0 is a program upgrade offering two new modes designed
especially for use on the LF and MF bands. FST4 is for 2-way QSOs,
and FST4W is for WSPR-like transmissions. Both modes offer a range of
options for T/R sequence lengths and threshold decoding sensitivities
extending well into the -40 dB range. Early tests have shown these
modes frequently spanning intercontinental distances on the 2200 m and
630 m bands. Further details and operating hints can be found in the
"Quick-Start Guide to FST4 and FST4W", posted on the WSJT web site:
https://physics.princeton.edu/pulsar/k1jt/FST4_Quick_Start.pdf
WSJT-X 2.3.0-rc1 is a beta-quality release candidate for a program
upgrade that provides a number of new features, capabilities, and
defect repairs. These include:
- New modes FST4 and FST4W targeting LF and MF bands.
- Improved noise baseline discovery for more reliable SNR estimates.
- On the waterfall and 2D spectrum a tool-tip shows the frequency
offset under the mouse pointer.
- The *On Dx Echo* Doppler compensation method has been modified in
response to feedback from Users. Basic functionality is unchanged.
See the User Guide (Section 8.1) for more information.
- Improved user_hardware script or program initiation for WSPR
band-hopping mode.
- Decoded QSO mode message display narrowed to make appended
information easier to view without scrolling the window.
- Option to record the propagation mode in logged QSO records.
- ADIF v3.1.1 compliance.
- Option to connect to PSKReporter using TCP/IP for those with very
poor Internet connections.
- Major rewrite of the PSKReporter interface to improve efficiency
and reduce traffic levels.
- Removal of the Tab 2 generated messages.
- Accessibility improvements to the UI.
- Tweaked decode speed options for a better user experience with
lower powered single-board computers like the Raspberry Pi.
- Updates to UI translations in Spanish, Italian, Catalan, Chinese,
Hong Kong Chinese, Danish, and Japanese.
- Audio devices only enumerated when starting up and opening the
"Settings->Audio" device lists.
- Option to select the default audio device removed to minimize the
likelihood of system sounds being transmitted.
- Better handling of missing audio devices.
- Improved and enhanced meta-data saved to .WAV files.
- More reliable multi-instance support.
- Included CTY.DAT file moved to installation share directory.
- The bundled Hamlib library is updated to the latest available which
fixes several regressions, defects, and adds new rig support.
- Fixed some edge-case message packing and unpacking defects and
ambiguities.
- Fix a defect that allowed non-CQ messages to be replied to via the
UDP Message Protocol.
- Fix a long-standing defect with Tx start timing.
- Repair a defect with style sheets when switching configurations.
- Repair defects that made the astronomical data window an several
main window controls unreadable when using the dark style sheet.
- Repair a regression with setting WSPR transmitted power levels.
- Repair a regression with newly created ADIF log file's header.
- Many other defects repaired.
Release: WSJT-X 2.2.2
June 22, 2020

View File

@ -14,6 +14,10 @@
#include "moc_HamlibTransceiver.cpp"
#if HAVE_HAMLIB_OLD_CACHING
#define HAMLIB_CACHE_ALL CACHE_ALL
#endif
namespace
{
// Unfortunately bandwidth is conflated with mode, this is probably
@ -606,7 +610,7 @@ int HamlibTransceiver::do_start ()
}
}
#if HAVE_HAMLIB_CACHING
#if HAVE_HAMLIB_CACHING || HAVE_HAMLIB_OLD_CACHING
// we must disable Hamlib caching because it lies about frequency
// for less than 1 Hz resolution rigs
auto orig_cache_timeout = rig_get_cache_timeout_ms (rig_.data (), HAMLIB_CACHE_ALL);
@ -653,7 +657,7 @@ int HamlibTransceiver::do_start ()
resolution = -1; // best guess
}
#if HAVE_HAMLIB_CACHING
#if HAVE_HAMLIB_CACHING || HAVE_HAMLIB_OLD_CACHING
// revert Hamlib cache timeout
rig_set_cache_timeout_ms (rig_.data (), HAMLIB_CACHE_ALL, orig_cache_timeout);
#endif

View File

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

1685
cty.dat

File diff suppressed because it is too large Load Diff

View File

@ -1,28 +1,28 @@
Here are the "displayWidgets()" strings for WSJT-X modes
1 2 3
0123456789012345678901234567890123
----------------------------------------------
JT4 1110100000001100001100000000000000
JT4/VHF 1111100100101101101111000000000000
JT9 1110100000001110000100000000000010
JT9/VHF 1111101010001111100100000000000000
JT9+JT65 1110100000011110000100000000000010
JT65 1110100000001110000100000000000010
JT65/VHF 1111100100001101101011000100000000
QRA64 1111100101101101100000000010000000
QRA65 1111110101101101000100000011000000
ISCAT 1001110000000001100000000000000000
MSK144 1011111101000000000100010000000000
WSPR 0000000000000000010100000000000000
FST4 1111110001001110000100000001000000
FST4W 0000000000000000010100000000000001
Echo 0000000000000000000000100000000000
FCal 0011010000000000000000000000010000
FT8 1110100001001110000100001001100010
FT8/VHF 1110100001001110000100001001100010
FT8/Fox 1110100001001110000100000000001000
FT8/Hound 1110100001001110000100000000001100
012345678901234567890123456789012345
------------------------------------------------
JT4 111010000000110000110000000000000000
JT4/VHF 111110010010110110111100000000000000
JT9 111010000000111000010000000000001000
JT9/VHF 111110101000111110010000000000000000
JT9+JT65 111010000001111000010000000000001000
JT65 111010000000111000010000000000001000
JT65/VHF 111110010000110110101100010000000000
QRA64 111110010110110110000000001000000000
QRA65 111111010110110100010000001100000000
ISCAT 100111000000000110000000000000000000
MSK144 101111110100000000010001000000000000
WSPR 000000000000000001010000000000000000
FST4 111111000100111000010000000100000011
FST4W 000000000000000001010000000000000100
Echo 000000000000000000000010000000000000
FCal 001101000000000000000000000001000000
FT8 111010000100111000010000100110001000
FT8/VHF 111010000100111000010000100110001000
FT8/Fox 111010000100111000010000000000100000
FT8/Hound 111010000100111000010000000000110000
----------------------------------------------
1 2 3
012345678901234567890123456789012
@ -64,3 +64,5 @@ Mapping of column numbers to widgets
31. cbRxAll
32. cbCQonly
33. sbTR_FST4W
34. sbF_Low
35. sbF_High

View File

@ -30,8 +30,7 @@ set (UG_SRCS
install-mac.adoc
install-windows.adoc
introduction.adoc
measurement_tools.adoc
protocols.adoc
intro_subsections.adoc
logging.adoc
make-qso.adoc
measurement_tools.adoc
@ -53,6 +52,8 @@ set (UG_SRCS
tutorial-example2.adoc
tutorial-example3.adoc
tutorial-example4.adoc
tutorial-example5.adoc
tutorial-example6.adoc
tutorial-main-window.adoc
tutorial-wide-graph-settings.adoc
utilities.adoc
@ -82,6 +83,9 @@ set (UG_IMGS
images/FreqCal_Graph.png
images/FreqCal_Results.png
images/freemsg.png
images/FST4_center.png
images/FST4_Decoding_Limits.png
images/FST4W_RoundRobin.png
images/ft4_decodes.png
images/ft4_waterfall.png
images/ft8_decodes.png

240
doc/building-Boost-libs.txt Normal file
View File

@ -0,0 +1,240 @@
Linux
=====
Debian style:
sudo apt install libboost-all-dev
RPM style:
sudo dnf install boost-devel
macOS
=====
Download the latest Boost sources from here: boost.org
Currently v 1.74.0 -
https://dl.bintray.com/boostorg/release/1.74.0/source/boost_1_74_0.tar.bz2
cd ~/Downloads
curl -L -O https://dl.bintray.com/boostorg/release/1.74.0/source/boost_1_74_0.tar.bz2
mkdir src
cd !$
tar --bzip2 -xf ~/Downloads/boost_1_74_0.tar.bz2
cd boost_1_74_0/tools/build
./bootstrap.sh
./b2 toolset=clang --prefix=$HOME/local/boost-build install
cd ../..
~/local/boost-build/bin/b2 -j8 toolset=clang cflags=-mmacosx-version-min=10.12 \
cxxflags=-mmacosx-version-min=10.12 mflags=-mmacosx-version-min=10.12 \
mmflags=-mmacosx-version-min=10.12 mflags=-mmacosx-version-min=10.12 \
linkflags=-mmacosx-version-min=10.12 \
architecture=x86 address-model=64 --prefix=$HOME/local/boost install
That will take a while, once successful (warnings can be ignored) you
can clean the build tree to save some space:
~/local/boost-build/bin/b2 toolset=clang cflags=-mmacosx-version-min=10.12 \
cxxflags=-mmacosx-version-min=10.12 mflags=-mmacosx-version-min=10.12 \
mmflags=-mmacosx-version-min=10.12 mflags=-mmacosx-version-min=10.12 \
linkflags=-mmacosx-version-min=10.12 \
architecture=x86 address-model=64 --prefix=$HOME/local/boost clean
All that remains is to reconfigure your WSJT-X build trees to include
~/local/boost in your CMAKE_PREFIX_PATH, maybe something like these
(one each for Debug and Release configuration builds and assumes the
Macports GCC v7 tool-chain is being used):
FC=gfortran-mp-7 \
cmake \
-D CMAKE_PREFIX_PATH:PATH=~/local/boost\;~/Qt/5.15.0-clang\;~/local/hamlib/release\;/opt/local \
-D CMAKE_INSTALL_PREFIX=~/local/wsjtx/release \
-D CMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk \
-D CMAKE_BUILD_TYPE=Release \
-B ~/build/wsjtx-release \
~/src/bitbucket.org/k1jt/wsjtx
FC=gfortran-mp-7 \
cmake \
-D CMAKE_PREFIX_PATH:PATH=~/local/boost\;~/Qt/5.15.0-clang\;~/local/hamlib/debug\;/opt/local \
-D CMAKE_INSTALL_PREFIX=~/local/wsjtx/debug \
-D CMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk \
-D CMAKE_BUILD_TYPE=Debug \
-B ~/build/wsjtx-debug \
~/src/bitbucket.org/k1jt/wsjtx
Substitute you installed SDK version, Qt version and location, and
Hamlib install locations.
MS Windows
==========
Because 32-bit and 64-bit builds are possible and each use different
tool-chains, two separate builds are necessary if both architectures
are required.
Common steps
------------
Download and extract the latest Boost library sources, at the time of
writing that was
https://dl.bintray.com/boostorg/release/1.74.0/source/boost_1_74_0.7z
. Extract to some convenient location, I use %HOME%\src .
Download and extract the libbacktrace sources from
https://github.com/ianlancetaylor/libbacktrace as follows.
cd %HOME%\src
mkdir github.com
cd github.com
mkdir ianlancetaylor
cd ianlancetaylor
git clone git@github.com:ianlancetaylor/libbacktrace.git
I install third-party tools under the C:\Tools directory, the
following assumes that, adjust to taste. Note that it is OK to install
both 32- and 64-bit builds of Boost to the same path as the library
names are unique per architecture and tool-chain. This saves a lot of
space as the boost header files are quite big, and there's no need to
install multiple copies.
Create a new file %HOME%\src\boost_1_74_0\project-config.jam with the
following three lines to specify how Boost.Build finds the
libbacktrace library matched to your relevant C++ compliers:
import toolset ;
using gcc : : C:\\Qt\\Tools\\mingw730_32\\bin\\g++ : <compileflags>-I"C:\\Tools\\libbacktrace-1.0\\MinGW32\\include" <linkflags>-L"C:\\Tools\\libbacktrace-1.0\\MinGW32\\lib" ;
using gcc : 8~64 : C:\\Qt\\Tools\\mingw810_64\\bin\\g++ : <compileflags>-I"C:\\Tools\\libbacktrace-1.0\\MinGW64\\include" <linkflags>-L"C:\\Tools\\libbacktrace-1.0\\MinGW64\\lib" ;
Note that it may need some local adjustment of the C++ compiler
version and path depending on the exact tool-chains from your Qt
installation. Above I am using the Qt v5.12.9 MinGW32 v7 tool-chain
for 32-bit (toolset=gcc), and Qt v5.15.0 MinGW64 v8 tool-chain for
64-bit (toolchain=gcc-8~64).
32-bit
------
Start an MSys or MSys2 shell with the 32-bit C/C++ tool-chain from
your Qt installation on the PATH environment variable.
cd ~/src/github.com/ianlancetaylor/libbacktrace
./configure --prefix=/c/Tools/libbacktrace-1.0/MinGW32
make && make install
make clean
Start a CMD window suitably configured for use of the 32-bit MinGW
tool-chain bundled with your Qt binary installation. Verify the
correct compiler is in the PATH. i.e. it identifies (g++ --version) as
i686-posix-dwarf-rev0.
cd %HOME%\src\boost_1_74_0\tools\build
bootstrap.bat mingw
.\b2 --prefix=C:\Tools\boost-build\MinGW32 install
cd ..\..
C:\Tools\boost-build\MinGW32\bin\b2 -j8 toolset=gcc ^
--build-dir=%HOME%\build\boost ^
--build-type=complete --prefix=C:\Tools\boost install
If all is well you should see the following line about a 1/3 of the
way through the initial configuration steps.
- libbacktrace builds : yes
After some time it should complete with something like:
...failed updating 1574 targets...
...skipped 1112 targets...
...updated 3924 targets...
warnings can usually be ignored. If successful; you can release some
space by cleaning the build tree:
C:\Tools\boost-build\MinGW32\bin\b2 toolset=gcc ^
--build-dir=%HOME%\build\boost ^
--build-type=complete clean
64-bit
======
Start an MSys or MSys2 shell with the 64-bit C/C++ tool-chain from
your Qt installation on the PATH environment variable.
cd ~/src/github.com/ianlancetaylor/libbacktrace
./configure --prefix=/c/Tools/libbacktrace-1.0/MinGW64
make && make install
make clean
Start a CMD window suitably configured for use of the 64-bit MinGW
tool-chain bundled with your Qt binary installation. Verify the
correct compiler is in the PATH. i.e. it identifies (g++ --version) as
x86_64-posix-seh-rev0. Note the toolchain specified must match your
compilers and the project-config.jam file you created above. With a v7
64-bit C++ compiler use gcc-7~64, with a v8 64-bit C++ compiler use
gcc-8~64. My example matches my 64-bit Qt v5.15.0 with the bundled
MinGW64 v8.1.0.
cd %HOME%\src\boost_1_74_0\tools\build
bootstrap.bat
.\b2 --prefix=C:\Tools\boost-build\MinGW64 install
cd ..\..
C:\Tools\boost-build\MinGW64\bin\b2 -j8 toolset=gcc-8~64 ^
address-model=64 --build-dir=%HOME%\build\boost ^
--build-type=complete --prefix=C:\Tools\boost install
If all is well you should see the following line about a 1/3 of the
way through the initial configuration steps.
- libbacktrace builds : yes
After some time it should complete with something like:
...failed updating 108 targets...
...skipped 32 targets...
...updated 3648 targets...
warnings can usually be ignored. If successful; you can release some
space by cleaning the build tree:
C:\Tools\boost-build\MinGW32\bin\b2 toolset=gcc-8~64 ^
address-model=64 --build-dir=%HOME%\build\boost ^
--build-type=complete clean
Run-time Environment
--------------------
You will need to add C:\Tools\boost\lib to your PATH environment
variable in order to run installed Debug configurations of WSJT-X, or
to execute build artefacts from a build tree. It is also needed for
teh install target of release configuration builds. Installed Release
configurations will move any required DLLs to the installation bin
directory automatically.
Setting up WSJT-X builds
------------------------
All that remains is to add C:\Tools\boost\ to your 32- and 64-bit
build configurations CMAKE_PREFIX_PATH variables. I use tool-chain
files for my WSJT-X builds on Windows, an extract from my 32-bit Debug
configuration tool-chain file:
# ...
set (BOOSTDIR C:/Tools/boost)
set (QTDIR C:/Qt/5.12.9/mingw73_32)
# set (QTDIR C:/Qt/5.15.0/mingw81_32)
set (FFTWDIR C:/Tools/fftw-3.3.5-dll32)
set (HAMLIBDIR C:/test-install/hamlib/mingw32/debug)
set (LIBUSBDIR C:/Tools/libusb-1.0.23)
set (PYTHONDIR C:/Python27)
set (ASCIIDOCDIR C:/Tools/asciidoc-master)
# where to find required packages
set (CMAKE_PREFIX_PATH ${BOOSTDIR} ${QTDIR} ${FFTWDIR} ${HAMLIBDIR} ${HAMLIBDIR}/bin ${LIBUSBDIR} ${PYTHONDIR} ${ASCIIDOCDIR})
# ...

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -21,19 +21,21 @@ TIP: Your computer may be configured so that this directory is
`"%LocalAppData%\WSJT-X\"`.
* The built-in Windows facility for time synchronization is usually
not adequate. We recommend the program _Meinberg NTP Client_ (see
{ntpsetup} for downloading and installation instructions). Recent
not adequate. We recommend the program _Meinberg NTP Client_: see
{ntpsetup} for downloading and installation instructions. Recent
versions of Windows 10 are now shipped with a more capable Internet
time synchronization service that is suitable if configured
appropriately. We do not recommend SNTP time setting tools or others
that make periodic correction steps, _WSJT-X_ requires that the PC
clock be monotonic.
clock be monotonically increasing and smoothly continuous.
NOTE: Having a PC clock that appears to be synchronized to UTC is not
sufficient, monotonicity means that the clock must not be
stepped backwards or forwards during corrections, instead the
clock frequency must be adjusted to correct synchronization
errors gradually.
sufficient. "`Monotonically increasing`" means that the clock
must not be stepped backwards. "`Smoothly continuous`" means
that time must increase at a nearly constant rate, without
steps. Any necessary clock corrections must be applied by
adjusting the rate of increase, thereby correcting
synchronization errors gradually.
[[OPENSSL]]

View File

@ -0,0 +1,40 @@
=== Documentation Conventions
In this manual the following icons call attention to particular types
of information:
NOTE: *Notes* containing information that may be of interest to
particular classes of users.
TIP: *Tips* on program features or capabilities that might otherwise be
overlooked.
IMPORTANT: *Warnings* about usage that could lead to undesired
consequences.
=== User Interface in Other Languages
The _WSJT-X_ user interface is now available in many languages. When
a translated user interface is available for the computer's default
System Language, it will appear automatically on program startup.
=== How You Can Contribute
_WSJT-X_ is part of an open-source project released under the
{gnu_gpl} (GPLv3). 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. We especially encourage
those with translation skills to volunteer their help, either for
this _User Guide_ or for the program's user interface.
The project's source-code repository can be found at {devrepo}, and
communication among the developers takes place on the email reflector
{devmail}. Bug reports and suggestions for new features, improvements
to the _WSJT-X_ User Guide, etc., may be sent there as well. You must
join the group before posting to the email list.
=== License
Before using _WSJT-X_, please read our licensing terms
<<LICENSE,here>>.

View File

@ -3,42 +3,41 @@
_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 "`**W**eak **S**ignal communication by
K1**JT**,`" while the suffix "`-X`" indicates that _WSJT-X_ started as
an extended and experimental branch of the program _WSJT_,
first released in 2001. Bill Somerville, G4WJS, and Steve Franke,
K9AN, have been major contributors to program development since 2013
and 2015, respectively.
K1**JT**,`" while the suffix "`*-X*`" indicates that _WSJT-X_ started
as an extended branch of an earlier program, _WSJT_, first released in
2001. Bill Somerville, G4WJS, and Steve Franke, K9AN, have been major
contributors to development of _WSJT-X_ since 2013 and 2015, respectively.
_WSJT-X_ Version {VERSION_MAJOR}.{VERSION_MINOR} 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 some advantages over JT65, including better performance
for EME on the higher microwave bands. 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. 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.
_WSJT-X_ Version {VERSION_MAJOR}.{VERSION_MINOR} offers twelve
different protocols or modes: *FST4*, *FT4*, *FT8*, *JT4*, *JT9*,
*JT65*, *QRA64*, *ISCAT*, *MSK144*, *WSPR*, *FST4W*, and *Echo*. The
first seven 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 some advantages over
JT65, including better performance for EME on the higher microwave
bands. JT9 was originally designed for the HF and lower bands. Its
submode JT9A is 1 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. FST4 was added to _WSJT-X_ in
version 2.3.0. It is intended especially for use on the LF and MF
bands, and already during its first few months of testing
intercontinental paths have been spanned many times on the 2200 and
630 m bands. Further details can be found in the following section,
<<NEW_FEATURES,New Features in Version 2.3.0>>. 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.
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.
*ISCAT*, *MSK144*, and optionally submodes *JT9E-H* are "`fast`"
protocols designed to take advantage of brief signal enhancements from
@ -51,15 +50,26 @@ 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.
Note that some of the modes classified as slow can have T/R sequence
lengths as short the fast modes. "`Slow`" in this sense implies
message frames being sent only once per transmission. The fast modes
in _WSJT-X_ send their message frames repeatedly, as many times as
will fit into the Tx sequence length.
*WSPR* (pronounced "`whisper`") stands for **W**eak **S**ignal
**P**ropagation **R**eporter. 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 -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.
**P**ropagation **R**eporter. 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 with two-minute
sequences they can be decoded at signal-to-noise ratios as low
as -31 dB in a 2500 Hz bandwidth. *FST4W* is designed for
similar purposes, but especially for use on LF and MF bands.
It includes optional sequence lengths as long as 30 minutes and
reaches sensitivity tresholds as low as -45 dB. Users
with internet access can automatically upload WSPR and FST4W
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 station's echoes
from the moon, even if they are far below the audible threshold.

View File

@ -1,107 +1,34 @@
[[NEW_FEATURES]]
=== New in Version {VERSION}
*Improvements to decoders*
_WSJT-X 2.3.0_ introduces *FST4* and *FST4W*, new digital protocols
designed particularly for the LF and MF bands. Decoders for these
modes can take advantage of the very small Doppler spreads present at
these frequencies, even over intercontinental distances. As a
consequence, fundamental sensitivities of FST4 and FST4W are better
than other _WSJT-X_ modes with the same sequence lengths, approaching
the theoretical limits for their rates of information throughput. The
FST4 protocol is optimized for two-way QSOs, while FST4W is for
quasi-beacon transmissions of WSPR-style messages. FST4 and FST4W do
not require the strict, independent phase locking and time
synchronization of modes like EbNaut.
*FT4:* Corrected bugs that prevented AP (_a priori_) decoding and/or
multi-pass decoding in some circumstances. Improved and extended the
algorithm for AP decoding.
The new modes use 4-GFSK modulation and share common software for
encoding and decoding messages. FST4 offers T/R sequence lengths of
15, 30, 60, 120, 300, 900, and 1800 seconds, while FST4W omits the
lengths shorter than 120 s. Submodes are given names like FST4-60,
FST4W-300, etc., the appended numbers indicating sequence length in
seconds. Message payloads contain either 77 bits, as in FT4, FT8, and
MSK144, or 50 bits for the WSPR-like messages of FST4W. Message
formats displayed to the user are like those in the other 77-bit and
50-bit modes in _WSJT-X_. Forward error correction uses a low density
parity check (LDPC) code with 240 information and parity bits.
Transmissions consist of 160 symbols: 120 information-carrying symbols
of two bits each, interspersed with five groups of eight predefined
synchronization symbols.
*FT8:* Decoding is now spread over three intervals. The first starts
11.8 s into an Rx sequence and typically yields around 85% of the
possible decodes, so you see most decodes much earlier than before. A
second processing step starts at 13.5 s, and the final one at 14.7 s.
Overall decoding yield on crowded bands is improved by 10% or more.
Systems with receive latency greater than 0.2 s will see smaller
improvements, but will still see many decodes earlier than before.
SNR estimates no longer saturate at +20 dB, and large signals in the
passband no longer cause the SNR of weaker signals to be biased low.
Times written to cumulative journal file ALL.TXT are now correct even
when the decode occurs after the T/R sequence boundary. In FT8
DXpedition Mode, AP decoding is now implemented for Hounds when the
Fox has a compound callsign.
*JT4:* Formatting and display of averaged and Deep Search decodes has
been cleaned up and made consistent with other modes used for EME and
extreme weak-signal work on microwave bands.
*JT65:* Many improvements have been made for averaged and Deep Search
decodes, and their display to the user. For details see <<VHF_JT65,JT65>>
in the <<VHF_AND_UP,VHF+ Features>> section of this guide.
*WSPR:* Significant improvements have been made to the WSPR decoder's
sensitivity, its ability to cope with many signals in a crowded
sub-band, and its rate of undetected false decodes. We now use up to
three decoding passes. Passes 1 and 2 use noncoherent demodulation of
single symbols and allow for frequency drifts up to ±4 Hz in a
transmission. Pass 3 assumes no drift and does coherent block
detection of up to three symbols. It also applies bit-by-bit
normalization of the single-symbol bit metrics, a technique that has
proven helpful for signals corrupted by artifacts of the subtraction
of stronger signals and also for LF/MF signals heavily contaminated by
lightning transients. With these improvements the number of decodes
in a crowded WSPR sub-band typically increases by 10 to 15%.
*New message format:* When *EU VHF Contest* is selected, the Tx2 and
Tx3 messages -- those conveying signal report, serial number, and
6-character locator -- now use hashcodes for both callsigns. This
change is *not* backward compatible with earlier versions of _WSJT-X_, so
all users of *EU VHF Contest* messages should be sure to upgrade to
version 2.2.0. See <<CONTEST_MSGS,Contest Messages>> for details.
*Minor enhancements and bug fixes*
- *Save None* now writes no .wav files to disk, even temporarily.
- An explicit entry for *WW Digi Contest* has been added to *Special
operating activities* on the *Settings | Advanced* tab.
- The contest mode FT4 now always uses RR73 for the Tx4 message.
- *Keyboard shortcuts* have been added as an aid to accessibility:
*Alt+R* sets Tx4 message to RR73, *Ctrl+R* sets it to RRR.
- The *Status bar* now displays the number of decodes found in the
most recent Rx sequence.
- As an aid for partial color-blindness, the "`inverted goal posts`"
marking Rx frequency on the Wide Graph's frequency scale are now in a
darker shade of green.
=== Documentation Conventions
In this manual the following icons call attention to particular types
of information:
NOTE: *Notes* containing information that may be of interest to
particular classes of users.
TIP: *Tips* on program features or capabilities that might otherwise be
overlooked.
IMPORTANT: *Warnings* about usage that could lead to undesired
consequences.
=== User Interface in Other Languages
Thanks to Xavi Perez, EA3W, in cooperation with G4WJS, the _WSJT-X_
user interface is now available the Catalan language. Spanish will
follow soon, and other languages when translations are made. When a
translated user interface is available for the computer's default
System Language, it will appear automatically on program startup.
=== How You Can Contribute
_WSJT-X_ is part of an open-source project released under the
{gnu_gpl} (GPLv3). 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. We especially encourage
those with translation skills to volunteer their help, either for
this _User Guide_ or for the program's user interface.
The project's source-code repository can be found at {devrepo}, and
communication among the developers takes place on the email reflector
{devmail}. Bug reports and suggestions for new features, improvements
to the _WSJT-X_ User Guide, etc., may be sent there as well. You must
join the group before posting to the email list.
*We recommend that on the 2200 and 630 m bands FST4 should replace JT9
for making 2-way QSOs, and FST4W should replace WSPR for propagation
tests*. Operating conventions on these LF and MF bands will
eventually determine the most useful T/R sequence lengths for each
type of operation.

View File

@ -14,11 +14,11 @@ Special cases allow other information such as add-on callsign prefixes
aim is to compress the most common messages used for minimally valid
QSOs into a fixed 72-bit length.
The information payload for FT4, FT8, and MSK144 contains 77 bits.
The 5 new bits added to the original 72 are used to flag special
message types signifying special message types used for FT8 DXpedition
Mode, contesting, nonstandard callsigns, and a few other
possibilities.
Information payloads for FST4, FT4, FT8, and MSK144 contain 77 bits.
The 5 additional bits are used to flag special message types used for
nonstandard callsigns, contest exchanges, FT8 DXpedition Mode, and a
few other possibilities. Full details have been published in QEX, see
{ft4_ft8_protocols}.
A standard amateur callsign consists of a one- or two-character
prefix, at least one of which must be a letter, followed by a digit
@ -54,11 +54,6 @@ 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 FT4, FT8, and MSK144 protocols use different lossless compression
algorithms with features that generate and recognize special messages
used for contesting and other special purposes. Full details have
been published in QEX, see {ft4_ft8_protocols}.
To be useful on channels with low signal-to-noise ratio, this kind of
lossless message compression requires use of a strong forward error
correcting (FEC) code. Different codes are used for each mode.
@ -71,6 +66,20 @@ _WSJT-X_ modes have continuous phase and constant envelope.
[[SLOW_MODES]]
=== Slow Modes
[[FST4PRO]]
==== FST4
FST4 offers T/R sequence lengths of 15, 30, 60, 120, 300, 900, and
1800 seconds. Submodes are given names like FST4-60, FST4-120, etc.,
the appended numbers indicating sequence length in seconds. A 24-bit
cyclic redundancy check (CRC) is appended to the 77-bit message
payload to create a 101-bit message-plus-CRC word. Forward error
correction is accomplished using a (240,101) LDPC code. Transmissions
consist of 160 symbols: 120 information-carrying symbols of two bits
each, interspersed with five groups of eight predefined
synchronization symbols. Modulation uses 4-tone frequency-shift
keying (4-GFSK) with Gaussian smoothing of frequency transitions.
[[FT4PRO]]
==== FT4
@ -225,6 +234,20 @@ information the least significant. Thus, on a 0 3 scale, the tone
for a given symbol is twice the value (0 or 1) of the data bit, plus
the sync bit.
[[FST4WPRO]]
==== FST4W
FST4W offers T/R sequence lengths of 120, 300, 900, and 1800 seconds.
Submodes are given names like FST4W-120, FST4W-300, etc., the appended
numbers indicating sequence length in seconds. Message payloads
contain 50 bits, and a 24-bit cyclic redundancy check (CRC) appended
to create a 74-bit message-plus-CRC word. Forward error correction
is accomplished using a (240,74) LDPC code. Transmissions consist of
160 symbols: 120 information-carrying symbols of two bits each,
interspersed with five groups of eight predefined synchronization
symbols. Modulation uses 4-tone frequency-shift keying (4-GFSK) with
Gaussian smoothing of frequency transitions.
[[SLOW_SUMMARY]]
==== Summary
@ -239,17 +262,28 @@ which the probability of decoding is 50% or higher.
[[SLOW_TAB]]
.Parameters of Slow Modes
[width="90%",cols="3h,^3,^2,^1,^2,^2,^2,^2,^2,^2",frame=topbot,options="header"]
[width="100%",cols="3h,^3,^2,^1,^2,^2,^2,^2,^2,^2",frame=topbot,options="header"]
|===============================================================================
|Mode |FEC Type |(n,k) | Q|Modulation type|Keying rate (Baud)|Bandwidth (Hz)
|Sync Energy|Tx Duration (s)|S/N Threshold (dB)
|FT4 |LDPC, r=1/2|(174,91)| 4| 4-GFSK| 20.8333 | 83.3 | 0.15| 5.04 | -17.5
|FT8 |LDPC, r=1/2|(174,91)| 8| 8-GFSK| 6.25 | 50.0 | 0.27| 12.6 | -21
|FST4-15 |LDPC | (240,101)| 4| 4-GFSK| 16.67 | 67.7 | 0.25| 9.6 | -20.7
|FST4-30 |LDPC | (240,101)| 4| 4-GFSK| 7.14 | 28.6 | 0.25| 22.4 | -24.2
|FST4-60 |LDPC | (240,101)| 4| 4-GFSK| 3.09 | 12.4 | 0.25| 51.8 | -28.1
|FST4-120 |LDPC | (240,101)| 4| 4-GFSK| 1.46 | 5.9 | 0.25| 109.3 | -31.3
|FST4-300 |LDPC | (240,101)| 4| 4-GFSK| 0.558 | 2.2 | 0.25| 286.7 | -35.3
|FST4-900 |LDPC | (240,101)| 4| 4-GFSK| 0.180 | 0.72 | 0.25| 887.5 | -40.2
|FST4-1800 |LDPC | (240,101)| 4| 4-GFSK| 0.089 | 0.36 | 0.25| 1792.0| -43.2
|FT4 |LDPC |(174,91)| 4| 4-GFSK| 20.83 | 83.3 | 0.15| 5.04 | -17.5
|FT8 |LDPC |(174,91)| 8| 8-GFSK| 6.25 | 50.0 | 0.27| 12.6 | -21
|JT4A |K=32, r=1/2|(206,72)| 2| 4-FSK| 4.375| 17.5 | 0.50| 47.1 | -23
|JT9A |K=32, r=1/2|(206,72)| 8| 9-FSK| 1.736| 15.6 | 0.19| 49.0 | -27
|JT9A |K=32, r=1/2|(206,72)| 8| 9-FSK| 1.736| 15.6 | 0.19| 49.0 | -26
|JT65A |Reed Solomon|(63,12) |64|65-FSK| 2.692| 177.6 | 0.50| 46.8 | -25
|QRA64A|Q-ary Repeat Accumulate|(63,12) |64|64-FSK|1.736|111.1|0.25|48.4| -26
| WSPR |K=32, r=1/2|(162,50)| 2| 4-FSK| 1.465| 5.9 | 0.50|110.6 | -31
|FST4W-120 |LDPC | (240,74)| 4| 4-GFSK| 1.46 | 5.9 | 0.25| 109.3 | -32.8
|FST4W-300 |LDPC | (240,74)| 4| 4-GFSK| 0.558 | 2.2 | 0.25| 286.7 | -36.8
|FST4W-900 |LDPC | (240,74)| 4| 4-GFSK| 0.180 | 0.72 | 0.25| 887.5 | -41.7
|FST4W-1800 |LDPC | (240,74)| 4| 4-GFSK| 0.089 | 0.36 | 0.25| 1792.0| -44.8
|===============================================================================
Submodes of JT4, JT9, JT65, and QRA64 offer wider tone spacings for
@ -259,12 +293,10 @@ threshold sensitivities of the various submodes when spreading is
comparable to tone spacing.
[[SLOW_SUBMODES]]
.Parameters of Slow Submodes
.Parameters of Slow Submodes with Selectable Tone Spacings
[width="50%",cols="h,3*^",frame=topbot,options="header"]
|=====================================
|Mode |Tone Spacing |BW (Hz)|S/N (dB)
|FT4 |20.8333 | 83.3 |-17.5
|FT8 |6.25 | 50.0 |-21
|JT4A |4.375| 17.5 |-23
|JT4B |8.75 | 30.6 |-22
|JT4C |17.5 | 56.9 |-21
@ -272,7 +304,7 @@ comparable to tone spacing.
|JT4E |78.75| 240.6 |-19
|JT4F |157.5| 476.9 |-18
|JT4G |315.0| 949.4 |-17
|JT9A |1.736| 15.6 |-27
|JT9A |1.736| 15.6 |-26
|JT9B |3.472| 29.5 |-26
|JT9C |6.944| 57.3 |-25
|JT9D |13.889| 112.8 |-24

View File

@ -0,0 +1,23 @@
Do not confuse FST4 with FT4, which has a very different purpose!
FST4 is is designed for making 2-way QSOs on the LF and MF bands.
Operation with FST4 is similar to that with other _WSJT-X_ modes: most
on-screen controls, auto-sequencing, and other features behave in
familiar ways. However, operating conventions on the 2200 and 630 m
bands have made some additional user controls desirable. Spin boxes
labeled *F Low* and *F High* set lower and upper frequency limits used
by the FST4 decoder, and these limits are marked by dark green
angle-bracket symbols *< >* on the Wide Graph frequency scale:
image::FST4_Decoding_Limits.png[align="center"]
{empty} +
image::FST4_center.png[align="center"]
It's best to keep the decoding range fairly small, since QRM and
transmissions in other modes or sequence lengths will slow down the
decoding process (and of course will be undecodable). By checking
*Single decode* on the the *File | Settings | General* tab, you can
further limit the decoding range to the setting of *F Tol* on
either side of *Rx Freq*.

View File

@ -0,0 +1,18 @@
FST4W is used in the same way as WSPR, but FST4W has significant
advantages for use on the 2200 and 630 m bands. By default the
central *Rx Freq* is 1500 Hz and *F Tol* is 100 Hz, so the active
decoding range is 1400 to 1600 Hz. However, for added flexibility you
can select different center frequencies and *F Tol* values. We expect
that usage conventions will soon be established for FST4W activity on
2200 and 630 m.
A new drop-down control below *F Tol* offers a round-robin mode for
scheduling FST4W transmissions:
image::FST4W_RoundRobin.png[align="center"]
If three operators agree in advance to select the options *1/3*,
*2/3*, and *3/3*, for example, their FST4W transmissions will occur in
a fixed sequence with no two stations transmitting simultaneously.
Sequence 1 is the first sequence after 00:00 UTC. For WSPR-like
scheduling behavior, you should select *Random* with this control.

View File

@ -32,6 +32,9 @@ include::introduction.adoc[]
[[NEW_FEATURES]]
include::new_features.adoc[]
[[INTRO_SUBSECTIONS]]
include::intro_subsections.adoc[]
[[SYSREQ]]
== System Requirements
include::system-requirements.adoc[]
@ -162,6 +165,14 @@ include::tutorial-example3.adoc[]
=== FT4
include::tutorial-example4.adoc[]
[[TUT_EX5]]
=== FST4
include::tutorial-example5.adoc[]
[[TUT_EX6]]
=== FST4W
include::tutorial-example6.adoc[]
[[MAKE_QSOS]]
== Making QSOs
include::make-qso.adoc[]

View File

@ -8,6 +8,8 @@ subroutine blanker(iwave,nz,ndropmax,npct,c_bigfft)
fblank=0.01*npct
hist=0
do i=1,nz
! ### NB: if iwave(i)=-32768, abs(iwave(i))=-32768 ###
if(iwave(i).eq.-32768) iwave(i)=-32767
n=abs(iwave(i))
hist(n)=hist(n)+1
enddo

View File

@ -61,6 +61,10 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
type(counting_fst4_decoder) :: my_fst4
type(counting_qra65_decoder) :: my_qra65
rms=sqrt(dot_product(float(id2(1:180000)), &
float(id2(1:180000)))/180000.0)
if(rms.lt.3.0) go to 800
!cast C character arrays to Fortran character strings
datetime=transfer(params%datetime, datetime)
mycall=transfer(params%mycall,mycall)
@ -212,8 +216,8 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
call timer('dec240 ',0)
call my_fst4%decode(fst4_decoded,id2,params%nutc, &
params%nQSOProgress,params%nfa,params%nfb, &
params%nfqso,ndepth,params%ntr, &
params%nexp_decode,params%ntol,params%emedelay, &
params%nfqso,ndepth,params%ntr,params%nexp_decode, &
params%ntol,params%emedelay,logical(params%nagain), &
logical(params%lapcqonly),mycall,hiscall,iwspr)
call timer('dec240 ',1)
go to 800
@ -226,17 +230,13 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
call timer('dec240 ',0)
call my_fst4%decode(fst4_decoded,id2,params%nutc, &
params%nQSOProgress,params%nfa,params%nfb, &
params%nfqso,ndepth,params%ntr, &
params%nexp_decode,params%ntol,params%emedelay, &
params%nfqso,ndepth,params%ntr,params%nexp_decode, &
params%ntol,params%emedelay,logical(params%nagain), &
logical(params%lapcqonly),mycall,hiscall,iwspr)
call timer('dec240 ',1)
go to 800
endif
rms=sqrt(dot_product(float(id2(60001:61000)), &
float(id2(60001:61000)))/1000.0)
if(rms.lt.2.0) go to 800
! Zap data at start that might come from T/R switching transient?
nadd=100
k=0

View File

@ -1,17 +1,15 @@
subroutine get_fst4_bitmetrics(cd,nss,hmod,nmax,nhicoh,bitmetrics,s4,nsync_qual,badsync)
subroutine get_fst4_bitmetrics(cd,nss,nmax,nhicoh,bitmetrics,s4,nsync_qual,badsync)
use timer_module, only: timer
include 'fst4_params.f90'
complex cd(0:NN*nss-1)
complex cs(0:3,NN)
complex csymb(nss)
complex, allocatable, save :: c1(:,:) ! ideal waveforms, 20 samples per symbol, 4 tones
complex cp(0:3) ! accumulated phase shift over symbol types 0:3
complex csum,cterm
complex, allocatable, save :: ci(:,:) ! ideal waveforms, 20 samples per symbol, 4 tones
complex c1(4,8),c2(16,4),c4(256,2)
integer isyncword1(0:7),isyncword2(0:7)
integer graymap(0:3)
integer ip(1)
integer hmod
integer hbits(2*NN)
logical one(0:65535,0:15) ! 65536 8-symbol sequences, 16 bits
logical first
@ -25,9 +23,9 @@ subroutine get_fst4_bitmetrics(cd,nss,hmod,nmax,nhicoh,bitmetrics,s4,nsync_qual,
data first/.true./,nss0/-1/
save first,one,cp,nss0
if(nss.ne.nss0 .and. allocated(c1)) deallocate(c1)
if(nss.ne.nss0 .and. allocated(ci)) deallocate(ci)
if(first .or. nss.ne.nss0) then
allocate(c1(nss,0:3))
allocate(ci(nss,0:3))
one=.false.
do i=0,65535
do j=0,15
@ -35,15 +33,14 @@ subroutine get_fst4_bitmetrics(cd,nss,hmod,nmax,nhicoh,bitmetrics,s4,nsync_qual,
enddo
enddo
twopi=8.0*atan(1.0)
dphi=twopi*hmod/nss
dphi=twopi/nss
do itone=0,3
dp=(itone-1.5)*dphi
phi=0.0
do j=1,nss
c1(j,itone)=cmplx(cos(phi),sin(phi))
ci(j,itone)=cmplx(cos(phi),sin(phi))
phi=mod(phi+dp,twopi)
enddo
cp(itone)=cmplx(cos(phi),sin(phi))
enddo
first=.false.
endif
@ -52,7 +49,7 @@ subroutine get_fst4_bitmetrics(cd,nss,hmod,nmax,nhicoh,bitmetrics,s4,nsync_qual,
i1=(k-1)*NSS
csymb=cd(i1:i1+NSS-1)
do itone=0,3
cs(itone,k)=sum(csymb*conjg(c1(:,itone)))
cs(itone,k)=sum(csymb*conjg(ci(:,itone)))
enddo
s4(0:3,k)=abs(cs(0:3,k))**2
enddo
@ -85,49 +82,84 @@ subroutine get_fst4_bitmetrics(cd,nss,hmod,nmax,nhicoh,bitmetrics,s4,nsync_qual,
return
endif
call timer('seqcorrs',0)
bitmetrics=0.0
do nseq=1,nmax !Try coherent sequences of 1,2,3,4 or 1,2,4,8 symbols
if(nseq.eq.1) nsym=1
if(nseq.eq.2) nsym=2
if(nhicoh.eq.0) then
if(nseq.eq.3) nsym=3
if(nseq.eq.4) nsym=4
else
if(nseq.eq.3) nsym=4
if(nseq.eq.4) nsym=8
endif
nt=4**nsym
do ks=1,NN-nsym+1,nsym
! Process the frame in 8-symbol chunks. Use 1-symbol correlations to calculate
! 2-symbol correlations. Then use 2-symbol correlations to calculate 4-symbol
! correlations. Finally, use 4-symbol correlations to calculate 8-symbol corrs.
! This eliminates redundant calculations.
do k=1,NN,8
do m=1,8 ! do 4 1-symbol correlations for each of 8 symbs
s2=0
do i=0,nt-1
csum=0
! cterm=1 ! hmod.ne.1
term=1
do j=0,nsym-1
ntone=mod(i/4**(nsym-1-j),4)
csum=csum+cs(graymap(ntone),ks+j)*term
term=-term
! csum=csum+cs(graymap(ntone),ks+j)*cterm ! hmod.ne.1
! cterm=cterm*conjg(cp(graymap(ntone))) ! hmod.ne.1
enddo
s2(i)=abs(csum)
do n=1,4
c1(n,m)=cs(graymap(n-1),k+m-1)
s2(n-1)=abs(c1(n,m))
enddo
ipt=1+(ks-1)*2
if(nsym.eq.1) ibmax=1
if(nsym.eq.2) ibmax=3
if(nsym.eq.3) ibmax=5
if(nsym.eq.4) ibmax=7
if(nsym.eq.8) ibmax=15
do ib=0,ibmax
bm=maxval(s2(0:nt-1),one(0:nt-1,ibmax-ib)) - &
maxval(s2(0:nt-1),.not.one(0:nt-1,ibmax-ib))
ipt=(k-1)*2+2*(m-1)+1
do ib=0,1
bm=maxval(s2(0:3),one(0:3,1-ib)) - &
maxval(s2(0:3),.not.one(0:3,1-ib))
if(ipt+ib.gt.2*NN) cycle
bitmetrics(ipt+ib,nseq)=bm
bitmetrics(ipt+ib,1)=bm
enddo
enddo
do m=1,4 ! do 16 2-symbol correlations for each of 4 2-symbol groups
s2=0
do i=1,4
do j=1,4
is=(i-1)*4+j
c2(is,m)=c1(i,2*m-1)-c1(j,2*m)
s2(is-1)=abs(c2(is,m))
enddo
enddo
ipt=(k-1)*2+4*(m-1)+1
do ib=0,3
bm=maxval(s2(0:15),one(0:15,3-ib)) - &
maxval(s2(0:15),.not.one(0:15,3-ib))
if(ipt+ib.gt.2*NN) cycle
bitmetrics(ipt+ib,2)=bm
enddo
enddo
do m=1,2 ! do 256 4-symbol corrs for each of 2 4-symbol groups
s2=0
do i=1,16
do j=1,16
is=(i-1)*16+j
c4(is,m)=c2(i,2*m-1)+c2(j,2*m)
s2(is-1)=abs(c4(is,m))
enddo
enddo
ipt=(k-1)*2+8*(m-1)+1
do ib=0,7
bm=maxval(s2(0:255),one(0:255,7-ib)) - &
maxval(s2(0:255),.not.one(0:255,7-ib))
if(ipt+ib.gt.2*NN) cycle
bitmetrics(ipt+ib,3)=bm
enddo
enddo
s2=0 ! do 65536 8-symbol correlations for the entire group
do i=1,256
do j=1,256
is=(i-1)*256+j
s2(is-1)=abs(c4(i,1)+c4(j,2))
enddo
enddo
ipt=(k-1)*2+1
do ib=0,15
bm=maxval(s2(0:65535),one(0:65535,15-ib)) - &
maxval(s2(0:65535),.not.one(0:65535,15-ib))
if(ipt+ib.gt.2*NN) cycle
bitmetrics(ipt+ib,4)=bm
enddo
enddo
call timer('seqcorrs',1)
hbits=0

View File

@ -30,8 +30,8 @@ module fst4_decode
contains
subroutine decode(this,callback,iwave,nutc,nQSOProgress,nfa,nfb,nfqso, &
ndepth,ntrperiod,nexp_decode,ntol,emedelay,lapcqonly,mycall, &
hiscall,iwspr)
ndepth,ntrperiod,nexp_decode,ntol,emedelay,lagain,lapcqonly,mycall, &
hiscall,iwspr)
use timer_module, only: timer
use packjt77
@ -49,13 +49,14 @@ contains
complex, allocatable :: cframe(:)
complex, allocatable :: c_bigfft(:) !Complex waveform
real llr(240),llrs(240,4)
real candidates(200,5)
real candidates0(200,5),candidates(200,5)
real bitmetrics(320,4)
real s4(0:3,NN)
real minsync
logical lapcqonly
logical lagain,lapcqonly
integer itone(NN)
integer hmod
integer ipct(0:7)
integer*1 apmask(240),cw(240)
integer*1 message101(101),message74(74),message77(77)
integer*1 rvec(77)
@ -64,11 +65,12 @@ contains
integer naptypes(0:5,4) ! (nQSOProgress,decoding pass)
integer mcq(29),mrrr(19),m73(19),mrr73(19)
logical badsync,unpk77_success
logical badsync,unpk77_success,single_decode
logical first,nohiscall,lwspr,ex
integer*2 iwave(30*60*12000)
data ipct/0,8,14,4,12,2,10,6/
data mcq/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0/
data mrrr/0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1/
data m73/0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1/
@ -214,272 +216,323 @@ contains
if(ndepth.eq.3) then
nblock=4
jittermax=2
norder=3
elseif(ndepth.eq.2) then
nblock=3
jittermax=0
norder=3
elseif(ndepth.eq.1) then
nblock=1
jittermax=0
norder=3
endif
ndropmax=1
npct=nexp_decode/256
call blanker(iwave,nfft1,ndropmax,npct,c_bigfft)
single_decode=iand(nexp_decode,32).ne.0
npct=0
nb=nexp_decode/256 - 2
if(nb.ge.0) npct=nb
inb1=20
inb2=5
if(nb.eq.-1) then
inb2=5 !Try NB = 0, 5, 10, 15, 20%
else if(nb.eq.-2) then
inb2=2 !Try NB = 0, 2, 4,... 20%
else
inb1=0 !Fixed NB value, 0 to 25%
ipct(0)=npct
endif
if(iwspr.eq.1) then !FST4W
!300 Hz wide noise-fit window
nfa=max(100,nint(nfqso+1.5*baud-150))
nfb=min(4800,nint(nfqso+1.5*baud+150))
fa=max(100,nint(nfqso+1.5*baud-ntol)) ! signal search window
fb=min(4800,nint(nfqso+1.5*baud+ntol))
else if(single_decode) then
fa=max(100,nint(nfa+1.5*baud))
fb=min(4800,nint(nfb+1.5*baud))
! extend noise fit 100 Hz outside of search window
nfa=max(100,nfa-100)
nfb=min(4800,nfb+100)
else
fa=max(100,nint(nfa+1.5*baud))
fb=min(4800,nint(nfb+1.5*baud))
! extend noise fit 100 Hz outside of search window
nfa=max(100,nfa-100)
nfb=min(4800,nfb+100)
endif
ndecodes=0
decodes=' '
do inb=0,inb1,inb2
if(nb.lt.0) npct=inb
call blanker(iwave,nfft1,ndropmax,npct,c_bigfft)
! The big fft is done once and is used for calculating the smoothed spectrum
! and also for downconverting/downsampling each candidate.
call four2a(c_bigfft,nfft1,1,-1,0) !r2c
nhicoh=1
nsyncoh=8
fa=max(100,nint(nfqso+1.5*baud-ntol))
fb=min(4800,nint(nfqso+1.5*baud+ntol))
minsync=1.20
if(ntrperiod.eq.15) minsync=1.15
call four2a(c_bigfft,nfft1,1,-1,0) !r2c
nhicoh=1
nsyncoh=8
minsync=1.20
if(ntrperiod.eq.15) minsync=1.15
! Get first approximation of candidate frequencies
call get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb,nfa,nfb, &
minsync,ncand,candidates)
ndecodes=0
decodes=' '
isbest=0
fc2=0.
do icand=1,ncand
fc0=candidates(icand,1)
detmet=candidates(icand,2)
call get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb,nfa,nfb, &
minsync,ncand,candidates0)
isbest=0
fc2=0.
do icand=1,ncand
fc0=candidates0(icand,1)
if(iwspr.eq.0 .and. nb.lt.0 .and. npct.ne.0 .and. &
abs(fc0-(nfqso+1.5*baud)).gt.ntol) cycle
detmet=candidates0(icand,2)
! Downconvert and downsample a slice of the spectrum centered on the
! rough estimate of the candidates frequency.
! Output array c2 is complex baseband sampled at 12000/ndown Sa/sec.
! The size of the downsampled c2 array is nfft2=nfft1/ndown
call timer('dwnsmpl ',0)
call fst4_downsample(c_bigfft,nfft1,ndown,fc0,sigbw,c2)
call timer('dwnsmpl ',1)
call timer('dwnsmpl ',0)
call fst4_downsample(c_bigfft,nfft1,ndown,fc0,sigbw,c2)
call timer('dwnsmpl ',1)
call timer('sync240 ',0)
call fst4_sync_search(c2,nfft2,hmod,fs2,nss,ntrperiod,nsyncoh,emedelay,sbest,fcbest,isbest)
call timer('sync240 ',1)
call timer('sync240 ',0)
call fst4_sync_search(c2,nfft2,hmod,fs2,nss,ntrperiod,nsyncoh,emedelay,sbest,fcbest,isbest)
call timer('sync240 ',1)
fc_synced = fc0 + fcbest
dt_synced = (isbest-fs2)*dt2 !nominal dt is 1 second so frame starts at sample fs2
candidates(icand,3)=fc_synced
candidates(icand,4)=isbest
enddo
fc_synced = fc0 + fcbest
dt_synced = (isbest-fs2)*dt2 !nominal dt is 1 second so frame starts at sample fs2
candidates0(icand,3)=fc_synced
candidates0(icand,4)=isbest
enddo
! remove duplicate candidates
do icand=1,ncand
fc=candidates(icand,3)
isbest=nint(candidates(icand,4))
do ic2=1,ncand
fc2=candidates(ic2,3)
isbest2=nint(candidates(ic2,4))
if(ic2.ne.icand .and. fc2.gt.0.0) then
if(abs(fc2-fc).lt.0.10*baud) then ! same frequency
if(abs(isbest2-isbest).le.2) then
candidates(ic2,3)=-1
do icand=1,ncand
fc=candidates0(icand,3)
isbest=nint(candidates0(icand,4))
do ic2=icand+1,ncand
fc2=candidates0(ic2,3)
isbest2=nint(candidates0(ic2,4))
if(fc2.gt.0.0) then
if(abs(fc2-fc).lt.0.10*baud) then ! same frequency
if(abs(isbest2-isbest).le.2) then
candidates0(ic2,3)=-1
endif
endif
endif
enddo
enddo
ic=0
do icand=1,ncand
if(candidates0(icand,3).gt.0) then
ic=ic+1
candidates0(ic,:)=candidates0(icand,:)
endif
enddo
enddo
ic=0
do icand=1,ncand
if(candidates(icand,3).gt.0) then
ic=ic+1
candidates(ic,:)=candidates(icand,:)
endif
enddo
ncand=ic
xsnr=0.
!write(*,*) 'ncand ',ncand
do icand=1,ncand
sync=candidates(icand,2)
fc_synced=candidates(icand,3)
isbest=nint(candidates(icand,4))
xdt=(isbest-nspsec)/fs2
if(ntrperiod.eq.15) xdt=(isbest-real(nspsec)/2.0)/fs2
call timer('dwnsmpl ',0)
call fst4_downsample(c_bigfft,nfft1,ndown,fc_synced,sigbw,c2)
call timer('dwnsmpl ',1)
do ijitter=0,jittermax
if(ijitter.eq.0) ioffset=0
if(ijitter.eq.1) ioffset=1
if(ijitter.eq.2) ioffset=-1
is0=isbest+ioffset
if(is0.lt.0) cycle
cframe=c2(is0:is0+160*nss-1)
bitmetrics=0
call timer('bitmetrc',0)
call get_fst4_bitmetrics(cframe,nss,hmod,nblock,nhicoh,bitmetrics, &
s4,nsync_qual,badsync)
call timer('bitmetrc',1)
if(badsync) cycle
do il=1,4
llrs( 1: 60,il)=bitmetrics( 17: 76, il)
llrs( 61:120,il)=bitmetrics( 93:152, il)
llrs(121:180,il)=bitmetrics(169:228, il)
llrs(181:240,il)=bitmetrics(245:304, il)
ncand=ic
! If FST4 and Single Decode is not checked, then find candidates within
! 20 Hz of nfqso and put them at the top of the list
if(iwspr.eq.0 .and. .not.single_decode) then
nclose=count(abs(candidates0(:,3)-(nfqso+1.5*baud)).le.20)
k=0
do i=1,ncand
if(abs(candidates0(i,3)-(nfqso+1.5*baud)).le.20) then
k=k+1
candidates(k,:)=candidates0(i,:)
endif
enddo
do i=1,ncand
if(abs(candidates0(i,3)-(nfqso+1.5*baud)).gt.20) then
k=k+1
candidates(k,:)=candidates0(i,:)
endif
enddo
else
candidates=candidates0
endif
apmag=maxval(abs(llrs(:,1)))*1.1
ntmax=nblock+nappasses(nQSOProgress)
if(lapcqonly) ntmax=nblock+1
if(ndepth.eq.1) ntmax=nblock
apmask=0
xsnr=0.
do icand=1,ncand
sync=candidates(icand,2)
fc_synced=candidates(icand,3)
isbest=nint(candidates(icand,4))
xdt=(isbest-nspsec)/fs2
if(ntrperiod.eq.15) xdt=(isbest-real(nspsec)/2.0)/fs2
call timer('dwnsmpl ',0)
call fst4_downsample(c_bigfft,nfft1,ndown,fc_synced,sigbw,c2)
call timer('dwnsmpl ',1)
if(iwspr.eq.1) then ! 50-bit msgs, no ap decoding
nblock=4
ntmax=nblock
endif
do ijitter=0,jittermax
if(ijitter.eq.0) ioffset=0
if(ijitter.eq.1) ioffset=1
if(ijitter.eq.2) ioffset=-1
is0=isbest+ioffset
if(is0.lt.0) cycle
cframe=c2(is0:is0+160*nss-1)
bitmetrics=0
call timer('bitmetrc',0)
call get_fst4_bitmetrics(cframe,nss,nblock,nhicoh,bitmetrics, &
s4,nsync_qual,badsync)
call timer('bitmetrc',1)
if(badsync) cycle
do itry=1,ntmax
if(itry.eq.1) llr=llrs(:,1)
if(itry.eq.2.and.itry.le.nblock) llr=llrs(:,2)
if(itry.eq.3.and.itry.le.nblock) llr=llrs(:,3)
if(itry.eq.4.and.itry.le.nblock) llr=llrs(:,4)
if(itry.le.nblock) then
apmask=0
iaptype=0
do il=1,4
llrs( 1: 60,il)=bitmetrics( 17: 76, il)
llrs( 61:120,il)=bitmetrics( 93:152, il)
llrs(121:180,il)=bitmetrics(169:228, il)
llrs(181:240,il)=bitmetrics(245:304, il)
enddo
apmag=maxval(abs(llrs(:,1)))*1.1
ntmax=nblock+nappasses(nQSOProgress)
if(lapcqonly) ntmax=nblock+1
if(ndepth.eq.1) ntmax=nblock
apmask=0
if(iwspr.eq.1) then ! 50-bit msgs, no ap decoding
nblock=4
ntmax=nblock
endif
if(itry.gt.nblock) then ! do ap passes
llr=llrs(:,nblock) ! Use largest blocksize as the basis for AP passes
iaptype=naptypes(nQSOProgress,itry-nblock)
if(lapcqonly) iaptype=1
if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall
if(iaptype.ge.3 .and. apbits(30).gt.1) cycle ! No, or nonstandard, dxcall
if(iaptype.eq.1) then ! CQ
do itry=1,ntmax
if(itry.eq.1) llr=llrs(:,1)
if(itry.eq.2.and.itry.le.nblock) llr=llrs(:,2)
if(itry.eq.3.and.itry.le.nblock) llr=llrs(:,3)
if(itry.eq.4.and.itry.le.nblock) llr=llrs(:,4)
if(itry.le.nblock) then
apmask=0
apmask(1:29)=1
llr(1:29)=apmag*mcq(1:29)
iaptype=0
endif
if(iaptype.eq.2) then ! MyCall ??? ???
apmask=0
apmask(1:29)=1
llr(1:29)=apmag*apbits(1:29)
endif
if(itry.gt.nblock) then ! do ap passes
llr=llrs(:,nblock) ! Use largest blocksize as the basis for AP passes
iaptype=naptypes(nQSOProgress,itry-nblock)
if(lapcqonly) iaptype=1
if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall
if(iaptype.ge.3 .and. apbits(30).gt.1) cycle ! No, or nonstandard, dxcall
if(iaptype.eq.1) then ! CQ
apmask=0
apmask(1:29)=1
llr(1:29)=apmag*mcq(1:29)
endif
if(iaptype.eq.3) then ! MyCall DxCall ???
apmask=0
apmask(1:58)=1
llr(1:58)=apmag*apbits(1:58)
endif
if(iaptype.eq.2) then ! MyCall ??? ???
apmask=0
apmask(1:29)=1
llr(1:29)=apmag*apbits(1:29)
endif
if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype .eq.6) then
apmask=0
apmask(1:77)=1
llr(1:58)=apmag*apbits(1:58)
if(iaptype.eq.4) llr(59:77)=apmag*mrrr(1:19)
if(iaptype.eq.5) llr(59:77)=apmag*m73(1:19)
if(iaptype.eq.6) llr(59:77)=apmag*mrr73(1:19)
endif
endif
dmin=0.0
nharderrors=-1
unpk77_success=.false.
if(iwspr.eq.0) then
maxosd=2
Keff=91
norder=4
call timer('d240_101',0)
call decode240_101(llr,Keff,maxosd,norder,apmask,message101, &
cw,ntype,nharderrors,dmin)
call timer('d240_101',1)
elseif(iwspr.eq.1) then
maxosd=2
call timer('d240_74 ',0)
Keff=64
norder=4
call decode240_74(llr,Keff,maxosd,norder,apmask,message74,cw, &
ntype,nharderrors,dmin)
call timer('d240_74 ',1)
endif
if(nharderrors .ge.0) then
if(count(cw.eq.1).eq.0) then
nharderrors=-nharderrors
cycle
if(iaptype.eq.3) then ! MyCall DxCall ???
apmask=0
apmask(1:58)=1
llr(1:58)=apmag*apbits(1:58)
endif
if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype .eq.6) then
apmask=0
apmask(1:77)=1
llr(1:58)=apmag*apbits(1:58)
if(iaptype.eq.4) llr(59:77)=apmag*mrrr(1:19)
if(iaptype.eq.5) llr(59:77)=apmag*m73(1:19)
if(iaptype.eq.6) llr(59:77)=apmag*mrr73(1:19)
endif
endif
dmin=0.0
nharderrors=-1
unpk77_success=.false.
if(iwspr.eq.0) then
write(c77,'(77i1)') mod(message101(1:77)+rvec,2)
call unpack77(c77,1,msg,unpk77_success)
else
write(c77,'(50i1)') message74(1:50)
c77(51:77)='000000000000000000000110000'
call unpack77(c77,1,msg,unpk77_success)
maxosd=2
Keff=91
norder=3
call timer('d240_101',0)
call decode240_101(llr,Keff,maxosd,norder,apmask,message101, &
cw,ntype,nharderrors,dmin)
call timer('d240_101',1)
elseif(iwspr.eq.1) then
maxosd=2
call timer('d240_74 ',0)
Keff=64
norder=4
call decode240_74(llr,Keff,maxosd,norder,apmask,message74,cw, &
ntype,nharderrors,dmin)
call timer('d240_74 ',1)
endif
if(unpk77_success) then
idupe=0
do i=1,ndecodes
if(decodes(i).eq.msg) idupe=1
enddo
if(idupe.eq.1) goto 2002
ndecodes=ndecodes+1
decodes(ndecodes)=msg
if(nharderrors .ge.0) then
if(count(cw.eq.1).eq.0) then
nharderrors=-nharderrors
cycle
endif
if(iwspr.eq.0) then
call get_fst4_tones_from_bits(message101,itone,0)
write(c77,'(77i1)') mod(message101(1:77)+rvec,2)
call unpack77(c77,1,msg,unpk77_success)
else
call get_fst4_tones_from_bits(message74,itone,1)
write(c77,'(50i1)') message74(1:50)
c77(51:77)='000000000000000000000110000'
call unpack77(c77,1,msg,unpk77_success)
endif
inquire(file='plotspec',exist=ex)
fmid=-999.0
call timer('dopsprd ',0)
if(unpk77_success) then
idupe=0
do i=1,ndecodes
if(decodes(i).eq.msg) idupe=1
enddo
if(idupe.eq.1) goto 800
ndecodes=ndecodes+1
decodes(ndecodes)=msg
if(iwspr.eq.0) then
call get_fst4_tones_from_bits(message101,itone,0)
else
call get_fst4_tones_from_bits(message74,itone,1)
endif
inquire(file='plotspec',exist=ex)
fmid=-999.0
call timer('dopsprd ',0)
if(ex) then
call dopspread(itone,iwave,nsps,nmax,ndown,hmod, &
isbest,fc_synced,fmid,w50)
endif
call timer('dopsprd ',1)
xsig=0
do i=1,NN
xsig=xsig+s4(itone(i),i)
enddo
base=candidates(icand,5)
arg=600.0*(xsig/base)-1.0
if(arg.gt.0.0) then
xsnr=10*log10(arg)-35.5-12.5*log10(nsps/8200.0)
if(ntrperiod.eq. 15) xsnr=xsnr+2
if(ntrperiod.eq. 30) xsnr=xsnr+1
if(ntrperiod.eq. 900) xsnr=xsnr+1
if(ntrperiod.eq.1800) xsnr=xsnr+2
else
xsnr=-99.9
endif
else
cycle
endif
nsnr=nint(xsnr)
qual=0.
fsig=fc_synced - 1.5*baud
if(ex) then
call dopspread(itone,iwave,nsps,nmax,ndown,hmod, &
isbest,fc_synced,fmid,w50)
write(21,3021) nutc,icand,itry,nsyncoh,iaptype, &
ijitter,ntype,nsync_qual,nharderrors,dmin, &
sync,xsnr,xdt,fsig,w50,trim(msg)
3021 format(i6.6,6i3,2i4,f6.1,f7.2,f6.1,f6.2,f7.1,f7.3,1x,a)
flush(21)
endif
call timer('dopsprd ',1)
xsig=0
do i=1,NN
xsig=xsig+s4(itone(i),i)
enddo
base=candidates(icand,5)
arg=600.0*(xsig/base)-1.0
if(arg.gt.0.0) then
xsnr=10*log10(arg)-35.5-12.5*log10(nsps/8200.0)
if(ntrperiod.eq. 15) xsnr=xsnr+2
if(ntrperiod.eq. 30) xsnr=xsnr+1
if(ntrperiod.eq. 900) xsnr=xsnr+1
if(ntrperiod.eq.1800) xsnr=xsnr+2
else
xsnr=-99.9
endif
else
cycle
call this%callback(nutc,smax1,nsnr,xdt,fsig,msg, &
iaptype,qual,ntrperiod,lwspr,fmid,w50)
if(iwspr.eq.0 .and. nb.lt.0) go to 900
goto 800
endif
nsnr=nint(xsnr)
qual=0.
fsig=fc_synced - 1.5*baud
if(ex) then
write(21,3021) nutc,icand,itry,nsyncoh,iaptype, &
ijitter,ntype,nsync_qual,nharderrors,dmin, &
sync,xsnr,xdt,fsig,w50,trim(msg)
3021 format(i6.6,6i3,2i4,f6.1,f7.2,f6.1,f6.2,f7.1,f7.3,1x,a)
flush(21)
endif
call this%callback(nutc,smax1,nsnr,xdt,fsig,msg, &
iaptype,qual,ntrperiod,lwspr,fmid,w50)
goto 2002
endif
enddo ! metrics
enddo ! istart jitter
2002 enddo !candidate list
return
end subroutine decode
enddo ! metrics
enddo ! istart jitter
800 enddo !candidate list
enddo ! noise blanker loop
900 return
end subroutine decode
subroutine sync_fst4(cd0,i0,f0,hmod,ncoh,np,nss,ntr,fs,sync)
@ -652,6 +705,7 @@ contains
inb=nint(min(4800.0,real(nfb))/df2) !High freq limit for noise fit
if(ia.lt.ina) ia=ina
if(ib.gt.inb) ib=inb
nnw=nint(48000.*nsps*2./fs)
allocate (s(nnw))
s=0. !Compute low-resolution power spectrum

View File

@ -1,7 +1,7 @@
subroutine foxgen_wrap(msg40,msgbits,itone)
parameter (NN=79,ND=58,KK=77,NSPS=4*1920)
parameter (NWAVE=(160+2)*134400) !the biggest waveform we generate (FST4-1800)
parameter (NWAVE=(160+2)*134400*4) !the biggest waveform we generate (FST4-1800)
character*40 msg40,cmsg
character*12 mycall12

View File

@ -108,7 +108,7 @@ int main(int argc, char *argv[])
// Multiple instances communicate with jt9 via this
QSharedMemory mem_jt9;
ExceptionCatchingApplication a(argc, argv);
QApplication a(argc, argv);
try
{
// qDebug () << "+++++++++++++++++++++++++++ Resources ++++++++++++++++++++++++++++";

View File

@ -48,7 +48,7 @@ namespace
{136000, Modes::WSPR, IARURegions::ALL},
{136000, Modes::FST4, IARURegions::ALL},
{136000, Modes::FST4W, IARURegions::ALL},
{136130, Modes::JT9, IARURegions::ALL},
{136000, Modes::JT9, IARURegions::ALL},
{474200, Modes::JT9, IARURegions::ALL},
{474200, Modes::FST4, IARURegions::ALL},

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -422,22 +422,22 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1712"/>
<location filename="../Configuration.cpp" line="1718"/>
<source>Serial Port:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1713"/>
<location filename="../Configuration.cpp" line="1719"/>
<source>Serial port used for CAT control</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1720"/>
<location filename="../Configuration.cpp" line="1726"/>
<source>Network Server:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1721"/>
<location filename="../Configuration.cpp" line="1727"/>
<source>Optional hostname and port of network service.
Leave blank for a sensible default on this machine.
Formats:
@ -447,12 +447,12 @@ Formats:
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1733"/>
<location filename="../Configuration.cpp" line="1739"/>
<source>USB Device:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1734"/>
<location filename="../Configuration.cpp" line="1740"/>
<source>Optional device identification.
Leave blank for a sensible default for the rig.
Format:
@ -460,153 +460,153 @@ Format:
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1770"/>
<location filename="../Configuration.cpp" line="1778"/>
<location filename="../Configuration.cpp" line="1776"/>
<location filename="../Configuration.cpp" line="1784"/>
<source>Invalid audio input device</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1786"/>
<location filename="../Configuration.cpp" line="1792"/>
<source>Invalid audio output device</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1792"/>
<location filename="../Configuration.cpp" line="1798"/>
<source>Invalid PTT method</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1802"/>
<location filename="../Configuration.cpp" line="1808"/>
<source>Invalid PTT port</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1810"/>
<location filename="../Configuration.cpp" line="1819"/>
<location filename="../Configuration.cpp" line="1816"/>
<location filename="../Configuration.cpp" line="1825"/>
<source>Invalid Contest Exchange</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1811"/>
<location filename="../Configuration.cpp" line="1817"/>
<source>You must input a valid ARRL Field Day exchange</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1820"/>
<location filename="../Configuration.cpp" line="1826"/>
<source>You must input a valid ARRL RTTY Roundup exchange</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2118"/>
<location filename="../Configuration.cpp" line="2126"/>
<source>Reset Decode Highlighting</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2119"/>
<location filename="../Configuration.cpp" line="2127"/>
<source>Reset all decode highlighting and priorities to default values</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2139"/>
<location filename="../Configuration.cpp" line="2147"/>
<source>WSJT-X Decoded Text Font Chooser</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2306"/>
<location filename="../Configuration.cpp" line="2314"/>
<source>Load Working Frequencies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2306"/>
<location filename="../Configuration.cpp" line="2325"/>
<location filename="../Configuration.cpp" line="2371"/>
<location filename="../Configuration.cpp" line="2314"/>
<location filename="../Configuration.cpp" line="2333"/>
<location filename="../Configuration.cpp" line="2379"/>
<source>Frequency files (*.qrg);;All files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2313"/>
<location filename="../Configuration.cpp" line="2321"/>
<source>Replace Working Frequencies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2314"/>
<location filename="../Configuration.cpp" line="2322"/>
<source>Are you sure you want to discard your current working frequencies and replace them with the loaded ones?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2325"/>
<location filename="../Configuration.cpp" line="2333"/>
<source>Merge Working Frequencies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2342"/>
<location filename="../Configuration.cpp" line="2351"/>
<location filename="../Configuration.cpp" line="2361"/>
<location filename="../Configuration.cpp" line="2350"/>
<location filename="../Configuration.cpp" line="2359"/>
<location filename="../Configuration.cpp" line="2369"/>
<source>Not a valid frequencies file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2342"/>
<location filename="../Configuration.cpp" line="2350"/>
<source>Incorrect file magic</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2351"/>
<location filename="../Configuration.cpp" line="2359"/>
<source>Version is too new</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2361"/>
<location filename="../Configuration.cpp" line="2369"/>
<source>Contents corrupt</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2371"/>
<location filename="../Configuration.cpp" line="2379"/>
<source>Save Working Frequencies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2380"/>
<location filename="../Configuration.cpp" line="2388"/>
<source>Only Save Selected Working Frequencies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2381"/>
<location filename="../Configuration.cpp" line="2389"/>
<source>Are you sure you want to save only the working frequencies that are currently selected? Click No to save all.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2397"/>
<location filename="../Configuration.cpp" line="2405"/>
<source>Reset Working Frequencies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2398"/>
<location filename="../Configuration.cpp" line="2406"/>
<source>Are you sure you want to discard your current working frequencies and replace them with default ones?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2436"/>
<location filename="../Configuration.cpp" line="2444"/>
<source>Save Directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2450"/>
<location filename="../Configuration.cpp" line="2458"/>
<source>AzEl Directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2510"/>
<location filename="../Configuration.cpp" line="2518"/>
<source>Rig control error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2511"/>
<location filename="../Configuration.cpp" line="2519"/>
<source>Failed to open connection to rig</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2729"/>
<location filename="../Configuration.cpp" line="2737"/>
<source>Rig failure</source>
<translation type="unfinished"></translation>
</message>
@ -2028,13 +2028,13 @@ Error(%2): %3</source>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="50"/>
<location filename="../widgets/mainwindow.cpp" line="5887"/>
<location filename="../widgets/mainwindow.cpp" line="5961"/>
<location filename="../widgets/mainwindow.cpp" line="6009"/>
<location filename="../widgets/mainwindow.cpp" line="6171"/>
<location filename="../widgets/mainwindow.cpp" line="6211"/>
<location filename="../widgets/mainwindow.cpp" line="6259"/>
<location filename="../widgets/mainwindow.cpp" line="6388"/>
<location filename="../widgets/mainwindow.cpp" line="5902"/>
<location filename="../widgets/mainwindow.cpp" line="5983"/>
<location filename="../widgets/mainwindow.cpp" line="6031"/>
<location filename="../widgets/mainwindow.cpp" line="6193"/>
<location filename="../widgets/mainwindow.cpp" line="6233"/>
<location filename="../widgets/mainwindow.cpp" line="6281"/>
<location filename="../widgets/mainwindow.cpp" line="6410"/>
<source>Band Activity</source>
<translation type="unfinished"></translation>
</message>
@ -2046,12 +2046,12 @@ Error(%2): %3</source>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="194"/>
<location filename="../widgets/mainwindow.cpp" line="5888"/>
<location filename="../widgets/mainwindow.cpp" line="5960"/>
<location filename="../widgets/mainwindow.cpp" line="6004"/>
<location filename="../widgets/mainwindow.cpp" line="6172"/>
<location filename="../widgets/mainwindow.cpp" line="6212"/>
<location filename="../widgets/mainwindow.cpp" line="6260"/>
<location filename="../widgets/mainwindow.cpp" line="5903"/>
<location filename="../widgets/mainwindow.cpp" line="5982"/>
<location filename="../widgets/mainwindow.cpp" line="6026"/>
<location filename="../widgets/mainwindow.cpp" line="6194"/>
<location filename="../widgets/mainwindow.cpp" line="6234"/>
<location filename="../widgets/mainwindow.cpp" line="6282"/>
<source>Rx Frequency</source>
<translation type="unfinished"></translation>
</message>
@ -2630,7 +2630,7 @@ Not available to nonstandard callsign holders.</source>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="986"/>
<location filename="../widgets/mainwindow.cpp" line="6031"/>
<location filename="../widgets/mainwindow.cpp" line="6053"/>
<source>Fox</source>
<translation type="unfinished"></translation>
</message>
@ -3100,10 +3100,10 @@ list. The list can be maintained in Settings (F2).</source>
<location filename="../widgets/mainwindow.ui" line="1732"/>
<location filename="../widgets/mainwindow.ui" line="1739"/>
<location filename="../widgets/mainwindow.ui" line="1959"/>
<location filename="../widgets/mainwindow.cpp" line="1240"/>
<location filename="../widgets/mainwindow.cpp" line="5645"/>
<location filename="../widgets/mainwindow.cpp" line="6544"/>
<location filename="../widgets/mainwindow.cpp" line="7965"/>
<location filename="../widgets/mainwindow.cpp" line="1247"/>
<location filename="../widgets/mainwindow.cpp" line="5656"/>
<location filename="../widgets/mainwindow.cpp" line="6568"/>
<location filename="../widgets/mainwindow.cpp" line="7990"/>
<source>Random</source>
<translation type="unfinished"></translation>
</message>
@ -3339,7 +3339,7 @@ list. The list can be maintained in Settings (F2).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="8271"/>
<location filename="../widgets/mainwindow.cpp" line="8296"/>
<source>Runaway Tx watchdog</source>
<translation type="unfinished"></translation>
</message>
@ -3571,8 +3571,8 @@ list. The list can be maintained in Settings (F2).</source>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="336"/>
<location filename="../widgets/mainwindow.cpp" line="4281"/>
<location filename="../widgets/mainwindow.cpp" line="7742"/>
<location filename="../widgets/mainwindow.cpp" line="4292"/>
<location filename="../widgets/mainwindow.cpp" line="7767"/>
<source>Receiving</source>
<translation type="unfinished"></translation>
</message>
@ -3587,198 +3587,203 @@ list. The list can be maintained in Settings (F2).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="484"/>
<location filename="../widgets/mainwindow.cpp" line="485"/>
<source>Audio Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="485"/>
<location filename="../widgets/mainwindow.cpp" line="486"/>
<source>Reduce system load</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="486"/>
<source>Excessive dropped samples - %1 (%2 sec) audio frames dropped</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="517"/>
<source>Error Scanning ADIF Log</source>
<location filename="../widgets/mainwindow.cpp" line="487"/>
<source>Excessive dropped samples - %1 (%2 sec) audio frames dropped in period starting %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="521"/>
<source>Error Scanning ADIF Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="525"/>
<source>Scanned ADIF log, %1 worked before records created</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="631"/>
<location filename="../widgets/mainwindow.cpp" line="635"/>
<source>Error Loading LotW Users Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="750"/>
<location filename="../widgets/mainwindow.cpp" line="754"/>
<source>Error Writing WAV File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="793"/>
<location filename="../widgets/mainwindow.cpp" line="785"/>
<source>Enumerating audio devices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="800"/>
<source>Configurations...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="862"/>
<location filename="../widgets/mainwindow.cpp" line="5956"/>
<location filename="../widgets/mainwindow.cpp" line="5962"/>
<location filename="../widgets/mainwindow.cpp" line="6000"/>
<location filename="../widgets/mainwindow.cpp" line="6010"/>
<location filename="../widgets/mainwindow.cpp" line="6107"/>
<location filename="../widgets/mainwindow.cpp" line="6108"/>
<location filename="../widgets/mainwindow.cpp" line="6157"/>
<location filename="../widgets/mainwindow.cpp" line="6158"/>
<location filename="../widgets/mainwindow.cpp" line="6164"/>
<location filename="../widgets/mainwindow.cpp" line="6165"/>
<location filename="../widgets/mainwindow.cpp" line="6213"/>
<location filename="../widgets/mainwindow.cpp" line="6214"/>
<location filename="../widgets/mainwindow.cpp" line="6383"/>
<location filename="../widgets/mainwindow.cpp" line="6384"/>
<location filename="../widgets/mainwindow.cpp" line="7424"/>
<location filename="../widgets/mainwindow.cpp" line="7427"/>
<location filename="../widgets/mainwindow.cpp" line="7432"/>
<location filename="../widgets/mainwindow.cpp" line="7435"/>
<location filename="../widgets/mainwindow.cpp" line="869"/>
<location filename="../widgets/mainwindow.cpp" line="5978"/>
<location filename="../widgets/mainwindow.cpp" line="5984"/>
<location filename="../widgets/mainwindow.cpp" line="6022"/>
<location filename="../widgets/mainwindow.cpp" line="6032"/>
<location filename="../widgets/mainwindow.cpp" line="6129"/>
<location filename="../widgets/mainwindow.cpp" line="6130"/>
<location filename="../widgets/mainwindow.cpp" line="6179"/>
<location filename="../widgets/mainwindow.cpp" line="6180"/>
<location filename="../widgets/mainwindow.cpp" line="6186"/>
<location filename="../widgets/mainwindow.cpp" line="6187"/>
<location filename="../widgets/mainwindow.cpp" line="6235"/>
<location filename="../widgets/mainwindow.cpp" line="6236"/>
<location filename="../widgets/mainwindow.cpp" line="6405"/>
<location filename="../widgets/mainwindow.cpp" line="6406"/>
<location filename="../widgets/mainwindow.cpp" line="7449"/>
<location filename="../widgets/mainwindow.cpp" line="7452"/>
<location filename="../widgets/mainwindow.cpp" line="7457"/>
<location filename="../widgets/mainwindow.cpp" line="7460"/>
<source>Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="876"/>
<location filename="../widgets/mainwindow.cpp" line="883"/>
<source>Error Killing jt9.exe Process</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="877"/>
<location filename="../widgets/mainwindow.cpp" line="884"/>
<source>KillByName return code: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="892"/>
<location filename="../widgets/mainwindow.cpp" line="899"/>
<source>Error removing &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="893"/>
<location filename="../widgets/mainwindow.cpp" line="900"/>
<source>Click OK to retry</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1296"/>
<location filename="../widgets/mainwindow.cpp" line="6357"/>
<location filename="../widgets/mainwindow.cpp" line="1303"/>
<location filename="../widgets/mainwindow.cpp" line="6379"/>
<source>Improper mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1466"/>
<location filename="../widgets/mainwindow.cpp" line="8917"/>
<location filename="../widgets/mainwindow.cpp" line="1473"/>
<location filename="../widgets/mainwindow.cpp" line="8942"/>
<source>File Open Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1467"/>
<location filename="../widgets/mainwindow.cpp" line="7871"/>
<location filename="../widgets/mainwindow.cpp" line="8351"/>
<location filename="../widgets/mainwindow.cpp" line="8918"/>
<location filename="../widgets/mainwindow.cpp" line="9050"/>
<location filename="../widgets/mainwindow.cpp" line="1474"/>
<location filename="../widgets/mainwindow.cpp" line="7896"/>
<location filename="../widgets/mainwindow.cpp" line="8376"/>
<location filename="../widgets/mainwindow.cpp" line="8943"/>
<location filename="../widgets/mainwindow.cpp" line="9075"/>
<source>Cannot open &quot;%1&quot; for append: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1570"/>
<location filename="../widgets/mainwindow.cpp" line="1577"/>
<source>Error saving c2 file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1770"/>
<location filename="../widgets/mainwindow.cpp" line="1777"/>
<source>Error in Sound Input</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1776"/>
<location filename="../widgets/mainwindow.cpp" line="1783"/>
<source>Error in Sound Output</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1840"/>
<location filename="../widgets/mainwindow.cpp" line="6105"/>
<location filename="../widgets/mainwindow.cpp" line="6255"/>
<location filename="../widgets/mainwindow.cpp" line="1847"/>
<location filename="../widgets/mainwindow.cpp" line="6127"/>
<location filename="../widgets/mainwindow.cpp" line="6277"/>
<source>Single-Period Decodes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1841"/>
<location filename="../widgets/mainwindow.cpp" line="6106"/>
<location filename="../widgets/mainwindow.cpp" line="6256"/>
<location filename="../widgets/mainwindow.cpp" line="1848"/>
<location filename="../widgets/mainwindow.cpp" line="6128"/>
<location filename="../widgets/mainwindow.cpp" line="6278"/>
<source>Average Decodes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2135"/>
<location filename="../widgets/mainwindow.cpp" line="2142"/>
<source>Change Operator</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2135"/>
<location filename="../widgets/mainwindow.cpp" line="2142"/>
<source>New operator:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2251"/>
<location filename="../widgets/mainwindow.cpp" line="2258"/>
<source>Status File Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2252"/>
<location filename="../widgets/mainwindow.cpp" line="5506"/>
<location filename="../widgets/mainwindow.cpp" line="2259"/>
<location filename="../widgets/mainwindow.cpp" line="5517"/>
<source>Cannot open &quot;%1&quot; for writing: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2387"/>
<location filename="../widgets/mainwindow.cpp" line="2394"/>
<source>Subprocess Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2388"/>
<location filename="../widgets/mainwindow.cpp" line="2395"/>
<source>Subprocess failed with exit code %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2390"/>
<location filename="../widgets/mainwindow.cpp" line="2410"/>
<location filename="../widgets/mainwindow.cpp" line="2397"/>
<location filename="../widgets/mainwindow.cpp" line="2417"/>
<source>Running: %1
%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2409"/>
<location filename="../widgets/mainwindow.cpp" line="2416"/>
<source>Subprocess error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2447"/>
<location filename="../widgets/mainwindow.cpp" line="2454"/>
<source>Reference spectrum saved</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2510"/>
<location filename="../widgets/mainwindow.cpp" line="2517"/>
<source>Invalid data in fmt.all at line %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2516"/>
<location filename="../widgets/mainwindow.cpp" line="2523"/>
<source>Good Calibration Solution</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2517"/>
<location filename="../widgets/mainwindow.cpp" line="2524"/>
<source>&lt;pre&gt;%1%L2 ±%L3 ppm
%4%L5 ±%L6 Hz
@ -3787,44 +3792,44 @@ list. The list can be maintained in Settings (F2).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2531"/>
<location filename="../widgets/mainwindow.cpp" line="2538"/>
<source>Delete Calibration Measurements</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2532"/>
<location filename="../widgets/mainwindow.cpp" line="2539"/>
<source>The &quot;fmt.all&quot; file will be renamed as &quot;fmt.bak&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2544"/>
<location filename="../widgets/mainwindow.cpp" line="2551"/>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2812"/>
<location filename="../widgets/mainwindow.cpp" line="2819"/>
<source>No data read from disk. Wrong file format?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2819"/>
<location filename="../widgets/mainwindow.cpp" line="2826"/>
<source>Confirm Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2820"/>
<location filename="../widgets/mainwindow.cpp" line="2827"/>
<source>Are you sure you want to delete all *.wav and *.c2 files in &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2857"/>
<location filename="../widgets/mainwindow.cpp" line="2864"/>
<source>Keyboard Shortcuts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2859"/>
<location filename="../widgets/mainwindow.cpp" line="2866"/>
<source>&lt;table cellspacing=1&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Esc &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Stop Tx, abort QSO, clear next-call queue&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;F1 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Online User&apos;s Guide (Alt: transmit Tx6)&lt;/td&gt;&lt;/tr&gt;
@ -3836,7 +3841,7 @@ list. The list can be maintained in Settings (F2).</source>
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Alt+F4 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Exit program&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;F5 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Display special mouse commands (Alt: transmit Tx5)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;F6 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Open next file in directory (Alt: toggle &quot;Call 1st&quot;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Shift+F6 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Decode all remaining files in directrory&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Shift+F6 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Decode all remaining files in directory&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;F7 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Display Message Averaging window&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;F11 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Move Rx frequency down 1 Hz&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Ctrl+F11 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Move identical Rx and Tx frequencies down 1 Hz&lt;/td&gt;&lt;/tr&gt;
@ -3874,12 +3879,12 @@ list. The list can be maintained in Settings (F2).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2915"/>
<location filename="../widgets/mainwindow.cpp" line="2922"/>
<source>Special Mouse Commands</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2917"/>
<location filename="../widgets/mainwindow.cpp" line="2924"/>
<source>&lt;table cellpadding=5&gt;
&lt;tr&gt;
&lt;th align=&quot;right&quot;&gt;Click on&lt;/th&gt;
@ -3915,42 +3920,42 @@ list. The list can be maintained in Settings (F2).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3254"/>
<location filename="../widgets/mainwindow.cpp" line="3265"/>
<source>No more files to open.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3612"/>
<location filename="../widgets/mainwindow.cpp" line="3623"/>
<source>Spotting to PSK Reporter unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3770"/>
<location filename="../widgets/mainwindow.cpp" line="3781"/>
<source>Please choose another Tx frequency. WSJT-X will not knowingly transmit another mode in the WSPR sub-band on 30m.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3774"/>
<location filename="../widgets/mainwindow.cpp" line="3785"/>
<source>WSPR Guard Band</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3787"/>
<location filename="../widgets/mainwindow.cpp" line="3798"/>
<source>Please choose another dial frequency. WSJT-X will not operate in Fox mode in the standard FT8 sub-bands.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3791"/>
<location filename="../widgets/mainwindow.cpp" line="3802"/>
<source>Fox Mode warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="4385"/>
<location filename="../widgets/mainwindow.cpp" line="4396"/>
<source>Last Tx: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="4791"/>
<location filename="../widgets/mainwindow.cpp" line="4802"/>
<source>Should you switch to EU VHF Contest mode?
To do so, check &apos;Special operating activity&apos; and
@ -3958,176 +3963,176 @@ To do so, check &apos;Special operating activity&apos; and
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="4810"/>
<location filename="../widgets/mainwindow.cpp" line="4821"/>
<source>Should you switch to ARRL Field Day mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="4815"/>
<location filename="../widgets/mainwindow.cpp" line="4826"/>
<source>Should you switch to RTTY contest mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5467"/>
<location filename="../widgets/mainwindow.cpp" line="5486"/>
<location filename="../widgets/mainwindow.cpp" line="5505"/>
<location filename="../widgets/mainwindow.cpp" line="5531"/>
<location filename="../widgets/mainwindow.cpp" line="5478"/>
<location filename="../widgets/mainwindow.cpp" line="5497"/>
<location filename="../widgets/mainwindow.cpp" line="5516"/>
<location filename="../widgets/mainwindow.cpp" line="5542"/>
<source>Add to CALL3.TXT</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5468"/>
<location filename="../widgets/mainwindow.cpp" line="5479"/>
<source>Please enter a valid grid locator</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5487"/>
<location filename="../widgets/mainwindow.cpp" line="5498"/>
<source>Cannot open &quot;%1&quot; for read/write: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5529"/>
<location filename="../widgets/mainwindow.cpp" line="5540"/>
<source>%1
is already in CALL3.TXT, do you wish to replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5712"/>
<location filename="../widgets/mainwindow.cpp" line="5723"/>
<source>Warning: DX Call field is empty.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5769"/>
<location filename="../widgets/mainwindow.cpp" line="5780"/>
<source>Log file error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5770"/>
<location filename="../widgets/mainwindow.cpp" line="5781"/>
<source>Cannot open &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5786"/>
<location filename="../widgets/mainwindow.cpp" line="5797"/>
<source>Error sending log to N1MM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5787"/>
<location filename="../widgets/mainwindow.cpp" line="5798"/>
<source>Write returned &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6006"/>
<location filename="../widgets/mainwindow.cpp" line="6028"/>
<source>Stations calling DXpedition %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6041"/>
<location filename="../widgets/mainwindow.cpp" line="6063"/>
<source>Hound</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6389"/>
<location filename="../widgets/mainwindow.cpp" line="6411"/>
<source>Tx Messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6633"/>
<location filename="../widgets/mainwindow.cpp" line="6666"/>
<location filename="../widgets/mainwindow.cpp" line="6676"/>
<location filename="../widgets/mainwindow.cpp" line="6657"/>
<location filename="../widgets/mainwindow.cpp" line="6690"/>
<location filename="../widgets/mainwindow.cpp" line="6700"/>
<source>Confirm Erase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6634"/>
<location filename="../widgets/mainwindow.cpp" line="6658"/>
<source>Are you sure you want to erase file ALL.TXT?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6644"/>
<location filename="../widgets/mainwindow.cpp" line="8396"/>
<location filename="../widgets/mainwindow.cpp" line="6668"/>
<location filename="../widgets/mainwindow.cpp" line="8421"/>
<source>Confirm Reset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6645"/>
<location filename="../widgets/mainwindow.cpp" line="6669"/>
<source>Are you sure you want to erase your contest log?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6646"/>
<location filename="../widgets/mainwindow.cpp" line="6670"/>
<source>Doing this will remove all QSO records for the current contest. They will be kept in the ADIF log file but will not be available for export in your Cabrillo log.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6659"/>
<location filename="../widgets/mainwindow.cpp" line="6683"/>
<source>Cabrillo Log saved</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6667"/>
<location filename="../widgets/mainwindow.cpp" line="6691"/>
<source>Are you sure you want to erase file wsjtx_log.adi?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6677"/>
<location filename="../widgets/mainwindow.cpp" line="6701"/>
<source>Are you sure you want to erase the WSPR hashtable?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="7264"/>
<location filename="../widgets/mainwindow.cpp" line="7289"/>
<source>Tune digital gain </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="7266"/>
<location filename="../widgets/mainwindow.cpp" line="7291"/>
<source>Transmit digital gain </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="7285"/>
<location filename="../widgets/mainwindow.cpp" line="7310"/>
<source>Prefixes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="7709"/>
<location filename="../widgets/mainwindow.cpp" line="7734"/>
<source>Network Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="7710"/>
<location filename="../widgets/mainwindow.cpp" line="7735"/>
<source>Error: %1
UDP server %2:%3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="7870"/>
<location filename="../widgets/mainwindow.cpp" line="7895"/>
<source>File Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="8149"/>
<location filename="../widgets/mainwindow.cpp" line="8174"/>
<source>Phase Training Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="8152"/>
<location filename="../widgets/mainwindow.cpp" line="8177"/>
<source>Phase Training Enabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="8286"/>
<location filename="../widgets/mainwindow.cpp" line="8311"/>
<source>WD:%1m</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="8354"/>
<location filename="../widgets/mainwindow.cpp" line="9053"/>
<location filename="../widgets/mainwindow.cpp" line="8379"/>
<location filename="../widgets/mainwindow.cpp" line="9078"/>
<source>Log File Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="8397"/>
<location filename="../widgets/mainwindow.cpp" line="8422"/>
<source>Are you sure you want to clear the QSO queues?</source>
<translation type="unfinished"></translation>
</message>
@ -4460,67 +4465,67 @@ Error(%2): %3</source>
<context>
<name>SoundInput</name>
<message>
<location filename="../Audio/soundin.cpp" line="21"/>
<location filename="../Audio/soundin.cpp" line="23"/>
<source>An error opening the audio input device has occurred.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="25"/>
<location filename="../Audio/soundin.cpp" line="27"/>
<source>An error occurred during read from the audio input device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="29"/>
<location filename="../Audio/soundin.cpp" line="31"/>
<source>Audio data not being fed to the audio input device fast enough.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="33"/>
<location filename="../Audio/soundin.cpp" line="35"/>
<source>Non-recoverable error, audio input device not usable at this time.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="63"/>
<location filename="../Audio/soundin.cpp" line="65"/>
<source>Requested input audio format is not valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="69"/>
<location filename="../Audio/soundin.cpp" line="71"/>
<source>Requested input audio format is not supported on device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="99"/>
<location filename="../Audio/soundin.cpp" line="101"/>
<source>Failed to initialize audio sink device</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="134"/>
<location filename="../Audio/soundin.cpp" line="136"/>
<source>Idle</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="139"/>
<location filename="../Audio/soundin.cpp" line="141"/>
<source>Receiving</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="143"/>
<location filename="../Audio/soundin.cpp" line="145"/>
<source>Suspended</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="148"/>
<location filename="../Audio/soundin.cpp" line="150"/>
<source>Interrupted</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="155"/>
<location filename="../Audio/soundin.cpp" line="157"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="159"/>
<location filename="../Audio/soundin.cpp" line="161"/>
<source>Stopped</source>
<translation type="unfinished"></translation>
</message>

View File

@ -422,22 +422,22 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1712"/>
<location filename="../Configuration.cpp" line="1718"/>
<source>Serial Port:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1713"/>
<location filename="../Configuration.cpp" line="1719"/>
<source>Serial port used for CAT control</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1720"/>
<location filename="../Configuration.cpp" line="1726"/>
<source>Network Server:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1721"/>
<location filename="../Configuration.cpp" line="1727"/>
<source>Optional hostname and port of network service.
Leave blank for a sensible default on this machine.
Formats:
@ -447,12 +447,12 @@ Formats:
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1733"/>
<location filename="../Configuration.cpp" line="1739"/>
<source>USB Device:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1734"/>
<location filename="../Configuration.cpp" line="1740"/>
<source>Optional device identification.
Leave blank for a sensible default for the rig.
Format:
@ -460,153 +460,153 @@ Format:
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1770"/>
<location filename="../Configuration.cpp" line="1778"/>
<location filename="../Configuration.cpp" line="1776"/>
<location filename="../Configuration.cpp" line="1784"/>
<source>Invalid audio input device</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1786"/>
<location filename="../Configuration.cpp" line="1792"/>
<source>Invalid audio output device</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1792"/>
<location filename="../Configuration.cpp" line="1798"/>
<source>Invalid PTT method</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1802"/>
<location filename="../Configuration.cpp" line="1808"/>
<source>Invalid PTT port</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1810"/>
<location filename="../Configuration.cpp" line="1819"/>
<location filename="../Configuration.cpp" line="1816"/>
<location filename="../Configuration.cpp" line="1825"/>
<source>Invalid Contest Exchange</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1811"/>
<location filename="../Configuration.cpp" line="1817"/>
<source>You must input a valid ARRL Field Day exchange</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="1820"/>
<location filename="../Configuration.cpp" line="1826"/>
<source>You must input a valid ARRL RTTY Roundup exchange</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2118"/>
<location filename="../Configuration.cpp" line="2126"/>
<source>Reset Decode Highlighting</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2119"/>
<location filename="../Configuration.cpp" line="2127"/>
<source>Reset all decode highlighting and priorities to default values</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2139"/>
<location filename="../Configuration.cpp" line="2147"/>
<source>WSJT-X Decoded Text Font Chooser</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2306"/>
<location filename="../Configuration.cpp" line="2314"/>
<source>Load Working Frequencies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2306"/>
<location filename="../Configuration.cpp" line="2325"/>
<location filename="../Configuration.cpp" line="2371"/>
<location filename="../Configuration.cpp" line="2314"/>
<location filename="../Configuration.cpp" line="2333"/>
<location filename="../Configuration.cpp" line="2379"/>
<source>Frequency files (*.qrg);;All files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2313"/>
<location filename="../Configuration.cpp" line="2321"/>
<source>Replace Working Frequencies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2314"/>
<location filename="../Configuration.cpp" line="2322"/>
<source>Are you sure you want to discard your current working frequencies and replace them with the loaded ones?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2325"/>
<location filename="../Configuration.cpp" line="2333"/>
<source>Merge Working Frequencies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2342"/>
<location filename="../Configuration.cpp" line="2351"/>
<location filename="../Configuration.cpp" line="2361"/>
<location filename="../Configuration.cpp" line="2350"/>
<location filename="../Configuration.cpp" line="2359"/>
<location filename="../Configuration.cpp" line="2369"/>
<source>Not a valid frequencies file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2342"/>
<location filename="../Configuration.cpp" line="2350"/>
<source>Incorrect file magic</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2351"/>
<location filename="../Configuration.cpp" line="2359"/>
<source>Version is too new</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2361"/>
<location filename="../Configuration.cpp" line="2369"/>
<source>Contents corrupt</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2371"/>
<location filename="../Configuration.cpp" line="2379"/>
<source>Save Working Frequencies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2380"/>
<location filename="../Configuration.cpp" line="2388"/>
<source>Only Save Selected Working Frequencies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2381"/>
<location filename="../Configuration.cpp" line="2389"/>
<source>Are you sure you want to save only the working frequencies that are currently selected? Click No to save all.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2397"/>
<location filename="../Configuration.cpp" line="2405"/>
<source>Reset Working Frequencies</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2398"/>
<location filename="../Configuration.cpp" line="2406"/>
<source>Are you sure you want to discard your current working frequencies and replace them with default ones?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2436"/>
<location filename="../Configuration.cpp" line="2444"/>
<source>Save Directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2450"/>
<location filename="../Configuration.cpp" line="2458"/>
<source>AzEl Directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2510"/>
<location filename="../Configuration.cpp" line="2518"/>
<source>Rig control error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2511"/>
<location filename="../Configuration.cpp" line="2519"/>
<source>Failed to open connection to rig</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Configuration.cpp" line="2729"/>
<location filename="../Configuration.cpp" line="2737"/>
<source>Rig failure</source>
<translation type="unfinished"></translation>
</message>
@ -2028,13 +2028,13 @@ Error(%2): %3</source>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="50"/>
<location filename="../widgets/mainwindow.cpp" line="5887"/>
<location filename="../widgets/mainwindow.cpp" line="5961"/>
<location filename="../widgets/mainwindow.cpp" line="6009"/>
<location filename="../widgets/mainwindow.cpp" line="6171"/>
<location filename="../widgets/mainwindow.cpp" line="6211"/>
<location filename="../widgets/mainwindow.cpp" line="6259"/>
<location filename="../widgets/mainwindow.cpp" line="6388"/>
<location filename="../widgets/mainwindow.cpp" line="5902"/>
<location filename="../widgets/mainwindow.cpp" line="5983"/>
<location filename="../widgets/mainwindow.cpp" line="6031"/>
<location filename="../widgets/mainwindow.cpp" line="6193"/>
<location filename="../widgets/mainwindow.cpp" line="6233"/>
<location filename="../widgets/mainwindow.cpp" line="6281"/>
<location filename="../widgets/mainwindow.cpp" line="6410"/>
<source>Band Activity</source>
<translation type="unfinished"></translation>
</message>
@ -2046,12 +2046,12 @@ Error(%2): %3</source>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="194"/>
<location filename="../widgets/mainwindow.cpp" line="5888"/>
<location filename="../widgets/mainwindow.cpp" line="5960"/>
<location filename="../widgets/mainwindow.cpp" line="6004"/>
<location filename="../widgets/mainwindow.cpp" line="6172"/>
<location filename="../widgets/mainwindow.cpp" line="6212"/>
<location filename="../widgets/mainwindow.cpp" line="6260"/>
<location filename="../widgets/mainwindow.cpp" line="5903"/>
<location filename="../widgets/mainwindow.cpp" line="5982"/>
<location filename="../widgets/mainwindow.cpp" line="6026"/>
<location filename="../widgets/mainwindow.cpp" line="6194"/>
<location filename="../widgets/mainwindow.cpp" line="6234"/>
<location filename="../widgets/mainwindow.cpp" line="6282"/>
<source>Rx Frequency</source>
<translation type="unfinished"></translation>
</message>
@ -2630,7 +2630,7 @@ Not available to nonstandard callsign holders.</source>
</message>
<message>
<location filename="../widgets/mainwindow.ui" line="986"/>
<location filename="../widgets/mainwindow.cpp" line="6031"/>
<location filename="../widgets/mainwindow.cpp" line="6053"/>
<source>Fox</source>
<translation type="unfinished"></translation>
</message>
@ -3100,10 +3100,10 @@ list. The list can be maintained in Settings (F2).</source>
<location filename="../widgets/mainwindow.ui" line="1732"/>
<location filename="../widgets/mainwindow.ui" line="1739"/>
<location filename="../widgets/mainwindow.ui" line="1959"/>
<location filename="../widgets/mainwindow.cpp" line="1240"/>
<location filename="../widgets/mainwindow.cpp" line="5645"/>
<location filename="../widgets/mainwindow.cpp" line="6544"/>
<location filename="../widgets/mainwindow.cpp" line="7965"/>
<location filename="../widgets/mainwindow.cpp" line="1247"/>
<location filename="../widgets/mainwindow.cpp" line="5656"/>
<location filename="../widgets/mainwindow.cpp" line="6568"/>
<location filename="../widgets/mainwindow.cpp" line="7990"/>
<source>Random</source>
<translation type="unfinished"></translation>
</message>
@ -3339,7 +3339,7 @@ list. The list can be maintained in Settings (F2).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="8271"/>
<location filename="../widgets/mainwindow.cpp" line="8296"/>
<source>Runaway Tx watchdog</source>
<translation type="unfinished"></translation>
</message>
@ -3571,8 +3571,8 @@ list. The list can be maintained in Settings (F2).</source>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="336"/>
<location filename="../widgets/mainwindow.cpp" line="4281"/>
<location filename="../widgets/mainwindow.cpp" line="7742"/>
<location filename="../widgets/mainwindow.cpp" line="4292"/>
<location filename="../widgets/mainwindow.cpp" line="7767"/>
<source>Receiving</source>
<translation type="unfinished"></translation>
</message>
@ -3587,198 +3587,203 @@ list. The list can be maintained in Settings (F2).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="484"/>
<location filename="../widgets/mainwindow.cpp" line="485"/>
<source>Audio Source</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="485"/>
<location filename="../widgets/mainwindow.cpp" line="486"/>
<source>Reduce system load</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="486"/>
<source>Excessive dropped samples - %1 (%2 sec) audio frames dropped</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="517"/>
<source>Error Scanning ADIF Log</source>
<location filename="../widgets/mainwindow.cpp" line="487"/>
<source>Excessive dropped samples - %1 (%2 sec) audio frames dropped in period starting %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="521"/>
<source>Error Scanning ADIF Log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="525"/>
<source>Scanned ADIF log, %1 worked before records created</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="631"/>
<location filename="../widgets/mainwindow.cpp" line="635"/>
<source>Error Loading LotW Users Data</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="750"/>
<location filename="../widgets/mainwindow.cpp" line="754"/>
<source>Error Writing WAV File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="793"/>
<location filename="../widgets/mainwindow.cpp" line="785"/>
<source>Enumerating audio devices</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="800"/>
<source>Configurations...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="862"/>
<location filename="../widgets/mainwindow.cpp" line="5956"/>
<location filename="../widgets/mainwindow.cpp" line="5962"/>
<location filename="../widgets/mainwindow.cpp" line="6000"/>
<location filename="../widgets/mainwindow.cpp" line="6010"/>
<location filename="../widgets/mainwindow.cpp" line="6107"/>
<location filename="../widgets/mainwindow.cpp" line="6108"/>
<location filename="../widgets/mainwindow.cpp" line="6157"/>
<location filename="../widgets/mainwindow.cpp" line="6158"/>
<location filename="../widgets/mainwindow.cpp" line="6164"/>
<location filename="../widgets/mainwindow.cpp" line="6165"/>
<location filename="../widgets/mainwindow.cpp" line="6213"/>
<location filename="../widgets/mainwindow.cpp" line="6214"/>
<location filename="../widgets/mainwindow.cpp" line="6383"/>
<location filename="../widgets/mainwindow.cpp" line="6384"/>
<location filename="../widgets/mainwindow.cpp" line="7424"/>
<location filename="../widgets/mainwindow.cpp" line="7427"/>
<location filename="../widgets/mainwindow.cpp" line="7432"/>
<location filename="../widgets/mainwindow.cpp" line="7435"/>
<location filename="../widgets/mainwindow.cpp" line="869"/>
<location filename="../widgets/mainwindow.cpp" line="5978"/>
<location filename="../widgets/mainwindow.cpp" line="5984"/>
<location filename="../widgets/mainwindow.cpp" line="6022"/>
<location filename="../widgets/mainwindow.cpp" line="6032"/>
<location filename="../widgets/mainwindow.cpp" line="6129"/>
<location filename="../widgets/mainwindow.cpp" line="6130"/>
<location filename="../widgets/mainwindow.cpp" line="6179"/>
<location filename="../widgets/mainwindow.cpp" line="6180"/>
<location filename="../widgets/mainwindow.cpp" line="6186"/>
<location filename="../widgets/mainwindow.cpp" line="6187"/>
<location filename="../widgets/mainwindow.cpp" line="6235"/>
<location filename="../widgets/mainwindow.cpp" line="6236"/>
<location filename="../widgets/mainwindow.cpp" line="6405"/>
<location filename="../widgets/mainwindow.cpp" line="6406"/>
<location filename="../widgets/mainwindow.cpp" line="7449"/>
<location filename="../widgets/mainwindow.cpp" line="7452"/>
<location filename="../widgets/mainwindow.cpp" line="7457"/>
<location filename="../widgets/mainwindow.cpp" line="7460"/>
<source>Message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="876"/>
<location filename="../widgets/mainwindow.cpp" line="883"/>
<source>Error Killing jt9.exe Process</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="877"/>
<location filename="../widgets/mainwindow.cpp" line="884"/>
<source>KillByName return code: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="892"/>
<location filename="../widgets/mainwindow.cpp" line="899"/>
<source>Error removing &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="893"/>
<location filename="../widgets/mainwindow.cpp" line="900"/>
<source>Click OK to retry</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1296"/>
<location filename="../widgets/mainwindow.cpp" line="6357"/>
<location filename="../widgets/mainwindow.cpp" line="1303"/>
<location filename="../widgets/mainwindow.cpp" line="6379"/>
<source>Improper mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1466"/>
<location filename="../widgets/mainwindow.cpp" line="8917"/>
<location filename="../widgets/mainwindow.cpp" line="1473"/>
<location filename="../widgets/mainwindow.cpp" line="8942"/>
<source>File Open Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1467"/>
<location filename="../widgets/mainwindow.cpp" line="7871"/>
<location filename="../widgets/mainwindow.cpp" line="8351"/>
<location filename="../widgets/mainwindow.cpp" line="8918"/>
<location filename="../widgets/mainwindow.cpp" line="9050"/>
<location filename="../widgets/mainwindow.cpp" line="1474"/>
<location filename="../widgets/mainwindow.cpp" line="7896"/>
<location filename="../widgets/mainwindow.cpp" line="8376"/>
<location filename="../widgets/mainwindow.cpp" line="8943"/>
<location filename="../widgets/mainwindow.cpp" line="9075"/>
<source>Cannot open &quot;%1&quot; for append: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1570"/>
<location filename="../widgets/mainwindow.cpp" line="1577"/>
<source>Error saving c2 file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1770"/>
<location filename="../widgets/mainwindow.cpp" line="1777"/>
<source>Error in Sound Input</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1776"/>
<location filename="../widgets/mainwindow.cpp" line="1783"/>
<source>Error in Sound Output</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1840"/>
<location filename="../widgets/mainwindow.cpp" line="6105"/>
<location filename="../widgets/mainwindow.cpp" line="6255"/>
<location filename="../widgets/mainwindow.cpp" line="1847"/>
<location filename="../widgets/mainwindow.cpp" line="6127"/>
<location filename="../widgets/mainwindow.cpp" line="6277"/>
<source>Single-Period Decodes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="1841"/>
<location filename="../widgets/mainwindow.cpp" line="6106"/>
<location filename="../widgets/mainwindow.cpp" line="6256"/>
<location filename="../widgets/mainwindow.cpp" line="1848"/>
<location filename="../widgets/mainwindow.cpp" line="6128"/>
<location filename="../widgets/mainwindow.cpp" line="6278"/>
<source>Average Decodes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2135"/>
<location filename="../widgets/mainwindow.cpp" line="2142"/>
<source>Change Operator</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2135"/>
<location filename="../widgets/mainwindow.cpp" line="2142"/>
<source>New operator:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2251"/>
<location filename="../widgets/mainwindow.cpp" line="2258"/>
<source>Status File Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2252"/>
<location filename="../widgets/mainwindow.cpp" line="5506"/>
<location filename="../widgets/mainwindow.cpp" line="2259"/>
<location filename="../widgets/mainwindow.cpp" line="5517"/>
<source>Cannot open &quot;%1&quot; for writing: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2387"/>
<location filename="../widgets/mainwindow.cpp" line="2394"/>
<source>Subprocess Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2388"/>
<location filename="../widgets/mainwindow.cpp" line="2395"/>
<source>Subprocess failed with exit code %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2390"/>
<location filename="../widgets/mainwindow.cpp" line="2410"/>
<location filename="../widgets/mainwindow.cpp" line="2397"/>
<location filename="../widgets/mainwindow.cpp" line="2417"/>
<source>Running: %1
%2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2409"/>
<location filename="../widgets/mainwindow.cpp" line="2416"/>
<source>Subprocess error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2447"/>
<location filename="../widgets/mainwindow.cpp" line="2454"/>
<source>Reference spectrum saved</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2510"/>
<location filename="../widgets/mainwindow.cpp" line="2517"/>
<source>Invalid data in fmt.all at line %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2516"/>
<location filename="../widgets/mainwindow.cpp" line="2523"/>
<source>Good Calibration Solution</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2517"/>
<location filename="../widgets/mainwindow.cpp" line="2524"/>
<source>&lt;pre&gt;%1%L2 ±%L3 ppm
%4%L5 ±%L6 Hz
@ -3787,44 +3792,44 @@ list. The list can be maintained in Settings (F2).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2531"/>
<location filename="../widgets/mainwindow.cpp" line="2538"/>
<source>Delete Calibration Measurements</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2532"/>
<location filename="../widgets/mainwindow.cpp" line="2539"/>
<source>The &quot;fmt.all&quot; file will be renamed as &quot;fmt.bak&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2544"/>
<location filename="../widgets/mainwindow.cpp" line="2551"/>
<source>If you make fair use of any part of WSJT-X under terms of the GNU General Public License, you must display the following copyright notice prominently in your derivative work:
&quot;The algorithms, source code, look-and-feel of WSJT-X and related programs, and protocol specifications for the modes FSK441, FT8, JT4, JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144 are Copyright (C) 2001-2020 by one or more of the following authors: Joseph Taylor, K1JT; Bill Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam, KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q; and other members of the WSJT Development Group.&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2812"/>
<location filename="../widgets/mainwindow.cpp" line="2819"/>
<source>No data read from disk. Wrong file format?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2819"/>
<location filename="../widgets/mainwindow.cpp" line="2826"/>
<source>Confirm Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2820"/>
<location filename="../widgets/mainwindow.cpp" line="2827"/>
<source>Are you sure you want to delete all *.wav and *.c2 files in &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2857"/>
<location filename="../widgets/mainwindow.cpp" line="2864"/>
<source>Keyboard Shortcuts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2859"/>
<location filename="../widgets/mainwindow.cpp" line="2866"/>
<source>&lt;table cellspacing=1&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Esc &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Stop Tx, abort QSO, clear next-call queue&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;F1 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Online User&apos;s Guide (Alt: transmit Tx6)&lt;/td&gt;&lt;/tr&gt;
@ -3836,7 +3841,7 @@ list. The list can be maintained in Settings (F2).</source>
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Alt+F4 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Exit program&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;F5 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Display special mouse commands (Alt: transmit Tx5)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;F6 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Open next file in directory (Alt: toggle &quot;Call 1st&quot;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Shift+F6 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Decode all remaining files in directrory&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Shift+F6 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Decode all remaining files in directory&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;F7 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Display Message Averaging window&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;F11 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Move Rx frequency down 1 Hz&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Ctrl+F11 &lt;/b&gt;&lt;/td&gt;&lt;td&gt;Move identical Rx and Tx frequencies down 1 Hz&lt;/td&gt;&lt;/tr&gt;
@ -3874,12 +3879,12 @@ list. The list can be maintained in Settings (F2).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2915"/>
<location filename="../widgets/mainwindow.cpp" line="2922"/>
<source>Special Mouse Commands</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="2917"/>
<location filename="../widgets/mainwindow.cpp" line="2924"/>
<source>&lt;table cellpadding=5&gt;
&lt;tr&gt;
&lt;th align=&quot;right&quot;&gt;Click on&lt;/th&gt;
@ -3915,42 +3920,42 @@ list. The list can be maintained in Settings (F2).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3254"/>
<location filename="../widgets/mainwindow.cpp" line="3265"/>
<source>No more files to open.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3612"/>
<location filename="../widgets/mainwindow.cpp" line="3623"/>
<source>Spotting to PSK Reporter unavailable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3770"/>
<location filename="../widgets/mainwindow.cpp" line="3781"/>
<source>Please choose another Tx frequency. WSJT-X will not knowingly transmit another mode in the WSPR sub-band on 30m.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3774"/>
<location filename="../widgets/mainwindow.cpp" line="3785"/>
<source>WSPR Guard Band</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3787"/>
<location filename="../widgets/mainwindow.cpp" line="3798"/>
<source>Please choose another dial frequency. WSJT-X will not operate in Fox mode in the standard FT8 sub-bands.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="3791"/>
<location filename="../widgets/mainwindow.cpp" line="3802"/>
<source>Fox Mode warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="4385"/>
<location filename="../widgets/mainwindow.cpp" line="4396"/>
<source>Last Tx: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="4791"/>
<location filename="../widgets/mainwindow.cpp" line="4802"/>
<source>Should you switch to EU VHF Contest mode?
To do so, check &apos;Special operating activity&apos; and
@ -3958,176 +3963,176 @@ To do so, check &apos;Special operating activity&apos; and
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="4810"/>
<location filename="../widgets/mainwindow.cpp" line="4821"/>
<source>Should you switch to ARRL Field Day mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="4815"/>
<location filename="../widgets/mainwindow.cpp" line="4826"/>
<source>Should you switch to RTTY contest mode?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5467"/>
<location filename="../widgets/mainwindow.cpp" line="5486"/>
<location filename="../widgets/mainwindow.cpp" line="5505"/>
<location filename="../widgets/mainwindow.cpp" line="5531"/>
<location filename="../widgets/mainwindow.cpp" line="5478"/>
<location filename="../widgets/mainwindow.cpp" line="5497"/>
<location filename="../widgets/mainwindow.cpp" line="5516"/>
<location filename="../widgets/mainwindow.cpp" line="5542"/>
<source>Add to CALL3.TXT</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5468"/>
<location filename="../widgets/mainwindow.cpp" line="5479"/>
<source>Please enter a valid grid locator</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5487"/>
<location filename="../widgets/mainwindow.cpp" line="5498"/>
<source>Cannot open &quot;%1&quot; for read/write: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5529"/>
<location filename="../widgets/mainwindow.cpp" line="5540"/>
<source>%1
is already in CALL3.TXT, do you wish to replace it?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5712"/>
<location filename="../widgets/mainwindow.cpp" line="5723"/>
<source>Warning: DX Call field is empty.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5769"/>
<location filename="../widgets/mainwindow.cpp" line="5780"/>
<source>Log file error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5770"/>
<location filename="../widgets/mainwindow.cpp" line="5781"/>
<source>Cannot open &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5786"/>
<location filename="../widgets/mainwindow.cpp" line="5797"/>
<source>Error sending log to N1MM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="5787"/>
<location filename="../widgets/mainwindow.cpp" line="5798"/>
<source>Write returned &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6006"/>
<location filename="../widgets/mainwindow.cpp" line="6028"/>
<source>Stations calling DXpedition %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6041"/>
<location filename="../widgets/mainwindow.cpp" line="6063"/>
<source>Hound</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6389"/>
<location filename="../widgets/mainwindow.cpp" line="6411"/>
<source>Tx Messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6633"/>
<location filename="../widgets/mainwindow.cpp" line="6666"/>
<location filename="../widgets/mainwindow.cpp" line="6676"/>
<location filename="../widgets/mainwindow.cpp" line="6657"/>
<location filename="../widgets/mainwindow.cpp" line="6690"/>
<location filename="../widgets/mainwindow.cpp" line="6700"/>
<source>Confirm Erase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6634"/>
<location filename="../widgets/mainwindow.cpp" line="6658"/>
<source>Are you sure you want to erase file ALL.TXT?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6644"/>
<location filename="../widgets/mainwindow.cpp" line="8396"/>
<location filename="../widgets/mainwindow.cpp" line="6668"/>
<location filename="../widgets/mainwindow.cpp" line="8421"/>
<source>Confirm Reset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6645"/>
<location filename="../widgets/mainwindow.cpp" line="6669"/>
<source>Are you sure you want to erase your contest log?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6646"/>
<location filename="../widgets/mainwindow.cpp" line="6670"/>
<source>Doing this will remove all QSO records for the current contest. They will be kept in the ADIF log file but will not be available for export in your Cabrillo log.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6659"/>
<location filename="../widgets/mainwindow.cpp" line="6683"/>
<source>Cabrillo Log saved</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6667"/>
<location filename="../widgets/mainwindow.cpp" line="6691"/>
<source>Are you sure you want to erase file wsjtx_log.adi?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="6677"/>
<location filename="../widgets/mainwindow.cpp" line="6701"/>
<source>Are you sure you want to erase the WSPR hashtable?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="7264"/>
<location filename="../widgets/mainwindow.cpp" line="7289"/>
<source>Tune digital gain </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="7266"/>
<location filename="../widgets/mainwindow.cpp" line="7291"/>
<source>Transmit digital gain </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="7285"/>
<location filename="../widgets/mainwindow.cpp" line="7310"/>
<source>Prefixes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="7709"/>
<location filename="../widgets/mainwindow.cpp" line="7734"/>
<source>Network Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="7710"/>
<location filename="../widgets/mainwindow.cpp" line="7735"/>
<source>Error: %1
UDP server %2:%3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="7870"/>
<location filename="../widgets/mainwindow.cpp" line="7895"/>
<source>File Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="8149"/>
<location filename="../widgets/mainwindow.cpp" line="8174"/>
<source>Phase Training Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="8152"/>
<location filename="../widgets/mainwindow.cpp" line="8177"/>
<source>Phase Training Enabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="8286"/>
<location filename="../widgets/mainwindow.cpp" line="8311"/>
<source>WD:%1m</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="8354"/>
<location filename="../widgets/mainwindow.cpp" line="9053"/>
<location filename="../widgets/mainwindow.cpp" line="8379"/>
<location filename="../widgets/mainwindow.cpp" line="9078"/>
<source>Log File Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../widgets/mainwindow.cpp" line="8397"/>
<location filename="../widgets/mainwindow.cpp" line="8422"/>
<source>Are you sure you want to clear the QSO queues?</source>
<translation type="unfinished"></translation>
</message>
@ -4460,67 +4465,67 @@ Error(%2): %3</source>
<context>
<name>SoundInput</name>
<message>
<location filename="../Audio/soundin.cpp" line="21"/>
<location filename="../Audio/soundin.cpp" line="23"/>
<source>An error opening the audio input device has occurred.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="25"/>
<location filename="../Audio/soundin.cpp" line="27"/>
<source>An error occurred during read from the audio input device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="29"/>
<location filename="../Audio/soundin.cpp" line="31"/>
<source>Audio data not being fed to the audio input device fast enough.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="33"/>
<location filename="../Audio/soundin.cpp" line="35"/>
<source>Non-recoverable error, audio input device not usable at this time.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="63"/>
<location filename="../Audio/soundin.cpp" line="65"/>
<source>Requested input audio format is not valid.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="69"/>
<location filename="../Audio/soundin.cpp" line="71"/>
<source>Requested input audio format is not supported on device.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="99"/>
<location filename="../Audio/soundin.cpp" line="101"/>
<source>Failed to initialize audio sink device</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="134"/>
<location filename="../Audio/soundin.cpp" line="136"/>
<source>Idle</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="139"/>
<location filename="../Audio/soundin.cpp" line="141"/>
<source>Receiving</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="143"/>
<location filename="../Audio/soundin.cpp" line="145"/>
<source>Suspended</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="148"/>
<location filename="../Audio/soundin.cpp" line="150"/>
<source>Interrupted</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="155"/>
<location filename="../Audio/soundin.cpp" line="157"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Audio/soundin.cpp" line="159"/>
<location filename="../Audio/soundin.cpp" line="161"/>
<source>Stopped</source>
<translation type="unfinished"></translation>
</message>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
#include "LazyFillComboBox.hpp"
#include "moc_LazyFillComboBox.cpp"

View File

@ -0,0 +1,40 @@
#ifndef LAZY_FILL_COMBO_BOX_HPP__
#define LAZY_FILL_COMBO_BOX_HPP__
#include <QComboBox>
class QWidget;
//
// Class LazyFillComboBox
//
// QComboBox derivative that signals show and hide of the pop up list.
//
class LazyFillComboBox final
: public QComboBox
{
Q_OBJECT
public:
Q_SIGNAL void about_to_show_popup ();
Q_SIGNAL void popup_hidden ();
explicit LazyFillComboBox (QWidget * parent = nullptr)
: QComboBox {parent}
{
}
void showPopup () override
{
Q_EMIT about_to_show_popup ();
QComboBox::showPopup ();
}
void hidePopup () override
{
QComboBox::hidePopup ();
Q_EMIT popup_hidden ();
}
};
#endif

View File

@ -269,14 +269,14 @@ void Astro::check_split ()
}
}
void Astro::on_rbFullTrack_clicked()
void Astro::on_rbFullTrack_clicked(bool)
{
m_DopplerMethod = 1;
check_split ();
Q_EMIT tracking_update ();
}
void Astro::on_rbOnDxEcho_clicked() //on_rbOnDxEcho_clicked(bool checked)
void Astro::on_rbOnDxEcho_clicked(bool)
{
m_DopplerMethod = 4;
check_split ();
@ -287,28 +287,28 @@ void Astro::on_rbOnDxEcho_clicked() //on_rbOnDxEcho_clicked(bool checked)
Q_EMIT tracking_update ();
}
void Astro::on_rbOwnEcho_clicked()
void Astro::on_rbOwnEcho_clicked(bool)
{
m_DopplerMethod = 3;
check_split ();
Q_EMIT tracking_update ();
}
void Astro::on_rbCallDx_clicked()
void Astro::on_rbCallDx_clicked(bool)
{
m_DopplerMethod = 5;
check_split ();
Q_EMIT tracking_update ();
}
void Astro::on_rbConstFreqOnMoon_clicked()
void Astro::on_rbConstFreqOnMoon_clicked(bool)
{
m_DopplerMethod = 2;
check_split ();
Q_EMIT tracking_update ();
}
void Astro::on_rbNoDoppler_clicked()
void Astro::on_rbNoDoppler_clicked(bool)
{
m_DopplerMethod = 0;
Q_EMIT tracking_update ();

View File

@ -55,12 +55,12 @@ protected:
void closeEvent (QCloseEvent *) override;
private slots:
void on_rbConstFreqOnMoon_clicked();
void on_rbFullTrack_clicked();
void on_rbOwnEcho_clicked();
void on_rbNoDoppler_clicked();
void on_rbOnDxEcho_clicked();
void on_rbCallDx_clicked();
void on_rbConstFreqOnMoon_clicked(bool);
void on_rbFullTrack_clicked(bool);
void on_rbOwnEcho_clicked(bool);
void on_rbNoDoppler_clicked(bool);
void on_rbOnDxEcho_clicked(bool);
void on_rbCallDx_clicked(bool);
void on_cbDopplerTracking_toggled(bool);
private:

View File

@ -209,7 +209,7 @@ namespace
// 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"};
auto quint32_max = std::numeric_limits<quint32>::max ();
constexpr int N_WIDGETS {34};
constexpr int N_WIDGETS {36};
constexpr int rx_chunk_size {3456}; // audio samples at 12000 Hz
constexpr int tx_audio_buffer_size {48000 / 5}; // audio frames at 48000 Hz
@ -455,6 +455,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
// hook up sound output stream slots & signals and disposal
connect (this, &MainWindow::initializeAudioOutputStream, m_soundOutput, &SoundOutput::setFormat);
connect (m_soundOutput, &SoundOutput::error, this, &MainWindow::showSoundOutError);
connect (m_soundOutput, &SoundOutput::error, &m_config, &Configuration::invalidate_audio_output_device);
// connect (m_soundOutput, &SoundOutput::status, this, &MainWindow::showStatusMessage);
connect (this, &MainWindow::outAttenuationChanged, m_soundOutput, &SoundOutput::setAttenuation);
connect (&m_audioThread, &QThread::finished, m_soundOutput, &QObject::deleteLater);
@ -473,18 +474,23 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
connect (this, &MainWindow::reset_audio_input_stream, m_soundInput, &SoundInput::reset);
connect (this, &MainWindow::finished, m_soundInput, &SoundInput::stop);
connect(m_soundInput, &SoundInput::error, this, &MainWindow::showSoundInError);
connect(m_soundInput, &SoundInput::error, &m_config, &Configuration::invalidate_audio_input_device);
// connect(m_soundInput, &SoundInput::status, this, &MainWindow::showStatusMessage);
connect (m_soundInput, &SoundInput::dropped_frames, this, [this] (qint32 dropped_frames, qint64 usec) {
if (dropped_frames > 48000 / 5) // 1/5 second
{
showStatusMessage (tr ("%1 (%2 sec) audio frames dropped").arg (dropped_frames).arg (usec / 1.e6, 5, 'f', 3));
}
if (dropped_frames > 48000) // 1 second
if (dropped_frames > 5 * 48000) // seconds
{
auto period = qt_truncate_date_time_to (QDateTime::currentDateTimeUtc ().addMSecs (-m_TRperiod / 2.), m_TRperiod * 1e3);
MessageBox::warning_message (this
, tr ("Audio Source")
, tr ("Reduce system load")
, tr ("Excessive dropped samples - %1 (%2 sec) audio frames dropped").arg (dropped_frames).arg (usec / 1.e6, 5, 'f', 3));
, tr ("Excessive dropped samples - %1 (%2 sec) audio frames dropped in period starting %3")
.arg (dropped_frames)
.arg (usec / 1.e6, 5, 'f', 3)
.arg (period.toString ("hh:mm:ss")));
}
});
connect (&m_audioThread, &QThread::finished, m_soundInput, &QObject::deleteLater);
@ -779,6 +785,9 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
connect (&m_config, &Configuration::udp_server_changed, m_messageClient, &MessageClient::set_server);
connect (&m_config, &Configuration::udp_server_port_changed, m_messageClient, &MessageClient::set_server_port);
connect (&m_config, &Configuration::accept_udp_requests_changed, m_messageClient, &MessageClient::enable);
connect (&m_config, &Configuration::enumerating_audio_devices, [this] () {
showStatusMessage (tr ("Enumerating audio devices"));
});
// set up configurations menu
connect (m_multi_settings, &MultiSettings::configurationNameChanged, [this] (QString const& name) {
@ -862,8 +871,8 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
ui->labAz->setStyleSheet("border: 0px;");
ui->labAz->setText("");
auto t = "UTC dB DT Freq " + tr ("Message");
ui->decodedTextLabel->setText(t);
ui->decodedTextLabel2->setText(t);
ui->lh_decodes_headings_label->setText(t);
ui->rh_decodes_headings_label->setText(t);
readSettings(); //Restore user's setup parameters
m_audioThread.start (m_audioThreadPriority);
@ -1037,11 +1046,11 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
void MainWindow::not_GA_warning_message ()
{
// MessageBox::critical_message (this,
// "This is a pre-release version of WSJT-X 2.2.0 made\n"
// "This is a pre-release version of WSJT-X 2.3.0 made\n"
// "available for testing purposes. By design it will\n"
// "be nonfunctional after 0000 UTC on June 10, 2020.");
// "be nonfunctional after 0000 UTC on Nov 17, 2020.");
// auto now = QDateTime::currentDateTimeUtc ();
// if (now >= QDateTime {{2020, 6, 10}, {0, 0}, Qt::UTC}) {
// if (now >= QDateTime {{2020, 11, 17}, {0, 0}, Qt::UTC}) {
// Q_EMIT finished ();
// }
}
@ -1130,6 +1139,8 @@ void MainWindow::writeSettings()
m_settings->setValue("WSPRfreq",ui->WSPRfreqSpinBox->value());
m_settings->setValue("FST4W_RxFreq",ui->sbFST4W_RxFreq->value());
m_settings->setValue("FST4W_FTol",ui->sbFST4W_FTol->value());
m_settings->setValue("FST4_FLow",ui->sbF_Low->value());
m_settings->setValue("FST4_FHigh",ui->sbF_High->value());
m_settings->setValue("SubMode",ui->sbSubmode->value());
m_settings->setValue("DTtol",m_DTtol);
m_settings->setValue("Ftol", ui->sbFtol->value ());
@ -1163,6 +1174,7 @@ void MainWindow::writeSettings()
m_settings->setValue ("JT65AP", ui->actionEnable_AP_JT65->isChecked ());
m_settings->setValue("SplitterState",ui->splitter->saveState());
m_settings->setValue("Blanker",ui->sbNB->value());
m_settings->setValue ("SWLView", ui->actionSWL_Mode->isChecked ());
{
QList<QVariant> coeffs; // suitable for QSettings
@ -1217,6 +1229,8 @@ void MainWindow::readSettings()
ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq",1500).toInt());
ui->sbFST4W_RxFreq->setValue(0);
ui->sbFST4W_RxFreq->setValue(m_settings->value("FST4W_RxFreq",1500).toInt());
ui->sbF_Low->setValue(m_settings->value("FST4_FLow",600).toInt());
ui->sbF_High->setValue(m_settings->value("FST4_FHigh",1400).toInt());
m_nSubMode=m_settings->value("SubMode",0).toInt();
ui->sbFtol->setValue (m_settings->value("Ftol", 50).toInt());
ui->sbFST4W_FTol->setValue(m_settings->value("FST4W_FTol",100).toInt());
@ -1266,6 +1280,8 @@ void MainWindow::readSettings()
ui->actionEnable_AP_JT65->setChecked (m_settings->value ("JT65AP", false).toBool());
ui->splitter->restoreState(m_settings->value("SplitterState").toByteArray());
ui->sbNB->setValue(m_settings->value("Blanker",0).toInt());
ui->actionSWL_Mode->setChecked (m_settings->value ("SWLView", false).toBool ());
on_actionSWL_Mode_triggered (ui->actionSWL_Mode->isChecked ());
{
auto const& coeffs = m_settings->value ("PhaseEqualizationCoefficients"
, QList<QVariant> {0., 0., 0., 0., 0.}).toList ();
@ -1333,8 +1349,8 @@ void MainWindow::setDecodedTextFont (QFont const& font)
ui->textBrowser4->displayFoxToBeCalled(" ");
ui->textBrowser4->setText("");
auto style_sheet = "QLabel {" + font_as_stylesheet (font) + '}';
ui->decodedTextLabel->setStyleSheet (ui->decodedTextLabel->styleSheet () + style_sheet);
ui->decodedTextLabel2->setStyleSheet (ui->decodedTextLabel2->styleSheet () + style_sheet);
ui->lh_decodes_headings_label->setStyleSheet (ui->lh_decodes_headings_label->styleSheet () + style_sheet);
ui->rh_decodes_headings_label->setStyleSheet (ui->rh_decodes_headings_label->styleSheet () + style_sheet);
if (m_msgAvgWidget) {
m_msgAvgWidget->changeFont (font);
}
@ -1428,6 +1444,10 @@ void MainWindow::dataSink(qint64 frames)
// Get power, spectrum, and ihsym
dec_data.params.nfa=m_wideGraph->nStartFreq();
dec_data.params.nfb=m_wideGraph->Fmax();
if(m_mode=="FST4") {
dec_data.params.nfa=ui->sbF_Low->value();
dec_data.params.nfb=ui->sbF_High->value();
}
int nsps=m_nsps;
if(m_bFastMode) nsps=6912;
int nsmo=m_wideGraph->smoothYellow()-1;
@ -1818,14 +1838,14 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog
m_psk_Reporter.sendReport (true);
}
if(m_config.restart_audio_input ()) {
if(m_config.restart_audio_input () && !m_config.audio_input_device ().isNull ()) {
Q_EMIT startAudioInputStream (m_config.audio_input_device ()
, rx_chunk_size * m_downSampleFactor
, m_detector, m_downSampleFactor
, m_config.audio_input_channel ());
}
if(m_config.restart_audio_output ()) {
if(m_config.restart_audio_output () && !m_config.audio_output_device ().isNull ()) {
Q_EMIT initializeAudioOutputStream (m_config.audio_output_device ()
, AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2
, tx_audio_buffer_size);
@ -1846,8 +1866,8 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog
m_config.transceiver_online ();
if(!m_bFastMode) setXIT (ui->TxFreqSpinBox->value ());
if ((m_config.single_decode () && !m_mode.startsWith ("FST4")) || m_mode=="JT4") {
ui->label_6->setText(tr ("Single-Period Decodes"));
ui->label_7->setText(tr ("Average Decodes"));
ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes"));
ui->rh_decodes_title_label->setText(tr ("Average Decodes"));
}
update_watchdog_label ();
@ -1885,7 +1905,11 @@ void MainWindow::on_monitorButton_clicked (bool checked)
setXIT (ui->TxFreqSpinBox->value ());
}
// ensure FreqCal triggers
on_RxFreqSpinBox_valueChanged (ui->RxFreqSpinBox->value ());
if(m_mode=="FST4W") {
on_sbFST4W_RxFreq_valueChanged(ui->sbFST4W_RxFreq->value());
} else {
on_RxFreqSpinBox_valueChanged (ui->RxFreqSpinBox->value ());
}
}
//Get Configuration in/out of strict split and mode checking
m_config.sync_transceiver (true, checked);
@ -2565,6 +2589,15 @@ void MainWindow::on_actionCopyright_Notice_triggered()
MessageBox::warning_message(this, message);
}
void MainWindow::on_actionSWL_Mode_triggered (bool checked)
{
ui->lower_panel_widget->setVisible (!checked);
if (checked)
{
hideMenus (false); // make sure we can be turned off
}
}
// This allows the window to shrink by removing certain things
// and reducing space used by controls
void MainWindow::hideMenus(bool checked)
@ -2583,12 +2616,10 @@ void MainWindow::hideMenus(bool checked)
minimumSize().setWidth(770);
}
ui->menuBar->setVisible(!checked);
if(m_mode!="FreqCal" and m_mode!="WSPR" and m_mode!="Fst4W") {
ui->label_6->setVisible(!checked);
ui->label_7->setVisible(!checked);
ui->decodedTextLabel2->setVisible(!checked);
if(m_mode!="FreqCal" and m_mode!="WSPR" and m_mode!="FST4W") {
ui->lh_decodes_title_label->setVisible(!checked);
}
ui->decodedTextLabel->setVisible(!checked);
ui->lh_decodes_headings_label->setVisible(!checked);
ui->gridLayout_5->layout()->setSpacing(spacing);
ui->horizontalLayout_2->layout()->setSpacing(spacing);
ui->horizontalLayout_5->layout()->setSpacing(spacing);
@ -2601,7 +2632,7 @@ void MainWindow::hideMenus(bool checked)
ui->horizontalLayout_12->layout()->setSpacing(spacing);
ui->horizontalLayout_13->layout()->setSpacing(spacing);
ui->horizontalLayout_14->layout()->setSpacing(spacing);
ui->verticalLayout->layout()->setSpacing(spacing);
ui->rh_decodes_widget->layout()->setSpacing(spacing);
ui->verticalLayout_2->layout()->setSpacing(spacing);
ui->verticalLayout_3->layout()->setSpacing(spacing);
ui->verticalLayout_5->layout()->setSpacing(spacing);
@ -2878,7 +2909,7 @@ void MainWindow::on_actionKeyboard_shortcuts_triggered()
<tr><td><b>Alt+F4 </b></td><td>Exit program</td></tr>
<tr><td><b>F5 </b></td><td>Display special mouse commands (Alt: transmit Tx5)</td></tr>
<tr><td><b>F6 </b></td><td>Open next file in directory (Alt: toggle "Call 1st")</td></tr>
<tr><td><b>Shift+F6 </b></td><td>Decode all remaining files in directrory</td></tr>
<tr><td><b>Shift+F6 </b></td><td>Decode all remaining files in directory</td></tr>
<tr><td><b>F7 </b></td><td>Display Message Averaging window</td></tr>
<tr><td><b>F11 </b></td><td>Move Rx frequency down 1 Hz</td></tr>
<tr><td><b>Ctrl+F11 </b></td><td>Move identical Rx and Tx frequencies down 1 Hz</td></tr>
@ -2976,7 +3007,10 @@ void MainWindow::on_DecodeButton_clicked (bool /* checked */) //Decode request
void MainWindow::freezeDecode(int n) //freezeDecode()
{
if((n%100)==2) on_DecodeButton_clicked (true);
if((n%100)==2) {
if(m_mode=="FST4" and m_config.single_decode() and ui->sbFtol->value()>10) ui->sbFtol->setValue(10);
on_DecodeButton_clicked (true);
}
}
void MainWindow::on_ClrAvgButton_clicked()
@ -3006,13 +3040,13 @@ void MainWindow::decode() //decode()
if( m_diskData ) {
dec_data.params.lapcqonly=false;
}
m_msec0=QDateTime::currentMSecsSinceEpoch();
if(!m_dataAvailable or m_TRperiod==0.0) return;
ui->DecodeButton->setChecked (true);
if(!dec_data.params.nagain && m_diskData && (m_TRperiod >= 60.0)) {
if(!dec_data.params.nagain && m_diskData && m_TRperiod >= 60.) {
dec_data.params.nutc=dec_data.params.nutc/100;
}
if(dec_data.params.nagain==0 && dec_data.params.newdat==1 && (!m_diskData)) {
<<<<<<< HEAD
qint64 ms = QDateTime::currentMSecsSinceEpoch() % 86400000;
int imin=ms/60000;
int ihr=imin/60;
@ -3032,6 +3066,15 @@ void MainWindow::decode() //decode()
isec=isec - fmod(double(isec),m_TRperiod);
dec_data.params.nutc=10000*ihr + 100*imin + isec;
}
=======
auto t_start = qt_truncate_date_time_to (QDateTime::currentDateTimeUtc (), m_TRperiod * 1.e3);
auto t = t_start.time ();
dec_data.params.nutc = t.hour () * 100 + t.minute ();
if (m_TRperiod < 60.)
{
dec_data.params.nutc = dec_data.params.nutc * 100 + t.second ();
}
>>>>>>> develop
}
if(m_nPick==1 and !m_diskData) {
@ -3068,7 +3111,17 @@ void MainWindow::decode() //decode()
dec_data.params.ntol=20;
dec_data.params.naggressive=0;
}
if(m_mode=="FST4W") dec_data.params.ntol=ui->sbFST4W_FTol->value ();
if(m_mode=="FST4") {
dec_data.params.ntol=ui->sbFtol->value();
if(m_config.single_decode()) {
dec_data.params.nfa=m_wideGraph->rxFreq() - ui->sbFtol->value();
dec_data.params.nfb=m_wideGraph->rxFreq() + ui->sbFtol->value();
} else {
dec_data.params.nfa=ui->sbF_Low->value();
dec_data.params.nfb=ui->sbF_High->value();
}
}
if(m_mode=="FST4W") dec_data.params.ntol=ui->sbFST4W_FTol->value();
if(dec_data.params.nutc < m_nutc0) m_RxLog = 1; //Date and Time to file "ALL.TXT".
if(dec_data.params.newdat==1 and !m_diskData) m_nutc0=dec_data.params.nutc;
dec_data.params.ntxmode=9;
@ -3112,7 +3165,7 @@ void MainWindow::decode() //decode()
dec_data.params.nexp_decode = static_cast<int> (m_config.special_op_id());
if(m_config.single_decode()) dec_data.params.nexp_decode += 32;
if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64;
if(m_mode.startsWith("FST4")) dec_data.params.nexp_decode += 256*ui->sbNB->value();
if(m_mode.startsWith("FST4")) dec_data.params.nexp_decode += 256*(ui->sbNB->value()+2);
::memcpy(dec_data.params.datetime, m_dateTime.toLatin1()+" ", sizeof dec_data.params.datetime);
::memcpy(dec_data.params.mycall, (m_config.my_callsign()+" ").toLatin1(), sizeof dec_data.params.mycall);
@ -3762,7 +3815,7 @@ void MainWindow::guiUpdate()
}
} else {
// For all modes other than WSPR and Fst4W
// For all modes other than WSPR and FST4W
m_bTxTime = (t2p >= tx1) and (t2p < tx2);
if(m_mode=="Echo") m_bTxTime = m_bTxTime and m_bEchoTxOK;
if(m_mode=="FT8" and ui->tx5->currentText().contains("/B ")) {
@ -4238,7 +4291,7 @@ void MainWindow::guiUpdate()
//Once per second (onesec)
if(nsec != m_sec0) {
// qDebug() << "AAA" << nsec;
if(m_mode=="FST4") sbFtolMaxVal();
if(m_mode=="FST4") chk_FST4_freq_range();
m_currentBand=m_config.bands()->find(m_freqNominal);
if( SpecOp::HOUND == m_config.special_op_id() ) {
qint32 tHound=QDateTime::currentMSecsSinceEpoch()/1000 - m_tAutoOn;
@ -5885,6 +5938,8 @@ void MainWindow::displayWidgets(qint64 n)
if(i==31) ui->cbRxAll->setVisible(b);
if(i==32) ui->cbCQonly->setVisible(b);
if(i==33) ui->sbTR_FST4W->setVisible(b);
if(i==34) ui->sbF_Low->setVisible(b);
if(i==35) ui->sbF_High->setVisible(b);
j=j>>1;
}
ui->pbBestSP->setVisible(m_mode=="FT4");
@ -5907,26 +5962,42 @@ void MainWindow::on_actionFST4_triggered()
m_mode="FST4";
m_modeTx="FST4";
ui->actionFST4->setChecked(true);
m_bFast9=false;
m_bFastMode=false;
m_fastGraph->hide();
m_wideGraph->show();
m_nsps=6912; //For symspec only
m_FFTSize = m_nsps / 2;
Q_EMIT FFTSize(m_FFTSize);
ui->label_6->setText(tr ("Band Activity"));
ui->label_7->setText(tr ("Rx Frequency"));
ui->lh_decodes_title_label->setText(tr ("Band Activity"));
ui->rh_decodes_title_label->setText(tr ("Rx Frequency"));
WSPR_config(false);
// 0123456789012345678901234567890123
displayWidgets(nWidgets("1111110001001110000100000001000000"));
if(m_config.single_decode()) {
// 012345678901234567890123456789012345
displayWidgets(nWidgets("111111000100111000010000000100000000"));
m_wideGraph->setSingleDecode(true);
} else {
displayWidgets(nWidgets("111011000100111000010000000100000011"));
m_wideGraph->setSingleDecode(false);
ui->sbFtol->setValue(20);
}
setup_status_bar(false);
ui->sbTR->values ({15, 30, 60, 120, 300, 900, 1800});
on_sbTR_valueChanged (ui->sbTR->value());
sbFtolMaxVal();
ui->cbAutoSeq->setChecked(true);
m_wideGraph->setMode(m_mode);
m_wideGraph->setModeTx(m_modeTx);
m_wideGraph->setPeriod(m_TRperiod,6912);
m_wideGraph->setRxFreq(ui->RxFreqSpinBox->value());
m_wideGraph->setTol(ui->sbFtol->value());
m_wideGraph->setTxFreq(ui->TxFreqSpinBox->value());
m_wideGraph->setFST4_FreqRange(ui->sbF_Low->value(),ui->sbF_High->value());
chk_FST4_freq_range();
switch_mode (Modes::FST4);
m_wideGraph->setMode(m_mode);
ui->sbTR->values ({15, 30, 60, 120, 300, 900, 1800});
on_sbTR_valueChanged (ui->sbTR->value());
statusChanged();
m_bOK_to_chk=true;
chk_FST4_freq_range();
}
void MainWindow::on_actionFST4W_triggered()
@ -5934,16 +6005,22 @@ void MainWindow::on_actionFST4W_triggered()
m_mode="FST4W";
m_modeTx="FST4W";
ui->actionFST4W->setChecked(true);
m_bFast9=false;
m_bFastMode=false;
m_fastGraph->hide();
m_wideGraph->show();
m_nsps=6912; //For symspec only
m_FFTSize = m_nsps / 2;
Q_EMIT FFTSize(m_FFTSize);
WSPR_config(true);
// 0123456789012345678901234567890123
displayWidgets(nWidgets("0000000000000000010100000000000001"));
// 012345678901234567890123456789012345
displayWidgets(nWidgets("000000000000000001010000000000000100"));
setup_status_bar(false);
ui->band_hopping_group_box->setChecked(false);
ui->band_hopping_group_box->setVisible(false);
on_sbTR_FST4W_valueChanged (ui->sbTR_FST4W->value ());
ui->WSPRfreqSpinBox->setMinimum(100);
ui->WSPRfreqSpinBox->setMaximum(5000);
m_wideGraph->setMode(m_mode);
m_wideGraph->setModeTx(m_modeTx);
m_wideGraph->setPeriod(m_TRperiod,6912);
@ -5951,7 +6028,6 @@ void MainWindow::on_actionFST4W_triggered()
m_wideGraph->setRxFreq(ui->sbFST4W_RxFreq->value());
m_wideGraph->setTol(ui->sbFST4W_FTol->value());
ui->sbFtol->setValue(100);
ui->RxFreqSpinBox->setValue(1500);
switch_mode (Modes::FST4W);
statusChanged();
}
@ -5979,14 +6055,14 @@ void MainWindow::on_actionFT4_triggered()
VHF_features_enabled(bVHF);
m_fastGraph->hide();
m_wideGraph->show();
ui->decodedTextLabel2->setText(" UTC dB DT Freq " + tr ("Message"));
ui->rh_decodes_headings_label->setText(" UTC dB DT Freq " + tr ("Message"));
m_wideGraph->setPeriod(m_TRperiod,m_nsps);
m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe
ui->label_7->setText(tr ("Rx Frequency"));
ui->label_6->setText(tr ("Band Activity"));
ui->decodedTextLabel->setText( " UTC dB DT Freq " + tr ("Message"));
displayWidgets(nWidgets("1110100001001110000100000001100010"));
ui->rh_decodes_title_label->setText(tr ("Rx Frequency"));
ui->lh_decodes_title_label->setText(tr ("Band Activity"));
ui->lh_decodes_headings_label->setText( " UTC dB DT Freq " + tr ("Message"));
displayWidgets(nWidgets("111010000100111000010000000110001000"));
ui->txrb2->setEnabled(true);
ui->txrb4->setEnabled(true);
ui->txrb5->setEnabled(true);
@ -6023,19 +6099,19 @@ void MainWindow::on_actionFT8_triggered()
m_TRperiod=15.0;
m_fastGraph->hide();
m_wideGraph->show();
ui->decodedTextLabel2->setText(" UTC dB DT Freq " + tr ("Message"));
ui->rh_decodes_headings_label->setText(" UTC dB DT Freq " + tr ("Message"));
m_wideGraph->setPeriod(m_TRperiod,m_nsps);
m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe
ui->label_7->setText(tr ("Rx Frequency"));
ui->rh_decodes_title_label->setText(tr ("Rx Frequency"));
if(SpecOp::FOX==m_config.special_op_id()) {
ui->label_6->setText(tr ("Stations calling DXpedition %1").arg (m_config.my_callsign()));
ui->decodedTextLabel->setText( "Call Grid dB Freq Dist Age Continent");
ui->lh_decodes_title_label->setText(tr ("Stations calling DXpedition %1").arg (m_config.my_callsign()));
ui->lh_decodes_headings_label->setText( "Call Grid dB Freq Dist Age Continent");
} else {
ui->label_6->setText(tr ("Band Activity"));
ui->decodedTextLabel->setText( " UTC dB DT Freq " + tr ("Message"));
ui->lh_decodes_title_label->setText(tr ("Band Activity"));
ui->lh_decodes_headings_label->setText( " UTC dB DT Freq " + tr ("Message"));
}
displayWidgets(nWidgets("1110100001001110000100001001100010"));
displayWidgets(nWidgets("111010000100111000010000100110001000"));
ui->txrb2->setEnabled(true);
ui->txrb4->setEnabled(true);
ui->txrb5->setEnabled(true);
@ -6053,7 +6129,7 @@ void MainWindow::on_actionFT8_triggered()
ui->cbAutoSeq->setEnabled(false);
ui->tabWidget->setCurrentIndex(1);
ui->TxFreqSpinBox->setValue(300);
displayWidgets(nWidgets("1110100001001110000100000000001000"));
displayWidgets(nWidgets("111010000100111000010000000000100000"));
ui->labDXped->setText(tr ("Fox"));
on_fox_log_action_triggered();
}
@ -6063,7 +6139,7 @@ void MainWindow::on_actionFT8_triggered()
ui->cbAutoSeq->setEnabled(false);
ui->tabWidget->setCurrentIndex(0);
ui->cbHoldTxFreq->setChecked(true);
displayWidgets(nWidgets("1110100001001100000100000000001100"));
displayWidgets(nWidgets("111010000100110000010000000000110000"));
ui->labDXped->setText(tr ("Hound"));
ui->txrb1->setChecked(true);
ui->txrb2->setEnabled(false);
@ -6128,19 +6204,19 @@ void MainWindow::on_actionJT4_triggered()
m_bFast9=false;
setup_status_bar (bVHF);
ui->sbSubmode->setMaximum(6);
ui->label_6->setText(tr ("Single-Period Decodes"));
ui->label_7->setText(tr ("Average Decodes"));
ui->decodedTextLabel->setText("UTC dB DT Freq " + tr ("Message"));
ui->decodedTextLabel2->setText("UTC dB DT Freq " + tr ("Message"));
ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes"));
ui->rh_decodes_title_label->setText(tr ("Average Decodes"));
ui->lh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message"));
ui->rh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message"));
if(bVHF) {
ui->sbSubmode->setValue(m_nSubMode);
} else {
ui->sbSubmode->setValue(0);
}
if(bVHF) {
displayWidgets(nWidgets("1111100100101101101111000000000000"));
displayWidgets(nWidgets("111110010010110110111100000000000000"));
} else {
displayWidgets(nWidgets("1110100000001100001100000000000000"));
displayWidgets(nWidgets("111010000000110000110000000000000000"));
}
fast_config(false);
statusChanged();
@ -6180,26 +6256,26 @@ void MainWindow::on_actionJT9_triggered()
m_fastGraph->showNormal();
ui->TxFreqSpinBox->setValue(700);
ui->RxFreqSpinBox->setValue(700);
ui->decodedTextLabel->setText(" UTC dB T Freq " + tr ("Message"));
ui->decodedTextLabel2->setText(" UTC dB T Freq " + tr ("Message"));
ui->lh_decodes_headings_label->setText(" UTC dB T Freq " + tr ("Message"));
ui->rh_decodes_headings_label->setText(" UTC dB T Freq " + tr ("Message"));
} else {
ui->cbAutoSeq->setChecked(false);
if (m_mode != "FST4")
{
m_TRperiod=60.0;
ui->decodedTextLabel->setText("UTC dB DT Freq " + tr ("Message"));
ui->decodedTextLabel2->setText("UTC dB DT Freq " + tr ("Message"));
ui->lh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message"));
ui->rh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message"));
}
}
m_wideGraph->setPeriod(m_TRperiod,m_nsps);
m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe
ui->label_6->setText(tr ("Band Activity"));
ui->label_7->setText(tr ("Rx Frequency"));
ui->lh_decodes_title_label->setText(tr ("Band Activity"));
ui->rh_decodes_title_label->setText(tr ("Rx Frequency"));
if(bVHF) {
displayWidgets(nWidgets("1111101010001111100100000000000000"));
displayWidgets(nWidgets("111110101000111110010000000000000000"));
} else {
displayWidgets(nWidgets("1110100000001110000100000000000010"));
displayWidgets(nWidgets("111010000000111000010000000000001000"));
}
fast_config(m_bFastMode);
ui->cbAutoSeq->setVisible(m_bFast9);
@ -6234,11 +6310,11 @@ void MainWindow::on_actionJT9_JT65_triggered()
m_bFastMode=false;
m_bFast9=false;
ui->sbSubmode->setValue(0);
ui->label_6->setText(tr ("Band Activity"));
ui->label_7->setText(tr ("Rx Frequency"));
ui->decodedTextLabel->setText("UTC dB DT Freq " + tr ("Message"));
ui->decodedTextLabel2->setText("UTC dB DT Freq " + tr ("Message"));
displayWidgets(nWidgets("1110100000011110000100000000000010"));
ui->lh_decodes_title_label->setText(tr ("Band Activity"));
ui->rh_decodes_title_label->setText(tr ("Rx Frequency"));
ui->lh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message"));
ui->rh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message"));
displayWidgets(nWidgets("111010000001111000010000000000001000"));
fast_config(false);
statusChanged();
}
@ -6272,23 +6348,26 @@ void MainWindow::on_actionJT65_triggered()
m_wideGraph->setPeriod(m_TRperiod,m_nsps);
m_wideGraph->setMode(m_mode);
m_wideGraph->setModeTx(m_modeTx);
m_wideGraph->setRxFreq(ui->RxFreqSpinBox->value());
m_wideGraph->setTol(ui->sbFtol->value());
m_wideGraph->setTxFreq(ui->TxFreqSpinBox->value());
setup_status_bar (bVHF);
m_bFastMode=false;
m_bFast9=false;
ui->sbSubmode->setMaximum(2);
if(bVHF) {
ui->sbSubmode->setValue(m_nSubMode);
ui->label_6->setText(tr ("Single-Period Decodes"));
ui->label_7->setText(tr ("Average Decodes"));
ui->lh_decodes_title_label->setText(tr ("Single-Period Decodes"));
ui->rh_decodes_title_label->setText(tr ("Average Decodes"));
} else {
ui->sbSubmode->setValue(0);
ui->label_6->setText(tr ("Band Activity"));
ui->label_7->setText(tr ("Rx Frequency"));
ui->lh_decodes_title_label->setText(tr ("Band Activity"));
ui->rh_decodes_title_label->setText(tr ("Rx Frequency"));
}
if(bVHF) {
displayWidgets(nWidgets("1111100100001101101011000100000000"));
displayWidgets(nWidgets("111110010000110110101100010000000000"));
} else {
displayWidgets(nWidgets("1110100000001110000100000000000010"));
displayWidgets(nWidgets("111010000000111000010000000000001000"));
}
fast_config(false);
if(ui->cbShMsgs->isChecked()) {
@ -6327,8 +6406,8 @@ void MainWindow::on_actionQRA64_triggered()
m_wideGraph->setRxFreq(ui->RxFreqSpinBox->value());
m_wideGraph->setTol(ui->sbFtol->value());
switch_mode (Modes::QRA64);
// 0123456789012345678901234567890123
displayWidgets(nWidgets("1111100100101101100100000010000000"));
// 012345678901234567890123456789012345
displayWidgets(nWidgets("111110010010110110010000001000000000"));
statusChanged();
}
@ -6355,8 +6434,8 @@ void MainWindow::on_actionQRA65_triggered()
m_wideGraph->setRxFreq(ui->RxFreqSpinBox->value());
m_wideGraph->setTxFreq(ui->TxFreqSpinBox->value());
switch_mode (Modes::QRA65);
// 0123456789012345678901234567890123
displayWidgets(nWidgets("1111110101101101000100000011000000"));
// 012345678901234567890123456789012345
displayWidgets(nWidgets("111111010110110100010000001100000000"));
statusChanged();
}
@ -6376,6 +6455,7 @@ void MainWindow::on_actionISCAT_triggered()
m_hsymStop=103;
m_toneSpacing=11025.0/256.0;
WSPR_config(false);
ui->rh_decodes_widget->setVisible (false);
switch_mode(Modes::ISCAT);
m_wideGraph->setMode(m_mode);
m_wideGraph->setModeTx(m_modeTx);
@ -6384,16 +6464,13 @@ void MainWindow::on_actionISCAT_triggered()
if(m_wideGraph->isVisible()) m_wideGraph->hide();
setup_status_bar (true);
ui->cbShMsgs->setChecked(false);
ui->label_7->setText("");
ui->decodedTextBrowser2->setVisible(false);
ui->decodedTextLabel2->setVisible(false);
ui->decodedTextLabel->setText(
ui->lh_decodes_headings_label->setText(
" UTC Sync dB DT DF F1 M N C T ");
ui->tabWidget->setCurrentIndex(0);
ui->sbSubmode->setMaximum(1);
if(m_nSubMode==0) ui->TxFreqSpinBox->setValue(1012);
if(m_nSubMode==1) ui->TxFreqSpinBox->setValue(560);
displayWidgets(nWidgets("1001110000000001100000000000000000"));
displayWidgets(nWidgets("100111000000000110000000000000000000"));
fast_config(true);
statusChanged ();
}
@ -6443,20 +6520,20 @@ void MainWindow::on_actionMSK144_triggered()
ui->RxFreqSpinBox->setMinimum(1400);
ui->RxFreqSpinBox->setMaximum(1600);
ui->RxFreqSpinBox->setSingleStep(10);
ui->decodedTextLabel->setText(" UTC dB T Freq " + tr ("Message"));
ui->decodedTextLabel2->setText(" UTC dB T Freq " + tr ("Message"));
ui->lh_decodes_headings_label->setText(" UTC dB T Freq " + tr ("Message"));
ui->rh_decodes_headings_label->setText(" UTC dB T Freq " + tr ("Message"));
m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_fastGraph->setTRPeriod(m_TRperiod);
ui->label_6->setText(tr ("Band Activity"));
ui->label_7->setText(tr ("Tx Messages"));
ui->lh_decodes_title_label->setText(tr ("Band Activity"));
ui->rh_decodes_title_label->setText(tr ("Tx Messages"));
ui->actionMSK144->setChecked(true);
ui->rptSpinBox->setMinimum(-8);
ui->rptSpinBox->setMaximum(24);
ui->rptSpinBox->setValue(0);
ui->rptSpinBox->setSingleStep(1);
ui->sbFtol->values ({20, 50, 100, 200});
displayWidgets(nWidgets("1011111101000000000100010000100000"));
displayWidgets(nWidgets("101111110100000000010001000010000000"));
fast_config(m_bFastMode);
statusChanged();
@ -6488,13 +6565,15 @@ void MainWindow::on_actionWSPR_triggered()
setup_status_bar (false);
ui->actionWSPR->setChecked(true);
VHF_features_enabled(false);
ui->WSPRfreqSpinBox->setMinimum(1400);
ui->WSPRfreqSpinBox->setMaximum(1600);
m_wideGraph->setPeriod(m_TRperiod,m_nsps);
m_wideGraph->setMode(m_mode);
m_wideGraph->setModeTx(m_modeTx);
m_bFastMode=false;
m_bFast9=false;
ui->TxFreqSpinBox->setValue(ui->WSPRfreqSpinBox->value());
displayWidgets(nWidgets("0000000000000000010100000000000000"));
displayWidgets(nWidgets("000000000000000001010000000000000000"));
fast_config(false);
statusChanged();
}
@ -6526,8 +6605,8 @@ void MainWindow::on_actionEcho_triggered()
m_bFastMode=false;
m_bFast9=false;
WSPR_config(true);
ui->decodedTextLabel->setText(" UTC N Level Sig DF Width Q");
displayWidgets(nWidgets("0000000000000000000000100000000000"));
ui->lh_decodes_headings_label->setText(" UTC N Level Sig DF Width Q");
displayWidgets(nWidgets("000000000000000000000010000000000000"));
fast_config(false);
statusChanged();
}
@ -6551,9 +6630,9 @@ void MainWindow::on_actionFreqCal_triggered()
ui->RxFreqSpinBox->setValue(1500);
setup_status_bar (true);
// 18:15:47 0 1 1500 1550.349 0.100 3.5 10.2
ui->decodedTextLabel->setText(" UTC Freq CAL Offset fMeas DF Level S/N");
ui->lh_decodes_headings_label->setText(" UTC Freq CAL Offset fMeas DF Level S/N");
ui->measure_check_box->setChecked (false);
displayWidgets(nWidgets("0011010000000000000000000000010000"));
displayWidgets(nWidgets("001101000000000000000000000001000000"));
statusChanged();
}
@ -6584,23 +6663,19 @@ void MainWindow::switch_mode (Mode mode)
ui->tabWidget->setVisible(!b);
if(b) {
ui->DX_controls_widget->setVisible(false);
ui->decodedTextBrowser2->setVisible(false);
ui->decodedTextLabel2->setVisible(false);
ui->label_6->setVisible(false);
ui->label_7->setVisible(false);
ui->rh_decodes_widget->setVisible (false);
ui->lh_decodes_title_label->setVisible(false);
}
}
void MainWindow::WSPR_config(bool b)
{
ui->decodedTextBrowser2->setVisible(!b);
ui->decodedTextLabel2->setVisible(!b and ui->cbMenus->isChecked());
ui->rh_decodes_widget->setVisible(!b);
ui->controls_stack_widget->setCurrentIndex (b && m_mode != "Echo" ? 1 : 0);
ui->QSO_controls_widget->setVisible (!b);
ui->DX_controls_widget->setVisible (!b);
ui->WSPR_controls_widget->setVisible (b);
ui->label_6->setVisible(!b and ui->cbMenus->isChecked());
ui->label_7->setVisible(!b and ui->cbMenus->isChecked());
ui->lh_decodes_title_label->setVisible(!b and ui->cbMenus->isChecked());
ui->logQSOButton->setVisible(!b);
ui->DecodeButton->setEnabled(!b);
bool bFST4W=(m_mode=="FST4W");
@ -6614,7 +6689,7 @@ void MainWindow::WSPR_config(bool b)
QString t="UTC dB DT Freq Drift Call Grid dBm ";
if(m_config.miles()) t += " mi";
if(!m_config.miles()) t += " km";
ui->decodedTextLabel->setText(t);
ui->lh_decodes_headings_label->setText(t);
if (m_config.is_transceiver_online ()) {
m_config.transceiver_tx_frequency (0); // turn off split
}
@ -6659,6 +6734,41 @@ void MainWindow::on_RxFreqSpinBox_valueChanged(int n)
statusUpdate ();
}
void MainWindow::on_sbF_Low_valueChanged(int n)
{
m_wideGraph->setFST4_FreqRange(n,ui->sbF_High->value());
chk_FST4_freq_range();
}
void MainWindow::on_sbF_High_valueChanged(int n)
{
m_wideGraph->setFST4_FreqRange(ui->sbF_Low->value(),n);
chk_FST4_freq_range();
}
void MainWindow::chk_FST4_freq_range()
{
if(!m_bOK_to_chk) return;
if(ui->sbF_Low->value() < m_wideGraph->nStartFreq()) ui->sbF_Low->setValue(m_wideGraph->nStartFreq());
if(ui->sbF_High->value() > m_wideGraph->Fmax()) {
int n=m_wideGraph->Fmax()/100;
ui->sbF_High->setValue(100*n);
}
int maxDiff=2000;
if(m_TRperiod==120) maxDiff=1000;
if(m_TRperiod==300) maxDiff=400;
if(m_TRperiod>=900) maxDiff=200;
int diff=ui->sbF_High->value() - ui->sbF_Low->value();
if(diff<100 or diff>maxDiff) {
ui->sbF_Low->setStyleSheet("QSpinBox { background-color: red; }");
ui->sbF_High->setStyleSheet("QSpinBox { background-color: red; }");
} else {
ui->sbF_Low->setStyleSheet("");
ui->sbF_High->setStyleSheet("");
}
}
void MainWindow::on_actionQuickDecode_toggled (bool checked)
{
m_ndepth ^= (-checked ^ m_ndepth) & 0x00000001;
@ -7205,6 +7315,7 @@ void MainWindow::transmit (double snr)
int hmod=1; //No FST4/W submodes
double dfreq=hmod*12000.0/nsps;
double f0=ui->WSPRfreqSpinBox->value() - m_XIT;
if(m_mode=="FST4") f0=ui->TxFreqSpinBox->value() - m_XIT;
if(!m_tune) f0 += + 1.5*dfreq;
Q_EMIT sendMessage (m_mode, NUM_FST4_SYMBOLS,double(nsps),f0,toneSpacing,
m_soundOutput,m_config.audio_output_channel(),
@ -7435,7 +7546,7 @@ void MainWindow::transmitDisplay (bool transmitting)
auto QSY_allowed = !transmitting or m_config.tx_QSY_allowed () or
!m_config.split_mode ();
if (ui->cbHoldTxFreq->isChecked ()) {
ui->RxFreqSpinBox->setEnabled (QSY_allowed);
ui->TxFreqSpinBox->setEnabled (QSY_allowed);
ui->pbT2R->setEnabled (QSY_allowed);
}
@ -7491,19 +7602,25 @@ void::MainWindow::VHF_features_enabled(bool b)
void MainWindow::on_sbTR_valueChanged(int value)
{
// if(!m_bFastMode and n>m_nSubMode) m_MinW=m_nSubMode;
// if(!m_bFastMode and n>m_nSubMode) m_MinW=m_nSubMode;
if(m_bFastMode or m_mode=="FreqCal" or m_mode=="FST4" or m_mode=="FST4W" or m_mode=="QRA65") {
m_TRperiod = value;
if (m_mode == "FST4" or m_mode == "FST4W" or m_mode=="QRA65") {
if (m_TRperiod < 60) {
ui->decodedTextLabel->setText(" UTC dB DT Freq " + tr ("Message"));
if (m_mode != "FST4W") {
ui->decodedTextLabel2->setText(" UTC dB DT Freq " + tr ("Message"));
if (m_mode == "FST4" || m_mode == "FST4W" || m_mode=="QRA65")
{
if (m_TRperiod < 60)
{
ui->lh_decodes_headings_label->setText(" UTC dB DT Freq " + tr ("Message"));
if (m_mode != "FST4W")
{
ui->rh_decodes_headings_label->setText(" UTC dB DT Freq " + tr ("Message"));
}
} else {
ui->decodedTextLabel->setText("UTC dB DT Freq " + tr ("Message"));
if (m_mode != "FST4W") {
ui->decodedTextLabel2->setText("UTC dB DT Freq " + tr ("Message"));
}
else
{
ui->lh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message"));
if (m_mode != "FST4W")
{
ui->rh_decodes_headings_label->setText("UTC dB DT Freq " + tr ("Message"));
}
}
}
@ -7513,7 +7630,7 @@ void MainWindow::on_sbTR_valueChanged(int value)
m_wideGraph->setPeriod (value, m_nsps);
progressBar.setMaximum (value);
}
if(m_mode=="FST4") sbFtolMaxVal();
if(m_mode=="FST4") chk_FST4_freq_range();
if(m_monitoring) {
on_stopButton_clicked();
on_monitorButton_clicked(true);
@ -7524,14 +7641,6 @@ void MainWindow::on_sbTR_valueChanged(int value)
statusUpdate ();
}
void MainWindow::sbFtolMaxVal()
{
if(m_TRperiod<=60) ui->sbFtol->setMaximum(1000);
if(m_TRperiod==120) ui->sbFtol->setMaximum(500);
if(m_TRperiod==300) ui->sbFtol->setMaximum(200);
if(m_TRperiod>=900) ui->sbFtol->setMaximum(100);
}
void MainWindow::on_sbTR_FST4W_valueChanged(int value)
{
on_sbTR_valueChanged(value);
@ -9086,13 +9195,8 @@ void MainWindow::write_all(QString txRx, QString message)
t = t.asprintf("%5d",ui->TxFreqSpinBox->value());
if (txRx=="Tx") msg=" 0 0.0" + t + " " + message;
auto time = QDateTime::currentDateTimeUtc ();
if( txRx=="Rx" ) {
double tdec = fmod(double(time.time().second()),m_TRperiod);
if( "MSK144" != m_mode && tdec < 0.5*m_TRperiod ) {
tdec+=m_TRperiod;
}
time = time.addSecs(-tdec);
}
if( txRx=="Rx" ) time=m_dateTimeSeqStart;
t = t.asprintf("%10.3f ",m_freqNominal/1.e6);
if (m_diskData) {
if (m_fileDateTime.size()==11) {

View File

@ -166,6 +166,7 @@ private slots:
void on_actionSpecial_mouse_commands_triggered();
void on_actionSolve_FreqCal_triggered();
void on_actionCopyright_Notice_triggered();
void on_actionSWL_Mode_triggered (bool checked);
void on_DecodeButton_clicked (bool);
void decode();
void decodeBusy(bool b);
@ -307,6 +308,9 @@ private slots:
void on_sbNlist_valueChanged(int n);
void on_sbNslots_valueChanged(int n);
void on_sbMax_dB_valueChanged(int n);
void on_sbF_Low_valueChanged(int n);
void on_sbF_High_valueChanged(int n);
void chk_FST4_freq_range();
void on_pbFoxReset_clicked();
void on_comboBoxHoundSort_activated (int index);
void not_GA_warning_message ();
@ -314,7 +318,6 @@ private slots:
void on_pbBestSP_clicked();
void on_RoundRobin_currentTextChanged(QString text);
void setTxMsg(int n);
void sbFtolMaxVal();
bool stdCall(QString const& w);
void remote_configure (QString const& mode, quint32 frequency_tolerance, QString const& submode
, bool fast_mode, quint32 tr_period, quint32 rx_df, QString const& dx_call
@ -401,7 +404,6 @@ private:
qint64 m_msErase;
qint64 m_secBandChanged;
qint64 m_freqMoon;
qint64 m_msec0;
qint64 m_fullFoxCallTime;
Frequency m_freqNominal;
@ -527,6 +529,7 @@ private:
bool m_bWarnedSplit=false;
bool m_bTUmsg;
bool m_bBestSPArmed=false;
bool m_bOK_to_chk=false;
enum
{
@ -659,6 +662,7 @@ private:
QDateTime m_dateTimeSentTx3;
QDateTime m_dateTimeRcvdRR73;
QDateTime m_dateTimeBestSP;
QDateTime m_dateTimeSeqStart; //Nominal start time of Rx sequence about to be decoded
QSharedMemory *mem_jt9;
QString m_QSOText;

File diff suppressed because it is too large Load Diff

View File

@ -163,7 +163,6 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed)
int iz=XfromFreq(5000.0);
int jz=iz*m_binsPerPixel;
m_fMax=FreqfromX(iz);
if(bScroll and swide[0]<1.e29) {
flat4_(swide,&iz,&m_Flatten);
if(!m_bReplot) flat4_(&dec_data.savg[j0],&jz,&m_Flatten);
@ -516,6 +515,15 @@ void CPlotter::DrawOverlay() //DrawOverlay()
or m_mode=="QRA64" or m_mode=="QRA65" or m_mode=="FT8" or m_mode=="FT4"
or m_mode.startsWith("FST4")) {
if(m_mode=="FST4" and !m_bSingleDecode) {
x1=XfromFreq(m_nfa);
x2=XfromFreq(m_nfb);
painter0.drawLine(x1,25,x1+5,30); // Mark FST4 F_Low
painter0.drawLine(x1,25,x1+5,20);
painter0.drawLine(x2,25,x2-5,30); // Mark FST4 F_High
painter0.drawLine(x2,25,x2-5,20);
}
if(m_mode=="QRA64" or m_mode=="QRA65" or (m_mode=="JT65" and m_bVHF)) {
painter0.setPen(penGreen);
x1=XfromFreq(m_rxFreq-m_tol);
@ -665,7 +673,9 @@ void CPlotter::setPlot2dZero(int plot2dZero) //setPlot2dZero
void CPlotter::setStartFreq(int f) //SetStartFreq()
{
m_startFreq=f;
m_fMax=FreqfromX(XfromFreq(5000.0));
resizeEvent(NULL);
DrawOverlay();
update();
}
@ -686,6 +696,7 @@ void CPlotter::setRxRange(int fMin) //setRxRange
void CPlotter::setBinsPerPixel(int n) //setBinsPerPixel
{
m_binsPerPixel = n;
m_fMax=FreqfromX(XfromFreq(5000.0));
DrawOverlay(); //Redraw scales and ticks
update(); //trigger a new paintEvent}
}
@ -819,9 +830,22 @@ void CPlotter::setFlatten(bool b1, bool b2)
void CPlotter::setTol(int n) //setTol()
{
m_tol=n;
DrawOverlay();
}
void CPlotter::setFST4_FreqRange(int fLow,int fHigh)
{
m_nfa=fLow;
m_nfb=fHigh;
DrawOverlay();
update();
}
void CPlotter::setSingleDecode(bool b)
{
m_bSingleDecode=b;
}
void CPlotter::setColours(QVector<QColor> const& cl)
{
g_ColorTbl = cl;

View File

@ -83,6 +83,9 @@ public:
void drawRed(int ia, int ib, float swide[]);
void setVHF(bool bVHF);
void setRedFile(QString fRed);
void setFST4_FreqRange(int fLow,int fHigh);
void setSingleDecode(bool b);
bool scaleOK () const {return m_bScaleOK;}
signals:
void freezeDecode1(int n);
@ -111,6 +114,7 @@ private:
bool m_bReference;
bool m_bReference0;
bool m_bVHF;
bool m_bSingleDecode;
float m_fSpan;
@ -125,6 +129,8 @@ private:
qint32 m_nSubMode;
qint32 m_ia;
qint32 m_ib;
qint32 m_nfa;
qint32 m_nfb;
QPixmap m_WaterfallPixmap;
QPixmap m_2DPixmap;

View File

@ -500,6 +500,16 @@ void WideGraph::setTol(int n) //setTol
ui->widePlot->update();
}
void WideGraph::setFST4_FreqRange(int fLow,int fHigh)
{
ui->widePlot->setFST4_FreqRange(fLow,fHigh);
}
void WideGraph::setSingleDecode(bool b)
{
ui->widePlot->setSingleDecode(b);
}
void WideGraph::on_smoSpinBox_valueChanged(int n)
{
m_nsmo=n;

View File

@ -49,6 +49,8 @@ public:
void drawRed(int ia, int ib);
void setVHF(bool bVHF);
void setRedFile(QString fRed);
void setFST4_FreqRange(int fLow,int fHigh);
void setSingleDecode(bool b);
signals:
void freezeDecode2(int n);

View File

@ -19,6 +19,7 @@ extern "C" {
#cmakedefine PROJECT_SAMPLES_URL "@PROJECT_SAMPLES_URL@"
#cmakedefine PROJECT_SUMMARY_DESCRIPTION "@PROJECT_SUMMARY_DESCRIPTION@"
#cmakedefine01 HAVE_HAMLIB_OLD_CACHING
#cmakedefine01 HAVE_HAMLIB_CACHING
#cmakedefine01 WSJT_SHARED_RUNTIME