mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-03-23 20:48:33 -04:00
Merge branch 'develop' into feat-fst280
This commit is contained in:
commit
314be8ccb7
.gitignore
Audio
CMakeLists.txtConfiguration.cppConfiguration.hppConfiguration.uiDarwin
Detector
Modulator
NEWSNetwork
Release_Notes.txtTransceiver
Versions.cmakecty.datdisplayWidgets.txtdoc
lib
main.cppmodels
translations
wsjtx_ca.tswsjtx_da.tswsjtx_en.tswsjtx_en_GB.tswsjtx_es.tswsjtx_it.tswsjtx_ja.tswsjtx_zh.tswsjtx_zh_HK.ts
widgets
LazyFillComboBox.cppLazyFillComboBox.hppastro.cppastro.hmainwindow.cppmainwindow.hmainwindow.uiplotter.cppplotter.hwidegraph.cppwidegraph.h
wsjtx_config.h.in
1
.gitignore
vendored
1
.gitignore
vendored
@ -14,6 +14,7 @@ jnq*
|
||||
*.txt
|
||||
*.bak
|
||||
!**/CMakeLists.txt
|
||||
!**/*.txt
|
||||
__pycache__
|
||||
cmake-build-debug
|
||||
cmake-build-release
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -33,8 +33,8 @@ public:
|
||||
Channel channel () const {return m_channel;}
|
||||
|
||||
protected:
|
||||
AudioDevice (QObject * parent = 0)
|
||||
: QIODevice (parent)
|
||||
AudioDevice (QObject * parent = nullptr)
|
||||
: QIODevice {parent}
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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 ()
|
||||
|
@ -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;
|
||||
|
@ -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"));
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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_;
|
||||
|
143
Configuration.ui
143
Configuration.ui
@ -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&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>&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&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>&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>
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
93
NEWS
@ -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
|
||||
---------------------
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
240
doc/building-Boost-libs.txt
Normal 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})
|
||||
|
||||
# ...
|
BIN
doc/user_guide/en/images/FST4W_RoundRobin.png
Normal file
BIN
doc/user_guide/en/images/FST4W_RoundRobin.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 4.7 KiB |
BIN
doc/user_guide/en/images/FST4_Decoding_Limits.png
Normal file
BIN
doc/user_guide/en/images/FST4_Decoding_Limits.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 15 KiB |
BIN
doc/user_guide/en/images/FST4_center.png
Normal file
BIN
doc/user_guide/en/images/FST4_center.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 3.9 KiB |
@ -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]]
|
||||
|
||||
|
40
doc/user_guide/en/intro_subsections.adoc
Normal file
40
doc/user_guide/en/intro_subsections.adoc
Normal 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>>.
|
@ -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 station’s 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 station’s 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.
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
23
doc/user_guide/en/tutorial-example5.adoc
Normal file
23
doc/user_guide/en/tutorial-example5.adoc
Normal 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*.
|
||||
|
18
doc/user_guide/en/tutorial-example6.adoc
Normal file
18
doc/user_guide/en/tutorial-example6.adoc
Normal 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.
|
@ -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[]
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
2
main.cpp
2
main.cpp
@ -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 ++++++++++++++++++++++++++++";
|
||||
|
@ -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
@ -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 "%1"</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 "%1" 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 "%1" 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><pre>%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 "fmt.all" file will be renamed as "fmt.bak"</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:
|
||||
|
||||
"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."</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 "%1"?</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><table cellspacing=1>
|
||||
<tr><td><b>Esc </b></td><td>Stop Tx, abort QSO, clear next-call queue</td></tr>
|
||||
<tr><td><b>F1 </b></td><td>Online User's Guide (Alt: transmit Tx6)</td></tr>
|
||||
@ -3836,7 +3841,7 @@ list. The list can be maintained in Settings (F2).</source>
|
||||
<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>
|
||||
@ -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><table cellpadding=5>
|
||||
<tr>
|
||||
<th align="right">Click on</th>
|
||||
@ -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 'Special operating activity' and
|
||||
@ -3958,176 +3963,176 @@ To do so, check 'Special operating activity' 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 "%1" 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 "%1"</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 "%1"</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>
|
||||
|
@ -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 "%1"</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 "%1" 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 "%1" 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><pre>%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 "fmt.all" file will be renamed as "fmt.bak"</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:
|
||||
|
||||
"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."</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 "%1"?</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><table cellspacing=1>
|
||||
<tr><td><b>Esc </b></td><td>Stop Tx, abort QSO, clear next-call queue</td></tr>
|
||||
<tr><td><b>F1 </b></td><td>Online User's Guide (Alt: transmit Tx6)</td></tr>
|
||||
@ -3836,7 +3841,7 @@ list. The list can be maintained in Settings (F2).</source>
|
||||
<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>
|
||||
@ -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><table cellpadding=5>
|
||||
<tr>
|
||||
<th align="right">Click on</th>
|
||||
@ -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 'Special operating activity' and
|
||||
@ -3958,176 +3963,176 @@ To do so, check 'Special operating activity' 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 "%1" 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 "%1"</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 "%1"</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
3
widgets/LazyFillComboBox.cpp
Normal file
3
widgets/LazyFillComboBox.cpp
Normal file
@ -0,0 +1,3 @@
|
||||
#include "LazyFillComboBox.hpp"
|
||||
|
||||
#include "moc_LazyFillComboBox.cpp"
|
40
widgets/LazyFillComboBox.hpp
Normal file
40
widgets/LazyFillComboBox.hpp
Normal 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
|
@ -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 ();
|
||||
|
@ -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:
|
||||
|
@ -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) {
|
||||
|
@ -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
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user