mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-10 06:22:15 -05:00
Merge branch 'develop' into feat-boost-log
This commit is contained in:
commit
b6d95d54d3
@ -7,4 +7,3 @@ bool AudioDevice::initialize (OpenMode mode, Channel channel)
|
|||||||
// open and ensure we are unbuffered if possible
|
// open and ensure we are unbuffered if possible
|
||||||
return QIODevice::open (mode | QIODevice::Unbuffered);
|
return QIODevice::open (mode | QIODevice::Unbuffered);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,8 +33,8 @@ public:
|
|||||||
Channel channel () const {return m_channel;}
|
Channel channel () const {return m_channel;}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
AudioDevice (QObject * parent = 0)
|
AudioDevice (QObject * parent = nullptr)
|
||||||
: QIODevice (parent)
|
: QIODevice {parent}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,11 +10,9 @@
|
|||||||
|
|
||||||
#include "moc_soundin.cpp"
|
#include "moc_soundin.cpp"
|
||||||
|
|
||||||
bool SoundInput::audioError () const
|
bool SoundInput::checkStream ()
|
||||||
{
|
{
|
||||||
bool result (true);
|
bool result (false);
|
||||||
|
|
||||||
Q_ASSERT_X (m_stream, "SoundInput", "programming error");
|
|
||||||
if (m_stream)
|
if (m_stream)
|
||||||
{
|
{
|
||||||
switch (m_stream->error ())
|
switch (m_stream->error ())
|
||||||
@ -36,9 +34,13 @@ bool SoundInput::audioError () const
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case QAudio::NoError:
|
case QAudio::NoError:
|
||||||
result = false;
|
result = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!result)
|
||||||
|
{
|
||||||
|
stop ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -74,12 +76,13 @@ void SoundInput::start(QAudioDeviceInfo const& device, int framesPerBuffer, Audi
|
|||||||
// qDebug () << "Selected audio input format:" << format;
|
// qDebug () << "Selected audio input format:" << format;
|
||||||
|
|
||||||
m_stream.reset (new QAudioInput {device, format});
|
m_stream.reset (new QAudioInput {device, format});
|
||||||
if (audioError ())
|
if (!checkStream ())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
connect (m_stream.data(), &QAudioInput::stateChanged, this, &SoundInput::handleStateChanged);
|
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 ();
|
//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
|
// the Windows MME version of QAudioInput uses 1/5 of the buffer
|
||||||
@ -89,10 +92,10 @@ void SoundInput::start(QAudioDeviceInfo const& device, int framesPerBuffer, Audi
|
|||||||
#else
|
#else
|
||||||
Q_UNUSED (framesPerBuffer);
|
Q_UNUSED (framesPerBuffer);
|
||||||
#endif
|
#endif
|
||||||
if (sink->initialize (QIODevice::WriteOnly, channel))
|
if (m_sink->initialize (QIODevice::WriteOnly, channel))
|
||||||
{
|
{
|
||||||
m_stream->start (sink);
|
m_stream->start (sink);
|
||||||
audioError ();
|
checkStream ();
|
||||||
cummulative_lost_usec_ = -1;
|
cummulative_lost_usec_ = -1;
|
||||||
//qDebug () << "SoundIn selected buffer size (bytes):" << m_stream->bufferSize () << "peirod size:" << m_stream->periodSize ();
|
//qDebug () << "SoundIn selected buffer size (bytes):" << m_stream->bufferSize () << "peirod size:" << m_stream->periodSize ();
|
||||||
}
|
}
|
||||||
@ -107,7 +110,7 @@ void SoundInput::suspend ()
|
|||||||
if (m_stream)
|
if (m_stream)
|
||||||
{
|
{
|
||||||
m_stream->suspend ();
|
m_stream->suspend ();
|
||||||
audioError ();
|
checkStream ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,14 +125,12 @@ void SoundInput::resume ()
|
|||||||
if (m_stream)
|
if (m_stream)
|
||||||
{
|
{
|
||||||
m_stream->resume ();
|
m_stream->resume ();
|
||||||
audioError ();
|
checkStream ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundInput::handleStateChanged (QAudio::State newState)
|
void SoundInput::handleStateChanged (QAudio::State newState)
|
||||||
{
|
{
|
||||||
//qDebug () << "SoundInput::handleStateChanged: newState:" << newState;
|
|
||||||
|
|
||||||
switch (newState)
|
switch (newState)
|
||||||
{
|
{
|
||||||
case QAudio::IdleState:
|
case QAudio::IdleState:
|
||||||
@ -152,7 +153,7 @@ void SoundInput::handleStateChanged (QAudio::State newState)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
case QAudio::StoppedState:
|
case QAudio::StoppedState:
|
||||||
if (audioError ())
|
if (!checkStream ())
|
||||||
{
|
{
|
||||||
Q_EMIT status (tr ("Error"));
|
Q_EMIT status (tr ("Error"));
|
||||||
}
|
}
|
||||||
@ -193,11 +194,6 @@ void SoundInput::stop()
|
|||||||
m_stream->stop ();
|
m_stream->stop ();
|
||||||
}
|
}
|
||||||
m_stream.reset ();
|
m_stream.reset ();
|
||||||
|
|
||||||
if (m_sink)
|
|
||||||
{
|
|
||||||
m_sink->close ();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SoundInput::~SoundInput ()
|
SoundInput::~SoundInput ()
|
||||||
|
@ -24,7 +24,6 @@ class SoundInput
|
|||||||
public:
|
public:
|
||||||
SoundInput (QObject * parent = nullptr)
|
SoundInput (QObject * parent = nullptr)
|
||||||
: QObject {parent}
|
: QObject {parent}
|
||||||
, m_sink {nullptr}
|
|
||||||
, cummulative_lost_usec_ {std::numeric_limits<qint64>::min ()}
|
, cummulative_lost_usec_ {std::numeric_limits<qint64>::min ()}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -47,7 +46,7 @@ private:
|
|||||||
// used internally
|
// used internally
|
||||||
Q_SLOT void handleStateChanged (QAudio::State);
|
Q_SLOT void handleStateChanged (QAudio::State);
|
||||||
|
|
||||||
bool audioError () const;
|
bool checkStream ();
|
||||||
|
|
||||||
QScopedPointer<QAudioInput> m_stream;
|
QScopedPointer<QAudioInput> m_stream;
|
||||||
QPointer<AudioDevice> m_sink;
|
QPointer<AudioDevice> m_sink;
|
||||||
|
@ -7,11 +7,13 @@
|
|||||||
#include <qmath.h>
|
#include <qmath.h>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include "Audio/AudioDevice.hpp"
|
||||||
|
|
||||||
#include "moc_soundout.cpp"
|
#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");
|
Q_ASSERT_X (m_stream, "SoundOutput", "programming error");
|
||||||
if (m_stream) {
|
if (m_stream) {
|
||||||
@ -34,7 +36,7 @@ bool SoundOutput::audioError () const
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case QAudio::NoError:
|
case QAudio::NoError:
|
||||||
result = false;
|
result = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -42,16 +44,20 @@ bool SoundOutput::audioError () const
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SoundOutput::setFormat (QAudioDeviceInfo const& device, unsigned channels, int frames_buffered)
|
void SoundOutput::setFormat (QAudioDeviceInfo const& device, unsigned channels, int frames_buffered)
|
||||||
{
|
|
||||||
if (!device.isNull ())
|
|
||||||
{
|
{
|
||||||
Q_ASSERT (0 < channels && channels < 3);
|
Q_ASSERT (0 < channels && channels < 3);
|
||||||
|
m_device = device;
|
||||||
|
m_channels = channels;
|
||||||
m_framesBuffered = frames_buffered;
|
m_framesBuffered = frames_buffered;
|
||||||
|
}
|
||||||
|
|
||||||
QAudioFormat format (device.preferredFormat ());
|
void SoundOutput::restart (AudioDevice * source)
|
||||||
|
{
|
||||||
|
if (!m_device.isNull ())
|
||||||
|
{
|
||||||
|
QAudioFormat format (m_device.preferredFormat ());
|
||||||
// qDebug () << "Preferred audio output format:" << format;
|
// qDebug () << "Preferred audio output format:" << format;
|
||||||
format.setChannelCount (channels);
|
format.setChannelCount (m_channels);
|
||||||
format.setCodec ("audio/pcm");
|
format.setCodec ("audio/pcm");
|
||||||
format.setSampleRate (48000);
|
format.setSampleRate (48000);
|
||||||
format.setSampleType (QAudioFormat::SignedInt);
|
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."));
|
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."));
|
Q_EMIT error (tr ("Requested output audio format is not supported on device."));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// qDebug () << "Selected audio output format:" << format;
|
// qDebug () << "Selected audio output format:" << format;
|
||||||
|
m_stream.reset (new QAudioOutput (m_device, format));
|
||||||
m_stream.reset (new QAudioOutput (device, format));
|
checkStream ();
|
||||||
audioError ();
|
|
||||||
m_stream->setVolume (m_volume);
|
m_stream->setVolume (m_volume);
|
||||||
m_stream->setNotifyInterval(100);
|
m_stream->setNotifyInterval(1000);
|
||||||
error_ = false;
|
error_ = false;
|
||||||
|
|
||||||
connect (m_stream.data(), &QAudioOutput::stateChanged, this, &SoundOutput::handleStateChanged);
|
connect (m_stream.data(), &QAudioOutput::stateChanged, this, &SoundOutput::handleStateChanged);
|
||||||
|
connect (m_stream.data(), &QAudioOutput::notify, [this] () {checkStream ();});
|
||||||
|
|
||||||
// qDebug() << "A" << m_volume << m_stream->notifyInterval();
|
// qDebug() << "A" << m_volume << m_stream->notifyInterval();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void SoundOutput::restart (QIODevice * source)
|
|
||||||
{
|
|
||||||
if (!m_stream)
|
if (!m_stream)
|
||||||
{
|
{
|
||||||
if (!error_)
|
if (!error_)
|
||||||
@ -109,6 +111,7 @@ void SoundOutput::restart (QIODevice * source)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
m_stream->setCategory ("production");
|
m_stream->setCategory ("production");
|
||||||
|
m_source = source;
|
||||||
m_stream->start (source);
|
m_stream->start (source);
|
||||||
// qDebug () << "SoundOut selected buffer size (bytes):" << m_stream->bufferSize () << "period size:" << m_stream->periodSize ();
|
// qDebug () << "SoundOut selected buffer size (bytes):" << m_stream->bufferSize () << "period size:" << m_stream->periodSize ();
|
||||||
}
|
}
|
||||||
@ -118,7 +121,7 @@ void SoundOutput::suspend ()
|
|||||||
if (m_stream && QAudio::ActiveState == m_stream->state ())
|
if (m_stream && QAudio::ActiveState == m_stream->state ())
|
||||||
{
|
{
|
||||||
m_stream->suspend ();
|
m_stream->suspend ();
|
||||||
audioError ();
|
checkStream ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,7 +130,7 @@ void SoundOutput::resume ()
|
|||||||
if (m_stream && QAudio::SuspendedState == m_stream->state ())
|
if (m_stream && QAudio::SuspendedState == m_stream->state ())
|
||||||
{
|
{
|
||||||
m_stream->resume ();
|
m_stream->resume ();
|
||||||
audioError ();
|
checkStream ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,7 +139,7 @@ void SoundOutput::reset ()
|
|||||||
if (m_stream)
|
if (m_stream)
|
||||||
{
|
{
|
||||||
m_stream->reset ();
|
m_stream->reset ();
|
||||||
audioError ();
|
checkStream ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,9 +147,10 @@ void SoundOutput::stop ()
|
|||||||
{
|
{
|
||||||
if (m_stream)
|
if (m_stream)
|
||||||
{
|
{
|
||||||
|
m_stream->reset ();
|
||||||
m_stream->stop ();
|
m_stream->stop ();
|
||||||
audioError ();
|
|
||||||
}
|
}
|
||||||
|
m_stream.reset ();
|
||||||
}
|
}
|
||||||
|
|
||||||
qreal SoundOutput::attenuation () const
|
qreal SoundOutput::attenuation () const
|
||||||
@ -176,8 +180,6 @@ void SoundOutput::resetAttenuation ()
|
|||||||
|
|
||||||
void SoundOutput::handleStateChanged (QAudio::State newState)
|
void SoundOutput::handleStateChanged (QAudio::State newState)
|
||||||
{
|
{
|
||||||
// qDebug () << "SoundOutput::handleStateChanged: newState:" << newState;
|
|
||||||
|
|
||||||
switch (newState)
|
switch (newState)
|
||||||
{
|
{
|
||||||
case QAudio::IdleState:
|
case QAudio::IdleState:
|
||||||
@ -199,7 +201,7 @@ void SoundOutput::handleStateChanged (QAudio::State newState)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
case QAudio::StoppedState:
|
case QAudio::StoppedState:
|
||||||
if (audioError ())
|
if (!checkStream ())
|
||||||
{
|
{
|
||||||
Q_EMIT status (tr ("Error"));
|
Q_EMIT status (tr ("Error"));
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,9 @@
|
|||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QAudioOutput>
|
#include <QAudioOutput>
|
||||||
#include <QAudioDeviceInfo>
|
#include <QAudioDeviceInfo>
|
||||||
|
#include <QPointer>
|
||||||
|
|
||||||
|
class AudioDevice;
|
||||||
class QAudioDeviceInfo;
|
class QAudioDeviceInfo;
|
||||||
|
|
||||||
// An instance of this sends audio data to a specified soundcard.
|
// An instance of this sends audio data to a specified soundcard.
|
||||||
@ -28,7 +30,7 @@ public:
|
|||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void setFormat (QAudioDeviceInfo const& device, unsigned channels, int frames_buffered = 0);
|
void setFormat (QAudioDeviceInfo const& device, unsigned channels, int frames_buffered = 0);
|
||||||
void restart (QIODevice *);
|
void restart (AudioDevice *);
|
||||||
void suspend ();
|
void suspend ();
|
||||||
void resume ();
|
void resume ();
|
||||||
void reset ();
|
void reset ();
|
||||||
@ -41,13 +43,16 @@ Q_SIGNALS:
|
|||||||
void status (QString message) const;
|
void status (QString message) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool audioError () const;
|
bool checkStream () const;
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void handleStateChanged (QAudio::State);
|
void handleStateChanged (QAudio::State);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QAudioDeviceInfo m_device;
|
||||||
|
unsigned m_channels;
|
||||||
QScopedPointer<QAudioOutput> m_stream;
|
QScopedPointer<QAudioOutput> m_stream;
|
||||||
|
QPointer<AudioDevice> m_source;
|
||||||
int m_framesBuffered;
|
int m_framesBuffered;
|
||||||
qreal m_volume;
|
qreal m_volume;
|
||||||
bool error_;
|
bool error_;
|
||||||
|
@ -293,6 +293,7 @@ set (wsjt_qt_CXXSRCS
|
|||||||
logbook/WorkedBefore.cpp
|
logbook/WorkedBefore.cpp
|
||||||
logbook/Multiplier.cpp
|
logbook/Multiplier.cpp
|
||||||
Network/NetworkAccessManager.cpp
|
Network/NetworkAccessManager.cpp
|
||||||
|
widgets/LazyFillComboBox.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set (wsjt_qtmm_CXXSRCS
|
set (wsjt_qtmm_CXXSRCS
|
||||||
|
@ -188,6 +188,7 @@
|
|||||||
#include "Network/LotWUsers.hpp"
|
#include "Network/LotWUsers.hpp"
|
||||||
#include "models/DecodeHighlightingModel.hpp"
|
#include "models/DecodeHighlightingModel.hpp"
|
||||||
#include "logbook/logbook.h"
|
#include "logbook/logbook.h"
|
||||||
|
#include "widgets/LazyFillComboBox.hpp"
|
||||||
|
|
||||||
#include "ui_Configuration.h"
|
#include "ui_Configuration.h"
|
||||||
#include "moc_Configuration.cpp"
|
#include "moc_Configuration.cpp"
|
||||||
@ -432,7 +433,6 @@ private:
|
|||||||
void read_settings ();
|
void read_settings ();
|
||||||
void write_settings ();
|
void write_settings ();
|
||||||
|
|
||||||
Q_SLOT void lazy_models_load (int);
|
|
||||||
void find_audio_devices ();
|
void find_audio_devices ();
|
||||||
QAudioDeviceInfo find_audio_device (QAudio::Mode, QComboBox *, QString const& device_name);
|
QAudioDeviceInfo find_audio_device (QAudio::Mode, QComboBox *, QString const& device_name);
|
||||||
void load_audio_devices (QAudio::Mode, QComboBox *, QAudioDeviceInfo *);
|
void load_audio_devices (QAudio::Mode, QComboBox *, QAudioDeviceInfo *);
|
||||||
@ -653,9 +653,13 @@ private:
|
|||||||
bool pwrBandTuneMemory_;
|
bool pwrBandTuneMemory_;
|
||||||
|
|
||||||
QAudioDeviceInfo audio_input_device_;
|
QAudioDeviceInfo audio_input_device_;
|
||||||
|
QAudioDeviceInfo next_audio_input_device_;
|
||||||
AudioDevice::Channel audio_input_channel_;
|
AudioDevice::Channel audio_input_channel_;
|
||||||
|
AudioDevice::Channel next_audio_input_channel_;
|
||||||
QAudioDeviceInfo audio_output_device_;
|
QAudioDeviceInfo audio_output_device_;
|
||||||
|
QAudioDeviceInfo next_audio_output_device_;
|
||||||
AudioDevice::Channel audio_output_channel_;
|
AudioDevice::Channel audio_output_channel_;
|
||||||
|
AudioDevice::Channel next_audio_output_channel_;
|
||||||
|
|
||||||
friend class Configuration;
|
friend class Configuration;
|
||||||
};
|
};
|
||||||
@ -856,6 +860,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
|
bool Configuration::valid_n1mm_info () const
|
||||||
{
|
{
|
||||||
// do very rudimentary checking on the n1mm server name and port number.
|
// do very rudimentary checking on the n1mm server name and port number.
|
||||||
@ -1029,6 +1043,17 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
|
|||||||
// this must be done after the default paths above are set
|
// this must be done after the default paths above are set
|
||||||
read_settings ();
|
read_settings ();
|
||||||
|
|
||||||
|
connect (ui_->sound_input_combo_box, &LazyFillComboBox::about_to_show_popup, [this] () {
|
||||||
|
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_);
|
||||||
|
});
|
||||||
|
connect (ui_->sound_output_combo_box, &LazyFillComboBox::about_to_show_popup, [this] () {
|
||||||
|
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_);
|
||||||
|
});
|
||||||
|
|
||||||
// set up LoTW users CSV file fetching
|
// set up LoTW users CSV file fetching
|
||||||
connect (&lotw_users_, &LotWUsers::load_finished, [this] () {
|
connect (&lotw_users_, &LotWUsers::load_finished, [this] () {
|
||||||
ui_->LotW_CSV_fetch_push_button->setEnabled (true);
|
ui_->LotW_CSV_fetch_push_button->setEnabled (true);
|
||||||
@ -1102,7 +1127,6 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
|
|||||||
//
|
//
|
||||||
// setup hooks to keep audio channels aligned with devices
|
// 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;
|
||||||
using namespace std::placeholders;
|
using namespace std::placeholders;
|
||||||
@ -1199,6 +1223,11 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
|
|||||||
enumerate_rigs ();
|
enumerate_rigs ();
|
||||||
initialize_models ();
|
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_ = new QThread {this};
|
||||||
transceiver_thread_->start ();
|
transceiver_thread_->start ();
|
||||||
}
|
}
|
||||||
@ -1210,31 +1239,14 @@ Configuration::impl::~impl ()
|
|||||||
write_settings ();
|
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 ()
|
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"};
|
SettingsGroup g {settings_, "Configuration"};
|
||||||
find_audio_devices ();
|
find_audio_devices ();
|
||||||
@ -1413,8 +1425,6 @@ void Configuration::impl::read_settings ()
|
|||||||
save_directory_.setPath (settings_->value ("SaveDir", default_save_directory_.absolutePath ()).toString ());
|
save_directory_.setPath (settings_->value ("SaveDir", default_save_directory_.absolutePath ()).toString ());
|
||||||
azel_directory_.setPath (settings_->value ("AzElDir", default_azel_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> ();
|
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 ();
|
monitor_off_at_startup_ = settings_->value ("MonitorOFF", false).toBool ();
|
||||||
@ -1522,24 +1532,24 @@ void Configuration::impl::find_audio_devices ()
|
|||||||
// retrieve audio input device
|
// retrieve audio input device
|
||||||
//
|
//
|
||||||
auto saved_name = settings_->value ("SoundInName").toString ();
|
auto saved_name = settings_->value ("SoundInName").toString ();
|
||||||
if (audio_input_device_.deviceName () != saved_name)
|
if (next_audio_input_device_.deviceName () != saved_name || next_audio_input_device_.isNull ())
|
||||||
{
|
{
|
||||||
audio_input_device_ = find_audio_device (QAudio::AudioInput, ui_->sound_input_combo_box, saved_name);
|
next_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 ());
|
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);
|
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_);
|
ui_->sound_input_channel_combo_box->setCurrentIndex (next_audio_input_channel_);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// retrieve audio output device
|
// retrieve audio output device
|
||||||
//
|
//
|
||||||
saved_name = settings_->value("SoundOutName").toString();
|
saved_name = settings_->value("SoundOutName").toString();
|
||||||
if (audio_output_device_.deviceName () != saved_name)
|
if (next_audio_output_device_.deviceName () != saved_name || next_audio_output_device_.isNull ())
|
||||||
{
|
{
|
||||||
audio_output_channel_ = AudioDevice::fromString (settings_->value ("AudioOutputChannel", "Mono").toString ());
|
next_audio_output_device_ = find_audio_device (QAudio::AudioOutput, ui_->sound_output_combo_box, saved_name);
|
||||||
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);
|
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_);
|
ui_->sound_output_channel_combo_box->setCurrentIndex (next_audio_output_channel_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1562,10 +1572,16 @@ void Configuration::impl::write_settings ()
|
|||||||
settings_->setValue ("PTTport", rig_params_.ptt_port);
|
settings_->setValue ("PTTport", rig_params_.ptt_port);
|
||||||
settings_->setValue ("SaveDir", save_directory_.absolutePath ());
|
settings_->setValue ("SaveDir", save_directory_.absolutePath ());
|
||||||
settings_->setValue ("AzElDir", azel_directory_.absolutePath ());
|
settings_->setValue ("AzElDir", azel_directory_.absolutePath ());
|
||||||
|
if (!audio_input_device_.isNull ())
|
||||||
|
{
|
||||||
settings_->setValue ("SoundInName", audio_input_device_.deviceName ());
|
settings_->setValue ("SoundInName", audio_input_device_.deviceName ());
|
||||||
settings_->setValue ("SoundOutName", audio_output_device_.deviceName ());
|
|
||||||
settings_->setValue ("AudioInputChannel", AudioDevice::toString (audio_input_channel_));
|
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 ("AudioOutputChannel", AudioDevice::toString (audio_output_channel_));
|
||||||
|
}
|
||||||
settings_->setValue ("Type2MsgGen", QVariant::fromValue (type_2_msg_gen_));
|
settings_->setValue ("Type2MsgGen", QVariant::fromValue (type_2_msg_gen_));
|
||||||
settings_->setValue ("MonitorOFF", monitor_off_at_startup_);
|
settings_->setValue ("MonitorOFF", monitor_off_at_startup_);
|
||||||
settings_->setValue ("MonitorLastUsed", monitor_last_used_);
|
settings_->setValue ("MonitorLastUsed", monitor_last_used_);
|
||||||
@ -1770,7 +1786,7 @@ void Configuration::impl::set_rig_invariants ()
|
|||||||
bool Configuration::impl::validate ()
|
bool Configuration::impl::validate ()
|
||||||
{
|
{
|
||||||
if (ui_->sound_input_combo_box->currentIndex () < 0
|
if (ui_->sound_input_combo_box->currentIndex () < 0
|
||||||
&& audio_input_device_.isNull ())
|
&& next_audio_input_device_.isNull ())
|
||||||
{
|
{
|
||||||
find_tab (ui_->sound_input_combo_box);
|
find_tab (ui_->sound_input_combo_box);
|
||||||
MessageBox::critical_message (this, tr ("Invalid audio input device"));
|
MessageBox::critical_message (this, tr ("Invalid audio input device"));
|
||||||
@ -1778,7 +1794,7 @@ bool Configuration::impl::validate ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ui_->sound_input_channel_combo_box->currentIndex () < 0
|
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);
|
find_tab (ui_->sound_input_combo_box);
|
||||||
MessageBox::critical_message (this, tr ("Invalid audio input device"));
|
MessageBox::critical_message (this, tr ("Invalid audio input device"));
|
||||||
@ -1786,7 +1802,7 @@ bool Configuration::impl::validate ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ui_->sound_output_combo_box->currentIndex () < 0
|
if (ui_->sound_output_combo_box->currentIndex () < 0
|
||||||
&& audio_output_device_.isNull ())
|
&& next_audio_output_device_.isNull ())
|
||||||
{
|
{
|
||||||
find_tab (ui_->sound_output_combo_box);
|
find_tab (ui_->sound_output_combo_box);
|
||||||
MessageBox::information_message (this, tr ("Invalid audio output device"));
|
MessageBox::information_message (this, tr ("Invalid audio output device"));
|
||||||
@ -1842,7 +1858,6 @@ int Configuration::impl::exec ()
|
|||||||
rig_changed_ = false;
|
rig_changed_ = false;
|
||||||
|
|
||||||
initialize_models ();
|
initialize_models ();
|
||||||
lazy_models_load (ui_->configuration_tabs->currentIndex ());
|
|
||||||
|
|
||||||
return QDialog::exec();
|
return QDialog::exec();
|
||||||
}
|
}
|
||||||
@ -1941,39 +1956,60 @@ void Configuration::impl::accept ()
|
|||||||
// related configuration parameters
|
// related configuration parameters
|
||||||
rig_is_dummy_ = TransceiverFactory::basic_transceiver_name_ == rig_params_.rig_name;
|
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;
|
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;
|
next_audio_input_device_ = selected_device;
|
||||||
restart_sound_input_device_ = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
auto const& selected_device = ui_->sound_output_combo_box->currentData ().value<audio_info_type> ().first;
|
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;
|
next_audio_output_device_ = selected_device;
|
||||||
restart_sound_output_device_ = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
restart_sound_input_device_ = true;
|
||||||
}
|
}
|
||||||
Q_ASSERT (audio_input_channel_ <= AudioDevice::Right);
|
if (audio_input_channel_ != next_audio_input_channel_)
|
||||||
|
|
||||||
if (audio_output_channel_ != static_cast<AudioDevice::Channel> (ui_->sound_output_channel_combo_box->currentIndex ()))
|
|
||||||
{
|
{
|
||||||
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;
|
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_callsign_ = ui_->callsign_line_edit->text ();
|
||||||
my_grid_ = ui_->grid_line_edit->text ();
|
my_grid_ = ui_->grid_line_edit->text ();
|
||||||
@ -2112,6 +2148,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 ();
|
QDialog::reject ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2772,27 +2815,25 @@ QAudioDeviceInfo Configuration::impl::find_audio_device (QAudio::Mode mode, QCom
|
|||||||
|
|
||||||
if (device_name.size ())
|
if (device_name.size ())
|
||||||
{
|
{
|
||||||
combo_box->clear ();
|
Q_EMIT self_->enumerating_audio_devices ();
|
||||||
|
|
||||||
int current_index = -1;
|
|
||||||
auto const& devices = QAudioDeviceInfo::availableDevices (mode);
|
auto const& devices = QAudioDeviceInfo::availableDevices (mode);
|
||||||
Q_FOREACH (auto const& p, devices)
|
Q_FOREACH (auto const& p, devices)
|
||||||
{
|
{
|
||||||
|
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
|
// convert supported channel counts into something we can store in the item model
|
||||||
QList<QVariant> channel_counts;
|
QList<QVariant> channel_counts;
|
||||||
auto scc = p.supportedChannelCounts ();
|
auto scc = p.supportedChannelCounts ();
|
||||||
copy (scc.cbegin (), scc.cend (), back_inserter (channel_counts));
|
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->addItem (p.deviceName (), QVariant::fromValue (audio_info_type {p, channel_counts}));
|
combo_box->setCurrentIndex (0);
|
||||||
if (p.deviceName () == device_name)
|
|
||||||
{
|
|
||||||
current_index = combo_box->count () - 1;
|
|
||||||
combo_box->setCurrentIndex (current_index);
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
combo_box->setCurrentIndex (current_index);
|
// 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);
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -2811,7 +2852,7 @@ void Configuration::impl::load_audio_devices (QAudio::Mode mode, QComboBox * com
|
|||||||
auto const& devices = QAudioDeviceInfo::availableDevices (mode);
|
auto const& devices = QAudioDeviceInfo::availableDevices (mode);
|
||||||
Q_FOREACH (auto const& p, devices)
|
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
|
// convert supported channel counts into something we can store in the item model
|
||||||
QList<QVariant> channel_counts;
|
QList<QVariant> channel_counts;
|
||||||
|
@ -260,6 +260,8 @@ public:
|
|||||||
// i.e. the transceiver is ready for use.
|
// 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 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
|
// These signals indicate a font has been selected and accepted for
|
||||||
|
143
Configuration.ui
143
Configuration.ui
@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>554</width>
|
<width>554</width>
|
||||||
<height>557</height>
|
<height>556</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -1364,71 +1364,8 @@ radio interface behave as expected.</string>
|
|||||||
<string>Soundcard</string>
|
<string>Soundcard</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_6">
|
<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">
|
<item row="1" column="1">
|
||||||
<widget class="QComboBox" name="sound_output_combo_box">
|
<widget class="LazyFillComboBox" name="sound_output_combo_box">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
<horstretch>1</horstretch>
|
<horstretch>1</horstretch>
|
||||||
@ -1471,6 +1408,69 @@ transmitting periods.</string>
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</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>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@ -2997,6 +2997,11 @@ Right click for insert and delete options.</string>
|
|||||||
<extends>QListView</extends>
|
<extends>QListView</extends>
|
||||||
<header>widgets/DecodeHighlightingListView.hpp</header>
|
<header>widgets/DecodeHighlightingListView.hpp</header>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>LazyFillComboBox</class>
|
||||||
|
<extends>QComboBox</extends>
|
||||||
|
<header>widgets/LazyFillComboBox.hpp</header>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
<tabstop>configuration_tabs</tabstop>
|
<tabstop>configuration_tabs</tabstop>
|
||||||
@ -3187,13 +3192,13 @@ Right click for insert and delete options.</string>
|
|||||||
</connection>
|
</connection>
|
||||||
</connections>
|
</connections>
|
||||||
<buttongroups>
|
<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="special_op_activity_button_group"/>
|
||||||
<buttongroup name="TX_mode_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="TX_audio_source_button_group"/>
|
||||||
<buttongroup name="CAT_data_bits_button_group"/>
|
|
||||||
<buttongroup name="CAT_handshake_button_group"/>
|
<buttongroup name="CAT_handshake_button_group"/>
|
||||||
|
<buttongroup name="split_mode_button_group"/>
|
||||||
</buttongroups>
|
</buttongroups>
|
||||||
</ui>
|
</ui>
|
||||||
|
@ -36,7 +36,7 @@ void Detector::setBlockSize (unsigned n)
|
|||||||
bool Detector::reset ()
|
bool Detector::reset ()
|
||||||
{
|
{
|
||||||
clear ();
|
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
|
// a warning
|
||||||
return isOpen ();
|
return isOpen ();
|
||||||
}
|
}
|
||||||
@ -56,7 +56,6 @@ void Detector::clear ()
|
|||||||
|
|
||||||
qint64 Detector::writeData (char const * data, qint64 maxSize)
|
qint64 Detector::writeData (char const * data, qint64 maxSize)
|
||||||
{
|
{
|
||||||
//qDebug () << "Detector::writeData: size:" << maxSize;
|
|
||||||
static unsigned mstr0=999999;
|
static unsigned mstr0=999999;
|
||||||
qint64 ms0 = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
qint64 ms0 = QDateTime::currentMSecsSinceEpoch() % 86400000;
|
||||||
unsigned mstr = ms0 % int(1000.0*m_period); // ms into the nominal Tx start time
|
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)
|
qint64 Modulator::readData (char * data, qint64 maxSize)
|
||||||
{
|
{
|
||||||
// qDebug () << "readData: maxSize:" << maxSize;
|
|
||||||
|
|
||||||
double toneFrequency=1500.0;
|
double toneFrequency=1500.0;
|
||||||
if(m_nsps==6) {
|
if(m_nsps==6) {
|
||||||
toneFrequency=1000.0;
|
toneFrequency=1000.0;
|
||||||
|
@ -1,27 +1,27 @@
|
|||||||
Here are the "displayWidgets()" strings for WSJT-X modes
|
Here are the "displayWidgets()" strings for WSJT-X modes
|
||||||
|
|
||||||
1 2 3
|
1 2 3
|
||||||
0123456789012345678901234567890123
|
012345678901234567890123456789012345
|
||||||
----------------------------------------------
|
------------------------------------------------
|
||||||
JT4 1110100000001100001100000000000000
|
JT4 111010000000110000110000000000000000
|
||||||
JT4/VHF 1111100100101101101111000000000000
|
JT4/VHF 111110010010110110111100000000000000
|
||||||
JT9 1110100000001110000100000000000010
|
JT9 111010000000111000010000000000001000
|
||||||
JT9/VHF 1111101010001111100100000000000000
|
JT9/VHF 111110101000111110010000000000000000
|
||||||
JT9+JT65 1110100000011110000100000000000010
|
JT9+JT65 111010000001111000010000000000001000
|
||||||
JT65 1110100000001110000100000000000010
|
JT65 111010000000111000010000000000001000
|
||||||
JT65/VHF 1111100100001101101011000100000000
|
JT65/VHF 111110010000110110101100010000000000
|
||||||
QRA64 1111100101101101100000000010000000
|
QRA64 111110010110110110000000001000000000
|
||||||
ISCAT 1001110000000001100000000000000000
|
ISCAT 100111000000000110000000000000000000
|
||||||
MSK144 1011111101000000000100010000000000
|
MSK144 101111110100000000010001000000000000
|
||||||
WSPR 0000000000000000010100000000000000
|
WSPR 000000000000000001010000000000000000
|
||||||
FST4 1111110001001110000100000001000000
|
FST4 111111000100111000010000000100000011
|
||||||
FST4W 0000000000000000010100000000000001
|
FST4W 000000000000000001010000000000000100
|
||||||
Echo 0000000000000000000000100000000000
|
Echo 000000000000000000000010000000000000
|
||||||
FCal 0011010000000000000000000000010000
|
FCal 001101000000000000000000000001000000
|
||||||
FT8 1110100001001110000100001001100010
|
FT8 111010000100111000010000100110001000
|
||||||
FT8/VHF 1110100001001110000100001001100010
|
FT8/VHF 111010000100111000010000100110001000
|
||||||
FT8/Fox 1110100001001110000100000000001000
|
FT8/Fox 111010000100111000010000000000100000
|
||||||
FT8/Hound 1110100001001110000100000000001100
|
FT8/Hound 111010000100111000010000000000110000
|
||||||
----------------------------------------------
|
----------------------------------------------
|
||||||
1 2 3
|
1 2 3
|
||||||
012345678901234567890123456789012
|
012345678901234567890123456789012
|
||||||
@ -63,3 +63,5 @@ Mapping of column numbers to widgets
|
|||||||
31. cbRxAll
|
31. cbRxAll
|
||||||
32. cbCQonly
|
32. cbCQonly
|
||||||
33. sbTR_FST4W
|
33. sbTR_FST4W
|
||||||
|
34. sbF_Low
|
||||||
|
35. sbF_High
|
||||||
|
@ -21,19 +21,21 @@ TIP: Your computer may be configured so that this directory is
|
|||||||
`"%LocalAppData%\WSJT-X\"`.
|
`"%LocalAppData%\WSJT-X\"`.
|
||||||
|
|
||||||
* The built-in Windows facility for time synchronization is usually
|
* The built-in Windows facility for time synchronization is usually
|
||||||
not adequate. We recommend the program _Meinberg NTP Client_ (see
|
not adequate. We recommend the program _Meinberg NTP Client_: see
|
||||||
{ntpsetup} for downloading and installation instructions). Recent
|
{ntpsetup} for downloading and installation instructions. Recent
|
||||||
versions of Windows 10 are now shipped with a more capable Internet
|
versions of Windows 10 are now shipped with a more capable Internet
|
||||||
time synchronization service that is suitable if configured
|
time synchronization service that is suitable if configured
|
||||||
appropriately. We do not recommend SNTP time setting tools or others
|
appropriately. We do not recommend SNTP time setting tools or others
|
||||||
that make periodic correction steps, _WSJT-X_ requires that the PC
|
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
|
NOTE: Having a PC clock that appears to be synchronized to UTC is not
|
||||||
sufficient, monotonicity means that the clock must not be
|
sufficient. "`Monotonically increasing`" means that the clock
|
||||||
stepped backwards or forwards during corrections, instead the
|
must not be stepped backwards. "`Smoothly continuous`" means
|
||||||
clock frequency must be adjusted to correct synchronization
|
that time must increase at a nearly constant rate, without
|
||||||
errors gradually.
|
steps. Any necessary clock corrections must be applied by
|
||||||
|
adjusting the rate of increase, thereby correcting
|
||||||
|
synchronization errors gradually.
|
||||||
|
|
||||||
[[OPENSSL]]
|
[[OPENSSL]]
|
||||||
|
|
||||||
|
@ -199,8 +199,8 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
|
|||||||
call timer('dec240 ',0)
|
call timer('dec240 ',0)
|
||||||
call my_fst4%decode(fst4_decoded,id2,params%nutc, &
|
call my_fst4%decode(fst4_decoded,id2,params%nutc, &
|
||||||
params%nQSOProgress,params%nfa,params%nfb, &
|
params%nQSOProgress,params%nfa,params%nfb, &
|
||||||
params%nfqso,ndepth,params%ntr, &
|
params%nfqso,ndepth,params%ntr,params%nexp_decode, &
|
||||||
params%nexp_decode,params%ntol,params%emedelay, &
|
params%ntol,params%emedelay,logical(params%nagain), &
|
||||||
logical(params%lapcqonly),mycall,hiscall,iwspr)
|
logical(params%lapcqonly),mycall,hiscall,iwspr)
|
||||||
call timer('dec240 ',1)
|
call timer('dec240 ',1)
|
||||||
go to 800
|
go to 800
|
||||||
@ -213,8 +213,8 @@ subroutine multimode_decoder(ss,id2,params,nfsample)
|
|||||||
call timer('dec240 ',0)
|
call timer('dec240 ',0)
|
||||||
call my_fst4%decode(fst4_decoded,id2,params%nutc, &
|
call my_fst4%decode(fst4_decoded,id2,params%nutc, &
|
||||||
params%nQSOProgress,params%nfa,params%nfb, &
|
params%nQSOProgress,params%nfa,params%nfb, &
|
||||||
params%nfqso,ndepth,params%ntr, &
|
params%nfqso,ndepth,params%ntr,params%nexp_decode, &
|
||||||
params%nexp_decode,params%ntol,params%emedelay, &
|
params%ntol,params%emedelay,logical(params%nagain), &
|
||||||
logical(params%lapcqonly),mycall,hiscall,iwspr)
|
logical(params%lapcqonly),mycall,hiscall,iwspr)
|
||||||
call timer('dec240 ',1)
|
call timer('dec240 ',1)
|
||||||
go to 800
|
go to 800
|
||||||
|
@ -30,7 +30,7 @@ module fst4_decode
|
|||||||
contains
|
contains
|
||||||
|
|
||||||
subroutine decode(this,callback,iwave,nutc,nQSOProgress,nfa,nfb,nfqso, &
|
subroutine decode(this,callback,iwave,nutc,nQSOProgress,nfa,nfb,nfqso, &
|
||||||
ndepth,ntrperiod,nexp_decode,ntol,emedelay,lapcqonly,mycall, &
|
ndepth,ntrperiod,nexp_decode,ntol,emedelay,lagain,lapcqonly,mycall, &
|
||||||
hiscall,iwspr)
|
hiscall,iwspr)
|
||||||
|
|
||||||
use timer_module, only: timer
|
use timer_module, only: timer
|
||||||
@ -49,13 +49,14 @@ contains
|
|||||||
complex, allocatable :: cframe(:)
|
complex, allocatable :: cframe(:)
|
||||||
complex, allocatable :: c_bigfft(:) !Complex waveform
|
complex, allocatable :: c_bigfft(:) !Complex waveform
|
||||||
real llr(240),llrs(240,4)
|
real llr(240),llrs(240,4)
|
||||||
real candidates(200,5)
|
real candidates0(200,5),candidates(200,5)
|
||||||
real bitmetrics(320,4)
|
real bitmetrics(320,4)
|
||||||
real s4(0:3,NN)
|
real s4(0:3,NN)
|
||||||
real minsync
|
real minsync
|
||||||
logical lapcqonly
|
logical lagain,lapcqonly
|
||||||
integer itone(NN)
|
integer itone(NN)
|
||||||
integer hmod
|
integer hmod
|
||||||
|
integer ipct(0:7)
|
||||||
integer*1 apmask(240),cw(240)
|
integer*1 apmask(240),cw(240)
|
||||||
integer*1 message101(101),message74(74),message77(77)
|
integer*1 message101(101),message74(74),message77(77)
|
||||||
integer*1 rvec(77)
|
integer*1 rvec(77)
|
||||||
@ -64,11 +65,12 @@ contains
|
|||||||
integer naptypes(0:5,4) ! (nQSOProgress,decoding pass)
|
integer naptypes(0:5,4) ! (nQSOProgress,decoding pass)
|
||||||
integer mcq(29),mrrr(19),m73(19),mrr73(19)
|
integer mcq(29),mrrr(19),m73(19),mrr73(19)
|
||||||
|
|
||||||
logical badsync,unpk77_success
|
logical badsync,unpk77_success,single_decode
|
||||||
logical first,nohiscall,lwspr,ex
|
logical first,nohiscall,lwspr,ex
|
||||||
|
|
||||||
integer*2 iwave(30*60*12000)
|
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 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 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/
|
data m73/0,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1/
|
||||||
@ -223,32 +225,65 @@ contains
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ndropmax=1
|
ndropmax=1
|
||||||
npct=nexp_decode/256
|
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)
|
call blanker(iwave,nfft1,ndropmax,npct,c_bigfft)
|
||||||
|
|
||||||
! The big fft is done once and is used for calculating the smoothed spectrum
|
! The big fft is done once and is used for calculating the smoothed spectrum
|
||||||
! and also for downconverting/downsampling each candidate.
|
! and also for downconverting/downsampling each candidate.
|
||||||
call four2a(c_bigfft,nfft1,1,-1,0) !r2c
|
call four2a(c_bigfft,nfft1,1,-1,0) !r2c
|
||||||
|
|
||||||
nhicoh=1
|
nhicoh=1
|
||||||
nsyncoh=8
|
nsyncoh=8
|
||||||
fa=max(100,nint(nfqso+1.5*baud-ntol))
|
|
||||||
fb=min(4800,nint(nfqso+1.5*baud+ntol))
|
|
||||||
minsync=1.20
|
minsync=1.20
|
||||||
if(ntrperiod.eq.15) minsync=1.15
|
if(ntrperiod.eq.15) minsync=1.15
|
||||||
|
|
||||||
! Get first approximation of candidate frequencies
|
! Get first approximation of candidate frequencies
|
||||||
call get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb,nfa,nfb, &
|
call get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb,nfa,nfb, &
|
||||||
minsync,ncand,candidates)
|
minsync,ncand,candidates0)
|
||||||
|
|
||||||
ndecodes=0
|
|
||||||
decodes=' '
|
|
||||||
|
|
||||||
isbest=0
|
isbest=0
|
||||||
fc2=0.
|
fc2=0.
|
||||||
do icand=1,ncand
|
do icand=1,ncand
|
||||||
fc0=candidates(icand,1)
|
fc0=candidates0(icand,1)
|
||||||
detmet=candidates(icand,2)
|
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
|
! Downconvert and downsample a slice of the spectrum centered on the
|
||||||
! rough estimate of the candidates frequency.
|
! rough estimate of the candidates frequency.
|
||||||
@ -265,44 +300,63 @@ contains
|
|||||||
|
|
||||||
fc_synced = fc0 + fcbest
|
fc_synced = fc0 + fcbest
|
||||||
dt_synced = (isbest-fs2)*dt2 !nominal dt is 1 second so frame starts at sample fs2
|
dt_synced = (isbest-fs2)*dt2 !nominal dt is 1 second so frame starts at sample fs2
|
||||||
candidates(icand,3)=fc_synced
|
candidates0(icand,3)=fc_synced
|
||||||
candidates(icand,4)=isbest
|
candidates0(icand,4)=isbest
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
! remove duplicate candidates
|
! remove duplicate candidates
|
||||||
do icand=1,ncand
|
do icand=1,ncand
|
||||||
fc=candidates(icand,3)
|
fc=candidates0(icand,3)
|
||||||
isbest=nint(candidates(icand,4))
|
isbest=nint(candidates0(icand,4))
|
||||||
do ic2=1,ncand
|
do ic2=icand+1,ncand
|
||||||
fc2=candidates(ic2,3)
|
fc2=candidates0(ic2,3)
|
||||||
isbest2=nint(candidates(ic2,4))
|
isbest2=nint(candidates0(ic2,4))
|
||||||
if(ic2.ne.icand .and. fc2.gt.0.0) then
|
if(fc2.gt.0.0) then
|
||||||
if(abs(fc2-fc).lt.0.10*baud) then ! same frequency
|
if(abs(fc2-fc).lt.0.10*baud) then ! same frequency
|
||||||
if(abs(isbest2-isbest).le.2) then
|
if(abs(isbest2-isbest).le.2) then
|
||||||
candidates(ic2,3)=-1
|
candidates0(ic2,3)=-1
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
ic=0
|
ic=0
|
||||||
do icand=1,ncand
|
do icand=1,ncand
|
||||||
if(candidates(icand,3).gt.0) then
|
if(candidates0(icand,3).gt.0) then
|
||||||
ic=ic+1
|
ic=ic+1
|
||||||
candidates(ic,:)=candidates(icand,:)
|
candidates0(ic,:)=candidates0(icand,:)
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
ncand=ic
|
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
|
||||||
|
|
||||||
xsnr=0.
|
xsnr=0.
|
||||||
!write(*,*) 'ncand ',ncand
|
|
||||||
do icand=1,ncand
|
do icand=1,ncand
|
||||||
sync=candidates(icand,2)
|
sync=candidates(icand,2)
|
||||||
fc_synced=candidates(icand,3)
|
fc_synced=candidates(icand,3)
|
||||||
isbest=nint(candidates(icand,4))
|
isbest=nint(candidates(icand,4))
|
||||||
xdt=(isbest-nspsec)/fs2
|
xdt=(isbest-nspsec)/fs2
|
||||||
if(ntrperiod.eq.15) xdt=(isbest-real(nspsec)/2.0)/fs2
|
if(ntrperiod.eq.15) xdt=(isbest-real(nspsec)/2.0)/fs2
|
||||||
|
|
||||||
call timer('dwnsmpl ',0)
|
call timer('dwnsmpl ',0)
|
||||||
call fst4_downsample(c_bigfft,nfft1,ndown,fc_synced,sigbw,c2)
|
call fst4_downsample(c_bigfft,nfft1,ndown,fc_synced,sigbw,c2)
|
||||||
call timer('dwnsmpl ',1)
|
call timer('dwnsmpl ',1)
|
||||||
@ -422,7 +476,7 @@ contains
|
|||||||
do i=1,ndecodes
|
do i=1,ndecodes
|
||||||
if(decodes(i).eq.msg) idupe=1
|
if(decodes(i).eq.msg) idupe=1
|
||||||
enddo
|
enddo
|
||||||
if(idupe.eq.1) goto 2002
|
if(idupe.eq.1) goto 800
|
||||||
ndecodes=ndecodes+1
|
ndecodes=ndecodes+1
|
||||||
decodes(ndecodes)=msg
|
decodes(ndecodes)=msg
|
||||||
|
|
||||||
@ -469,13 +523,15 @@ contains
|
|||||||
endif
|
endif
|
||||||
call this%callback(nutc,smax1,nsnr,xdt,fsig,msg, &
|
call this%callback(nutc,smax1,nsnr,xdt,fsig,msg, &
|
||||||
iaptype,qual,ntrperiod,lwspr,fmid,w50)
|
iaptype,qual,ntrperiod,lwspr,fmid,w50)
|
||||||
goto 2002
|
if(iwspr.eq.0 .and. nb.lt.0) go to 900
|
||||||
|
goto 800
|
||||||
endif
|
endif
|
||||||
enddo ! metrics
|
enddo ! metrics
|
||||||
enddo ! istart jitter
|
enddo ! istart jitter
|
||||||
2002 enddo !candidate list
|
800 enddo !candidate list
|
||||||
|
enddo ! noise blanker loop
|
||||||
|
|
||||||
return
|
900 return
|
||||||
end subroutine decode
|
end subroutine decode
|
||||||
|
|
||||||
subroutine sync_fst4(cd0,i0,f0,hmod,ncoh,np,nss,ntr,fs,sync)
|
subroutine sync_fst4(cd0,i0,f0,hmod,ncoh,np,nss,ntr,fs,sync)
|
||||||
@ -649,6 +705,7 @@ contains
|
|||||||
inb=nint(min(4800.0,real(nfb))/df2) !High freq limit for noise fit
|
inb=nint(min(4800.0,real(nfb))/df2) !High freq limit for noise fit
|
||||||
if(ia.lt.ina) ia=ina
|
if(ia.lt.ina) ia=ina
|
||||||
if(ib.gt.inb) ib=inb
|
if(ib.gt.inb) ib=inb
|
||||||
|
|
||||||
nnw=nint(48000.*nsps*2./fs)
|
nnw=nint(48000.*nsps*2./fs)
|
||||||
allocate (s(nnw))
|
allocate (s(nnw))
|
||||||
s=0. !Compute low-resolution power spectrum
|
s=0. !Compute low-resolution power spectrum
|
||||||
|
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
|
@ -208,7 +208,7 @@ namespace
|
|||||||
// grid exact match excluding RR73
|
// grid exact match excluding RR73
|
||||||
QRegularExpression grid_regexp {"\\A(?![Rr]{2}73)[A-Ra-r]{2}[0-9]{2}([A-Xa-x]{2}){0,1}\\z"};
|
QRegularExpression grid_regexp {"\\A(?![Rr]{2}73)[A-Ra-r]{2}[0-9]{2}([A-Xa-x]{2}){0,1}\\z"};
|
||||||
auto quint32_max = std::numeric_limits<quint32>::max ();
|
auto quint32_max = std::numeric_limits<quint32>::max ();
|
||||||
constexpr int N_WIDGETS {34};
|
constexpr int N_WIDGETS {36};
|
||||||
constexpr int rx_chunk_size {3456}; // audio samples at 12000 Hz
|
constexpr int rx_chunk_size {3456}; // audio samples at 12000 Hz
|
||||||
constexpr int tx_audio_buffer_size {48000 / 5}; // audio frames at 48000 Hz
|
constexpr int tx_audio_buffer_size {48000 / 5}; // audio frames at 48000 Hz
|
||||||
|
|
||||||
@ -454,6 +454,7 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
// hook up sound output stream slots & signals and disposal
|
// hook up sound output stream slots & signals and disposal
|
||||||
connect (this, &MainWindow::initializeAudioOutputStream, m_soundOutput, &SoundOutput::setFormat);
|
connect (this, &MainWindow::initializeAudioOutputStream, m_soundOutput, &SoundOutput::setFormat);
|
||||||
connect (m_soundOutput, &SoundOutput::error, this, &MainWindow::showSoundOutError);
|
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 (m_soundOutput, &SoundOutput::status, this, &MainWindow::showStatusMessage);
|
||||||
connect (this, &MainWindow::outAttenuationChanged, m_soundOutput, &SoundOutput::setAttenuation);
|
connect (this, &MainWindow::outAttenuationChanged, m_soundOutput, &SoundOutput::setAttenuation);
|
||||||
connect (&m_audioThread, &QThread::finished, m_soundOutput, &QObject::deleteLater);
|
connect (&m_audioThread, &QThread::finished, m_soundOutput, &QObject::deleteLater);
|
||||||
@ -472,13 +473,14 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple,
|
|||||||
connect (this, &MainWindow::reset_audio_input_stream, m_soundInput, &SoundInput::reset);
|
connect (this, &MainWindow::reset_audio_input_stream, m_soundInput, &SoundInput::reset);
|
||||||
connect (this, &MainWindow::finished, m_soundInput, &SoundInput::stop);
|
connect (this, &MainWindow::finished, m_soundInput, &SoundInput::stop);
|
||||||
connect(m_soundInput, &SoundInput::error, this, &MainWindow::showSoundInError);
|
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::status, this, &MainWindow::showStatusMessage);
|
||||||
connect (m_soundInput, &SoundInput::dropped_frames, this, [this] (qint32 dropped_frames, qint64 usec) {
|
connect (m_soundInput, &SoundInput::dropped_frames, this, [this] (qint32 dropped_frames, qint64 usec) {
|
||||||
if (dropped_frames > 48000 / 5) // 1/5 second
|
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));
|
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);
|
auto period = qt_truncate_date_time_to (QDateTime::currentDateTimeUtc ().addMSecs (-m_TRperiod / 2.), m_TRperiod * 1e3);
|
||||||
MessageBox::warning_message (this
|
MessageBox::warning_message (this
|
||||||
@ -1135,6 +1137,8 @@ void MainWindow::writeSettings()
|
|||||||
m_settings->setValue("WSPRfreq",ui->WSPRfreqSpinBox->value());
|
m_settings->setValue("WSPRfreq",ui->WSPRfreqSpinBox->value());
|
||||||
m_settings->setValue("FST4W_RxFreq",ui->sbFST4W_RxFreq->value());
|
m_settings->setValue("FST4W_RxFreq",ui->sbFST4W_RxFreq->value());
|
||||||
m_settings->setValue("FST4W_FTol",ui->sbFST4W_FTol->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("SubMode",ui->sbSubmode->value());
|
||||||
m_settings->setValue("DTtol",m_DTtol);
|
m_settings->setValue("DTtol",m_DTtol);
|
||||||
m_settings->setValue("Ftol", ui->sbFtol->value ());
|
m_settings->setValue("Ftol", ui->sbFtol->value ());
|
||||||
@ -1222,6 +1226,8 @@ void MainWindow::readSettings()
|
|||||||
ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq",1500).toInt());
|
ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq",1500).toInt());
|
||||||
ui->sbFST4W_RxFreq->setValue(0);
|
ui->sbFST4W_RxFreq->setValue(0);
|
||||||
ui->sbFST4W_RxFreq->setValue(m_settings->value("FST4W_RxFreq",1500).toInt());
|
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();
|
m_nSubMode=m_settings->value("SubMode",0).toInt();
|
||||||
ui->sbFtol->setValue (m_settings->value("Ftol", 50).toInt());
|
ui->sbFtol->setValue (m_settings->value("Ftol", 50).toInt());
|
||||||
ui->sbFST4W_FTol->setValue(m_settings->value("FST4W_FTol",100).toInt());
|
ui->sbFST4W_FTol->setValue(m_settings->value("FST4W_FTol",100).toInt());
|
||||||
@ -1427,6 +1433,10 @@ void MainWindow::dataSink(qint64 frames)
|
|||||||
// Get power, spectrum, and ihsym
|
// Get power, spectrum, and ihsym
|
||||||
dec_data.params.nfa=m_wideGraph->nStartFreq();
|
dec_data.params.nfa=m_wideGraph->nStartFreq();
|
||||||
dec_data.params.nfb=m_wideGraph->Fmax();
|
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;
|
int nsps=m_nsps;
|
||||||
if(m_bFastMode) nsps=6912;
|
if(m_bFastMode) nsps=6912;
|
||||||
int nsmo=m_wideGraph->smoothYellow()-1;
|
int nsmo=m_wideGraph->smoothYellow()-1;
|
||||||
@ -1816,14 +1826,14 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog
|
|||||||
m_psk_Reporter.sendReport (true);
|
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 ()
|
Q_EMIT startAudioInputStream (m_config.audio_input_device ()
|
||||||
, rx_chunk_size * m_downSampleFactor
|
, rx_chunk_size * m_downSampleFactor
|
||||||
, m_detector, m_downSampleFactor
|
, m_detector, m_downSampleFactor
|
||||||
, m_config.audio_input_channel ());
|
, 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 ()
|
Q_EMIT initializeAudioOutputStream (m_config.audio_output_device ()
|
||||||
, AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2
|
, AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2
|
||||||
, tx_audio_buffer_size);
|
, tx_audio_buffer_size);
|
||||||
@ -2973,7 +2983,7 @@ void MainWindow::on_DecodeButton_clicked (bool /* checked */) //Decode request
|
|||||||
void MainWindow::freezeDecode(int n) //freezeDecode()
|
void MainWindow::freezeDecode(int n) //freezeDecode()
|
||||||
{
|
{
|
||||||
if((n%100)==2) {
|
if((n%100)==2) {
|
||||||
if(m_mode=="FST4") ui->sbFtol->setValue(10);
|
if(m_mode=="FST4" and m_config.single_decode() and ui->sbFtol->value()>10) ui->sbFtol->setValue(10);
|
||||||
on_DecodeButton_clicked (true);
|
on_DecodeButton_clicked (true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3067,7 +3077,16 @@ void MainWindow::decode() //decode()
|
|||||||
dec_data.params.ntol=20;
|
dec_data.params.ntol=20;
|
||||||
dec_data.params.naggressive=0;
|
dec_data.params.naggressive=0;
|
||||||
}
|
}
|
||||||
if(m_mode=="FST4") dec_data.params.ntol=ui->sbFtol->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(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.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;
|
if(dec_data.params.newdat==1 and !m_diskData) m_nutc0=dec_data.params.nutc;
|
||||||
@ -3110,7 +3129,7 @@ void MainWindow::decode() //decode()
|
|||||||
dec_data.params.nexp_decode = static_cast<int> (m_config.special_op_id());
|
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.single_decode()) dec_data.params.nexp_decode += 32;
|
||||||
if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64;
|
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.datetime, m_dateTime.toLatin1()+" ", sizeof dec_data.params.datetime);
|
||||||
::memcpy(dec_data.params.mycall, (m_config.my_callsign()+" ").toLatin1(), sizeof dec_data.params.mycall);
|
::memcpy(dec_data.params.mycall, (m_config.my_callsign()+" ").toLatin1(), sizeof dec_data.params.mycall);
|
||||||
@ -4224,7 +4243,7 @@ void MainWindow::guiUpdate()
|
|||||||
//Once per second (onesec)
|
//Once per second (onesec)
|
||||||
if(nsec != m_sec0) {
|
if(nsec != m_sec0) {
|
||||||
// qDebug() << "AAA" << nsec;
|
// qDebug() << "AAA" << nsec;
|
||||||
if(m_mode=="FST4") sbFtolMaxVal();
|
if(m_mode=="FST4") chk_FST4_freq_range();
|
||||||
m_currentBand=m_config.bands()->find(m_freqNominal);
|
m_currentBand=m_config.bands()->find(m_freqNominal);
|
||||||
if( SpecOp::HOUND == m_config.special_op_id() ) {
|
if( SpecOp::HOUND == m_config.special_op_id() ) {
|
||||||
qint32 tHound=QDateTime::currentMSecsSinceEpoch()/1000 - m_tAutoOn;
|
qint32 tHound=QDateTime::currentMSecsSinceEpoch()/1000 - m_tAutoOn;
|
||||||
@ -5870,6 +5889,8 @@ void MainWindow::displayWidgets(qint64 n)
|
|||||||
if(i==31) ui->cbRxAll->setVisible(b);
|
if(i==31) ui->cbRxAll->setVisible(b);
|
||||||
if(i==32) ui->cbCQonly->setVisible(b);
|
if(i==32) ui->cbCQonly->setVisible(b);
|
||||||
if(i==33) ui->sbTR_FST4W->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;
|
j=j>>1;
|
||||||
}
|
}
|
||||||
ui->pbBestSP->setVisible(m_mode=="FT4");
|
ui->pbBestSP->setVisible(m_mode=="FT4");
|
||||||
@ -5902,12 +5923,16 @@ void MainWindow::on_actionFST4_triggered()
|
|||||||
ui->label_6->setText(tr ("Band Activity"));
|
ui->label_6->setText(tr ("Band Activity"));
|
||||||
ui->label_7->setText(tr ("Rx Frequency"));
|
ui->label_7->setText(tr ("Rx Frequency"));
|
||||||
WSPR_config(false);
|
WSPR_config(false);
|
||||||
// 0123456789012345678901234567890123
|
if(m_config.single_decode()) {
|
||||||
displayWidgets(nWidgets("1111110001001110000100000001000000"));
|
// 012345678901234567890123456789012345
|
||||||
|
displayWidgets(nWidgets("111111000100111000010000000100000000"));
|
||||||
|
m_wideGraph->setSingleDecode(true);
|
||||||
|
} else {
|
||||||
|
displayWidgets(nWidgets("111011000100111000010000000100000011"));
|
||||||
|
m_wideGraph->setSingleDecode(false);
|
||||||
|
ui->sbFtol->setValue(20);
|
||||||
|
}
|
||||||
setup_status_bar(false);
|
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);
|
ui->cbAutoSeq->setChecked(true);
|
||||||
m_wideGraph->setMode(m_mode);
|
m_wideGraph->setMode(m_mode);
|
||||||
m_wideGraph->setModeTx(m_modeTx);
|
m_wideGraph->setModeTx(m_modeTx);
|
||||||
@ -5915,9 +5940,15 @@ void MainWindow::on_actionFST4_triggered()
|
|||||||
m_wideGraph->setRxFreq(ui->RxFreqSpinBox->value());
|
m_wideGraph->setRxFreq(ui->RxFreqSpinBox->value());
|
||||||
m_wideGraph->setTol(ui->sbFtol->value());
|
m_wideGraph->setTol(ui->sbFtol->value());
|
||||||
m_wideGraph->setTxFreq(ui->TxFreqSpinBox->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);
|
switch_mode (Modes::FST4);
|
||||||
m_wideGraph->setMode(m_mode);
|
m_wideGraph->setMode(m_mode);
|
||||||
|
ui->sbTR->values ({15, 30, 60, 120, 300, 900, 1800});
|
||||||
|
on_sbTR_valueChanged (ui->sbTR->value());
|
||||||
statusChanged();
|
statusChanged();
|
||||||
|
m_bOK_to_chk=true;
|
||||||
|
chk_FST4_freq_range();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionFST4W_triggered()
|
void MainWindow::on_actionFST4W_triggered()
|
||||||
@ -5933,8 +5964,8 @@ void MainWindow::on_actionFST4W_triggered()
|
|||||||
m_FFTSize = m_nsps / 2;
|
m_FFTSize = m_nsps / 2;
|
||||||
Q_EMIT FFTSize(m_FFTSize);
|
Q_EMIT FFTSize(m_FFTSize);
|
||||||
WSPR_config(true);
|
WSPR_config(true);
|
||||||
// 0123456789012345678901234567890123
|
// 012345678901234567890123456789012345
|
||||||
displayWidgets(nWidgets("0000000000000000010100000000000001"));
|
displayWidgets(nWidgets("000000000000000001010000000000000100"));
|
||||||
setup_status_bar(false);
|
setup_status_bar(false);
|
||||||
ui->band_hopping_group_box->setChecked(false);
|
ui->band_hopping_group_box->setChecked(false);
|
||||||
ui->band_hopping_group_box->setVisible(false);
|
ui->band_hopping_group_box->setVisible(false);
|
||||||
@ -5982,7 +6013,7 @@ void MainWindow::on_actionFT4_triggered()
|
|||||||
ui->label_7->setText(tr ("Rx Frequency"));
|
ui->label_7->setText(tr ("Rx Frequency"));
|
||||||
ui->label_6->setText(tr ("Band Activity"));
|
ui->label_6->setText(tr ("Band Activity"));
|
||||||
ui->decodedTextLabel->setText( " UTC dB DT Freq " + tr ("Message"));
|
ui->decodedTextLabel->setText( " UTC dB DT Freq " + tr ("Message"));
|
||||||
displayWidgets(nWidgets("1110100001001110000100000001100010"));
|
displayWidgets(nWidgets("111010000100111000010000000110001000"));
|
||||||
ui->txrb2->setEnabled(true);
|
ui->txrb2->setEnabled(true);
|
||||||
ui->txrb4->setEnabled(true);
|
ui->txrb4->setEnabled(true);
|
||||||
ui->txrb5->setEnabled(true);
|
ui->txrb5->setEnabled(true);
|
||||||
@ -6031,7 +6062,7 @@ void MainWindow::on_actionFT8_triggered()
|
|||||||
ui->label_6->setText(tr ("Band Activity"));
|
ui->label_6->setText(tr ("Band Activity"));
|
||||||
ui->decodedTextLabel->setText( " UTC dB DT Freq " + tr ("Message"));
|
ui->decodedTextLabel->setText( " UTC dB DT Freq " + tr ("Message"));
|
||||||
}
|
}
|
||||||
displayWidgets(nWidgets("1110100001001110000100001001100010"));
|
displayWidgets(nWidgets("111010000100111000010000100110001000"));
|
||||||
ui->txrb2->setEnabled(true);
|
ui->txrb2->setEnabled(true);
|
||||||
ui->txrb4->setEnabled(true);
|
ui->txrb4->setEnabled(true);
|
||||||
ui->txrb5->setEnabled(true);
|
ui->txrb5->setEnabled(true);
|
||||||
@ -6049,7 +6080,7 @@ void MainWindow::on_actionFT8_triggered()
|
|||||||
ui->cbAutoSeq->setEnabled(false);
|
ui->cbAutoSeq->setEnabled(false);
|
||||||
ui->tabWidget->setCurrentIndex(1);
|
ui->tabWidget->setCurrentIndex(1);
|
||||||
ui->TxFreqSpinBox->setValue(300);
|
ui->TxFreqSpinBox->setValue(300);
|
||||||
displayWidgets(nWidgets("1110100001001110000100000000001000"));
|
displayWidgets(nWidgets("111010000100111000010000000000100000"));
|
||||||
ui->labDXped->setText(tr ("Fox"));
|
ui->labDXped->setText(tr ("Fox"));
|
||||||
on_fox_log_action_triggered();
|
on_fox_log_action_triggered();
|
||||||
}
|
}
|
||||||
@ -6059,7 +6090,7 @@ void MainWindow::on_actionFT8_triggered()
|
|||||||
ui->cbAutoSeq->setEnabled(false);
|
ui->cbAutoSeq->setEnabled(false);
|
||||||
ui->tabWidget->setCurrentIndex(0);
|
ui->tabWidget->setCurrentIndex(0);
|
||||||
ui->cbHoldTxFreq->setChecked(true);
|
ui->cbHoldTxFreq->setChecked(true);
|
||||||
displayWidgets(nWidgets("1110100001001100000100000000001100"));
|
displayWidgets(nWidgets("111010000100110000010000000000110000"));
|
||||||
ui->labDXped->setText(tr ("Hound"));
|
ui->labDXped->setText(tr ("Hound"));
|
||||||
ui->txrb1->setChecked(true);
|
ui->txrb1->setChecked(true);
|
||||||
ui->txrb2->setEnabled(false);
|
ui->txrb2->setEnabled(false);
|
||||||
@ -6134,9 +6165,9 @@ void MainWindow::on_actionJT4_triggered()
|
|||||||
ui->sbSubmode->setValue(0);
|
ui->sbSubmode->setValue(0);
|
||||||
}
|
}
|
||||||
if(bVHF) {
|
if(bVHF) {
|
||||||
displayWidgets(nWidgets("1111100100101101101111000000000000"));
|
displayWidgets(nWidgets("111110010010110110111100000000000000"));
|
||||||
} else {
|
} else {
|
||||||
displayWidgets(nWidgets("1110100000001100001100000000000000"));
|
displayWidgets(nWidgets("111010000000110000110000000000000000"));
|
||||||
}
|
}
|
||||||
fast_config(false);
|
fast_config(false);
|
||||||
statusChanged();
|
statusChanged();
|
||||||
@ -6193,9 +6224,9 @@ void MainWindow::on_actionJT9_triggered()
|
|||||||
ui->label_6->setText(tr ("Band Activity"));
|
ui->label_6->setText(tr ("Band Activity"));
|
||||||
ui->label_7->setText(tr ("Rx Frequency"));
|
ui->label_7->setText(tr ("Rx Frequency"));
|
||||||
if(bVHF) {
|
if(bVHF) {
|
||||||
displayWidgets(nWidgets("1111101010001111100100000000000000"));
|
displayWidgets(nWidgets("111110101000111110010000000000000000"));
|
||||||
} else {
|
} else {
|
||||||
displayWidgets(nWidgets("1110100000001110000100000000000010"));
|
displayWidgets(nWidgets("111010000000111000010000000000001000"));
|
||||||
}
|
}
|
||||||
fast_config(m_bFastMode);
|
fast_config(m_bFastMode);
|
||||||
ui->cbAutoSeq->setVisible(m_bFast9);
|
ui->cbAutoSeq->setVisible(m_bFast9);
|
||||||
@ -6234,7 +6265,7 @@ void MainWindow::on_actionJT9_JT65_triggered()
|
|||||||
ui->label_7->setText(tr ("Rx Frequency"));
|
ui->label_7->setText(tr ("Rx Frequency"));
|
||||||
ui->decodedTextLabel->setText("UTC dB DT Freq " + tr ("Message"));
|
ui->decodedTextLabel->setText("UTC dB DT Freq " + tr ("Message"));
|
||||||
ui->decodedTextLabel2->setText("UTC dB DT Freq " + tr ("Message"));
|
ui->decodedTextLabel2->setText("UTC dB DT Freq " + tr ("Message"));
|
||||||
displayWidgets(nWidgets("1110100000011110000100000000000010"));
|
displayWidgets(nWidgets("111010000001111000010000000000001000"));
|
||||||
fast_config(false);
|
fast_config(false);
|
||||||
statusChanged();
|
statusChanged();
|
||||||
}
|
}
|
||||||
@ -6268,6 +6299,9 @@ void MainWindow::on_actionJT65_triggered()
|
|||||||
m_wideGraph->setPeriod(m_TRperiod,m_nsps);
|
m_wideGraph->setPeriod(m_TRperiod,m_nsps);
|
||||||
m_wideGraph->setMode(m_mode);
|
m_wideGraph->setMode(m_mode);
|
||||||
m_wideGraph->setModeTx(m_modeTx);
|
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);
|
setup_status_bar (bVHF);
|
||||||
m_bFastMode=false;
|
m_bFastMode=false;
|
||||||
m_bFast9=false;
|
m_bFast9=false;
|
||||||
@ -6282,9 +6316,9 @@ void MainWindow::on_actionJT65_triggered()
|
|||||||
ui->label_7->setText(tr ("Rx Frequency"));
|
ui->label_7->setText(tr ("Rx Frequency"));
|
||||||
}
|
}
|
||||||
if(bVHF) {
|
if(bVHF) {
|
||||||
displayWidgets(nWidgets("1111100100001101101011000100000000"));
|
displayWidgets(nWidgets("111110010000110110101100010000000000"));
|
||||||
} else {
|
} else {
|
||||||
displayWidgets(nWidgets("1110100000001110000100000000000010"));
|
displayWidgets(nWidgets("111010000000111000010000000000001000"));
|
||||||
}
|
}
|
||||||
fast_config(false);
|
fast_config(false);
|
||||||
if(ui->cbShMsgs->isChecked()) {
|
if(ui->cbShMsgs->isChecked()) {
|
||||||
@ -6316,7 +6350,7 @@ void MainWindow::on_actionQRA64_triggered()
|
|||||||
ui->TxFreqSpinBox->setValue(1000);
|
ui->TxFreqSpinBox->setValue(1000);
|
||||||
QString fname {QDir::toNativeSeparators(m_config.temp_dir ().absoluteFilePath ("red.dat"))};
|
QString fname {QDir::toNativeSeparators(m_config.temp_dir ().absoluteFilePath ("red.dat"))};
|
||||||
m_wideGraph->setRedFile(fname);
|
m_wideGraph->setRedFile(fname);
|
||||||
displayWidgets(nWidgets("1111100100101101100000000010000000"));
|
displayWidgets(nWidgets("111110010010110110000000001000000000"));
|
||||||
statusChanged();
|
statusChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6353,7 +6387,7 @@ void MainWindow::on_actionISCAT_triggered()
|
|||||||
ui->sbSubmode->setMaximum(1);
|
ui->sbSubmode->setMaximum(1);
|
||||||
if(m_nSubMode==0) ui->TxFreqSpinBox->setValue(1012);
|
if(m_nSubMode==0) ui->TxFreqSpinBox->setValue(1012);
|
||||||
if(m_nSubMode==1) ui->TxFreqSpinBox->setValue(560);
|
if(m_nSubMode==1) ui->TxFreqSpinBox->setValue(560);
|
||||||
displayWidgets(nWidgets("1001110000000001100000000000000000"));
|
displayWidgets(nWidgets("100111000000000110000000000000000000"));
|
||||||
fast_config(true);
|
fast_config(true);
|
||||||
statusChanged ();
|
statusChanged ();
|
||||||
}
|
}
|
||||||
@ -6415,7 +6449,7 @@ void MainWindow::on_actionMSK144_triggered()
|
|||||||
ui->rptSpinBox->setValue(0);
|
ui->rptSpinBox->setValue(0);
|
||||||
ui->rptSpinBox->setSingleStep(1);
|
ui->rptSpinBox->setSingleStep(1);
|
||||||
ui->sbFtol->values ({20, 50, 100, 200});
|
ui->sbFtol->values ({20, 50, 100, 200});
|
||||||
displayWidgets(nWidgets("1011111101000000000100010000100000"));
|
displayWidgets(nWidgets("101111110100000000010001000010000000"));
|
||||||
fast_config(m_bFastMode);
|
fast_config(m_bFastMode);
|
||||||
statusChanged();
|
statusChanged();
|
||||||
|
|
||||||
@ -6455,7 +6489,7 @@ void MainWindow::on_actionWSPR_triggered()
|
|||||||
m_bFastMode=false;
|
m_bFastMode=false;
|
||||||
m_bFast9=false;
|
m_bFast9=false;
|
||||||
ui->TxFreqSpinBox->setValue(ui->WSPRfreqSpinBox->value());
|
ui->TxFreqSpinBox->setValue(ui->WSPRfreqSpinBox->value());
|
||||||
displayWidgets(nWidgets("0000000000000000010100000000000000"));
|
displayWidgets(nWidgets("000000000000000001010000000000000000"));
|
||||||
fast_config(false);
|
fast_config(false);
|
||||||
statusChanged();
|
statusChanged();
|
||||||
}
|
}
|
||||||
@ -6488,7 +6522,7 @@ void MainWindow::on_actionEcho_triggered()
|
|||||||
m_bFast9=false;
|
m_bFast9=false;
|
||||||
WSPR_config(true);
|
WSPR_config(true);
|
||||||
ui->decodedTextLabel->setText(" UTC N Level Sig DF Width Q");
|
ui->decodedTextLabel->setText(" UTC N Level Sig DF Width Q");
|
||||||
displayWidgets(nWidgets("0000000000000000000000100000000000"));
|
displayWidgets(nWidgets("000000000000000000000010000000000000"));
|
||||||
fast_config(false);
|
fast_config(false);
|
||||||
statusChanged();
|
statusChanged();
|
||||||
}
|
}
|
||||||
@ -6514,7 +6548,7 @@ void MainWindow::on_actionFreqCal_triggered()
|
|||||||
// 18:15:47 0 1 1500 1550.349 0.100 3.5 10.2
|
// 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->decodedTextLabel->setText(" UTC Freq CAL Offset fMeas DF Level S/N");
|
||||||
ui->measure_check_box->setChecked (false);
|
ui->measure_check_box->setChecked (false);
|
||||||
displayWidgets(nWidgets("0011010000000000000000000000010000"));
|
displayWidgets(nWidgets("001101000000000000000000000001000000"));
|
||||||
statusChanged();
|
statusChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6620,6 +6654,41 @@ void MainWindow::on_RxFreqSpinBox_valueChanged(int n)
|
|||||||
statusUpdate ();
|
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)
|
void MainWindow::on_actionQuickDecode_toggled (bool checked)
|
||||||
{
|
{
|
||||||
m_ndepth ^= (-checked ^ m_ndepth) & 0x00000001;
|
m_ndepth ^= (-checked ^ m_ndepth) & 0x00000001;
|
||||||
@ -7467,7 +7536,7 @@ void MainWindow::on_sbTR_valueChanged(int value)
|
|||||||
m_wideGraph->setPeriod (value, m_nsps);
|
m_wideGraph->setPeriod (value, m_nsps);
|
||||||
progressBar.setMaximum (value);
|
progressBar.setMaximum (value);
|
||||||
}
|
}
|
||||||
if(m_mode=="FST4") sbFtolMaxVal();
|
if(m_mode=="FST4") chk_FST4_freq_range();
|
||||||
if(m_monitoring) {
|
if(m_monitoring) {
|
||||||
on_stopButton_clicked();
|
on_stopButton_clicked();
|
||||||
on_monitorButton_clicked(true);
|
on_monitorButton_clicked(true);
|
||||||
@ -7478,14 +7547,6 @@ void MainWindow::on_sbTR_valueChanged(int value)
|
|||||||
statusUpdate ();
|
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)
|
void MainWindow::on_sbTR_FST4W_valueChanged(int value)
|
||||||
{
|
{
|
||||||
on_sbTR_valueChanged(value);
|
on_sbTR_valueChanged(value);
|
||||||
|
@ -305,6 +305,9 @@ private slots:
|
|||||||
void on_sbNlist_valueChanged(int n);
|
void on_sbNlist_valueChanged(int n);
|
||||||
void on_sbNslots_valueChanged(int n);
|
void on_sbNslots_valueChanged(int n);
|
||||||
void on_sbMax_dB_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_pbFoxReset_clicked();
|
||||||
void on_comboBoxHoundSort_activated (int index);
|
void on_comboBoxHoundSort_activated (int index);
|
||||||
void not_GA_warning_message ();
|
void not_GA_warning_message ();
|
||||||
@ -312,7 +315,6 @@ private slots:
|
|||||||
void on_pbBestSP_clicked();
|
void on_pbBestSP_clicked();
|
||||||
void on_RoundRobin_currentTextChanged(QString text);
|
void on_RoundRobin_currentTextChanged(QString text);
|
||||||
void setTxMsg(int n);
|
void setTxMsg(int n);
|
||||||
void sbFtolMaxVal();
|
|
||||||
bool stdCall(QString const& w);
|
bool stdCall(QString const& w);
|
||||||
void remote_configure (QString const& mode, quint32 frequency_tolerance, QString const& submode
|
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
|
, bool fast_mode, quint32 tr_period, quint32 rx_df, QString const& dx_call
|
||||||
@ -525,6 +527,7 @@ private:
|
|||||||
bool m_bWarnedSplit=false;
|
bool m_bWarnedSplit=false;
|
||||||
bool m_bTUmsg;
|
bool m_bTUmsg;
|
||||||
bool m_bBestSPArmed=false;
|
bool m_bBestSPArmed=false;
|
||||||
|
bool m_bOK_to_chk=false;
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
@ -658,6 +658,299 @@ QPushButton[state="ok"] {
|
|||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout_3">
|
<layout class="QGridLayout" name="gridLayout_3">
|
||||||
|
<item row="18" column="0" colspan="2">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cbShMsgs">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check to use short-format messages.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleDescription">
|
||||||
|
<string>Check to use short-format messages.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Sh</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cbFast9">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check to enable JT9 fast modes</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleDescription">
|
||||||
|
<string>Check to enable JT9 fast modes</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Fast</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cbAutoSeq">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check to enable automatic sequencing of Tx messages based on received messages.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleDescription">
|
||||||
|
<string>Check to enable automatic sequencing of Tx messages based on received messages.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Auto Seq</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cbFirst">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check to call the first decoded responder to my CQ.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleDescription">
|
||||||
|
<string>Check to call the first decoded responder to my CQ.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Call 1st</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cbTx6">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Check to generate "@1250 (SEND MSGS)" in Tx6.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Tx6</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="8" column="1">
|
||||||
|
<widget class="LettersSpinBox" name="sbSubmode">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Submode determines tone spacing; A is narrowest.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleDescription">
|
||||||
|
<string>Submode determines tone spacing; A is narrowest.</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string>Submode </string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>7</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="17" column="0" colspan="2">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_11">
|
||||||
|
<item>
|
||||||
|
<widget class="QSpinBox" name="sbCQTxFreq">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Frequency to call CQ on in kHz above the current MHz</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleDescription">
|
||||||
|
<string>Frequency to call CQ on in kHz above the current MHz</string>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string>Tx CQ </string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>999</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>260</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cbCQTx">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check this to call CQ on the &quot;Tx CQ&quot; frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on.</p><p>Not available to nonstandard callsign holders.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleDescription">
|
||||||
|
<string>Check this to call CQ on the "Tx CQ" frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on.
|
||||||
|
Not available to nonstandard callsign holders.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cbRxAll">
|
||||||
|
<property name="text">
|
||||||
|
<string>Rx All Freqs</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QPushButton" name="pbTxMode">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Toggle Tx mode</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Tx JT9 @</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="19" column="0" colspan="2">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_15">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labDXped">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>100</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Fox</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cbSWL">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check to monitor Sh messages.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleDescription">
|
||||||
|
<string>Check to monitor Sh messages.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>SWL</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pbBestSP">
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">QPushButton:checked {
|
||||||
|
color: rgb(0, 0, 0);
|
||||||
|
background-color: red;
|
||||||
|
border-style: outset;
|
||||||
|
border-width: 1px;
|
||||||
|
border-radius: 5px;
|
||||||
|
border-color: black;
|
||||||
|
min-width: 5em;
|
||||||
|
padding: 3px;
|
||||||
|
}</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Best S+P</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="measure_check_box">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check this to start recording calibration data.<br/>While measuring calibration correction is disabled.<br/>When not checked you can view the calibration results.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleDescription">
|
||||||
|
<string>Check this to start recording calibration data.
|
||||||
|
While measuring calibration correction is disabled.
|
||||||
|
When not checked you can view the calibration results.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Measure</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QSpinBox" name="TxFreqSpinBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Audio Tx frequency</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string> Hz</string>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string>Tx </string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>200</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>5000</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>1500</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="1">
|
||||||
|
<widget class="QSpinBox" name="sbSerialNumber">
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string>Tx# </string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>4095</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="20" column="0">
|
||||||
|
<spacer name="verticalSpacer_4">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="1" column="1">
|
||||||
<widget class="QCheckBox" name="cbHoldTxFreq">
|
<widget class="QCheckBox" name="cbHoldTxFreq">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
@ -671,7 +964,108 @@ QPushButton[state="ok"] {
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="txFirstCheckBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleDescription">
|
||||||
|
<string>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Tx even/1st</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="1">
|
||||||
|
<widget class="QSpinBox" name="syncSpinBox">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Synchronizing threshold. Lower numbers accept weaker sync signals.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleDescription">
|
||||||
|
<string>Synchronizing threshold. Lower numbers accept weaker sync signals.</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string>Sync </string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>-1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>10</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="1">
|
||||||
|
<widget class="QLabel" name="labNextCall">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Double-click on another caller to queue that call for your next QSO.</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="accessibleDescription">
|
||||||
|
<string>Double-click on another caller to queue that call for your next QSO.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Next Call</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QSpinBox" name="sbF_High">
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="suffix">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string>F High </string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>5000</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>1400</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QSpinBox" name="sbF_Low">
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="prefix">
|
||||||
|
<string>F Low </string>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>5000</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>600</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
<widget class="QSpinBox" name="RxFreqSpinBox">
|
<widget class="QSpinBox" name="RxFreqSpinBox">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Audio Rx frequency</string>
|
<string>Audio Rx frequency</string>
|
||||||
@ -696,7 +1090,7 @@ QPushButton[state="ok"] {
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="4" column="0">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="pbR2T">
|
<widget class="QPushButton" name="pbR2T">
|
||||||
@ -784,265 +1178,7 @@ QPushButton[state="ok"] {
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="6" column="0">
|
||||||
<widget class="QSpinBox" name="syncSpinBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Synchronizing threshold. Lower numbers accept weaker sync signals.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleDescription">
|
|
||||||
<string>Synchronizing threshold. Lower numbers accept weaker sync signals.</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="prefix">
|
|
||||||
<string>Sync </string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>-1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>10</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="0" colspan="2">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="cbShMsgs">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Check to use short-format messages.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleDescription">
|
|
||||||
<string>Check to use short-format messages.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Sh</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="cbFast9">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Check to enable JT9 fast modes</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleDescription">
|
|
||||||
<string>Check to enable JT9 fast modes</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Fast</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="cbAutoSeq">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Check to enable automatic sequencing of Tx messages based on received messages.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleDescription">
|
|
||||||
<string>Check to enable automatic sequencing of Tx messages based on received messages.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Auto Seq</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="cbFirst">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Check to call the first decoded responder to my CQ.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleDescription">
|
|
||||||
<string>Check to call the first decoded responder to my CQ.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Call 1st</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="cbTx6">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Check to generate "@1250 (SEND MSGS)" in Tx6.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx6</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QCheckBox" name="txFirstCheckBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleDescription">
|
|
||||||
<string>Check to Tx in even-numbered minutes or sequences, starting at 0; uncheck for odd sequences.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx even/1st</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="0" colspan="2">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_11">
|
|
||||||
<item>
|
|
||||||
<widget class="QSpinBox" name="sbCQTxFreq">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Frequency to call CQ on in kHz above the current MHz</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleDescription">
|
|
||||||
<string>Frequency to call CQ on in kHz above the current MHz</string>
|
|
||||||
</property>
|
|
||||||
<property name="prefix">
|
|
||||||
<string>Tx CQ </string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>999</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>260</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="cbCQTx">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Check this to call CQ on the &quot;Tx CQ&quot; frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on.</p><p>Not available to nonstandard callsign holders.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleDescription">
|
|
||||||
<string>Check this to call CQ on the "Tx CQ" frequency. Rx will be on the current frequency and the CQ message wiill include the current Rx frequency so callers know which frequency to reply on.
|
|
||||||
Not available to nonstandard callsign holders.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="cbRxAll">
|
|
||||||
<property name="text">
|
|
||||||
<string>Rx All Freqs</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="1">
|
|
||||||
<widget class="LettersSpinBox" name="sbSubmode">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Submode determines tone spacing; A is narrowest.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleDescription">
|
|
||||||
<string>Submode determines tone spacing; A is narrowest.</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="prefix">
|
|
||||||
<string>Submode </string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>7</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="0" colspan="2">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_15">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="labDXped">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>100</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Fox</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="cbSWL">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Check to monitor Sh messages.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleDescription">
|
|
||||||
<string>Check to monitor Sh messages.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>SWL</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="pbBestSP">
|
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">QPushButton:checked {
|
|
||||||
color: rgb(0, 0, 0);
|
|
||||||
background-color: red;
|
|
||||||
border-style: outset;
|
|
||||||
border-width: 1px;
|
|
||||||
border-radius: 5px;
|
|
||||||
border-color: black;
|
|
||||||
min-width: 5em;
|
|
||||||
padding: 3px;
|
|
||||||
}</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Best S+P</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="measure_check_box">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Check this to start recording calibration data.<br/>While measuring calibration correction is disabled.<br/>When not checked you can view the calibration results.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleDescription">
|
|
||||||
<string>Check this to start recording calibration data.
|
|
||||||
While measuring calibration correction is disabled.
|
|
||||||
When not checked you can view the calibration results.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Measure</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QSpinBox" name="rptSpinBox">
|
<widget class="QSpinBox" name="rptSpinBox">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB).</p></body></html></string>
|
<string><html><head/><body><p>Signal report: Signal-to-noise ratio in 2500 Hz reference bandwidth (dB).</p></body></html></string>
|
||||||
@ -1067,7 +1203,7 @@ When not checked you can view the calibration results.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="7" column="0">
|
||||||
<widget class="RestrictedSpinBox" name="sbTR">
|
<widget class="RestrictedSpinBox" name="sbTR">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Tx/Rx or Frequency calibration sequence length</p></body></html></string>
|
<string><html><head/><body><p>Tx/Rx or Frequency calibration sequence length</p></body></html></string>
|
||||||
@ -1095,95 +1231,6 @@ When not checked you can view the calibration results.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
|
||||||
<widget class="QPushButton" name="pbTxMode">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Toggle Tx mode</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Tx JT9 @</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QSpinBox" name="TxFreqSpinBox">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Audio Tx frequency</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="suffix">
|
|
||||||
<string> Hz</string>
|
|
||||||
</property>
|
|
||||||
<property name="prefix">
|
|
||||||
<string>Tx </string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>200</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>5000</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>1500</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="1">
|
|
||||||
<widget class="QSpinBox" name="sbSerialNumber">
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
<property name="prefix">
|
|
||||||
<string>Tx# </string>
|
|
||||||
</property>
|
|
||||||
<property name="minimum">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>4095</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QLabel" name="labNextCall">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Double-click on another caller to queue that call for your next QSO.</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="accessibleDescription">
|
|
||||||
<string>Double-click on another caller to queue that call for your next QSO.</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Next Call</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="9" column="0">
|
|
||||||
<spacer name="verticalSpacer_4">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@ -2423,6 +2470,9 @@ Yellow when too low</string>
|
|||||||
<property name="prefix">
|
<property name="prefix">
|
||||||
<string>NB </string>
|
<string>NB </string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<number>-2</number>
|
||||||
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>25</number>
|
<number>25</number>
|
||||||
</property>
|
</property>
|
||||||
@ -3348,8 +3398,6 @@ Yellow when too low</string>
|
|||||||
<tabstop>addButton</tabstop>
|
<tabstop>addButton</tabstop>
|
||||||
<tabstop>txFirstCheckBox</tabstop>
|
<tabstop>txFirstCheckBox</tabstop>
|
||||||
<tabstop>TxFreqSpinBox</tabstop>
|
<tabstop>TxFreqSpinBox</tabstop>
|
||||||
<tabstop>rptSpinBox</tabstop>
|
|
||||||
<tabstop>sbTR</tabstop>
|
|
||||||
<tabstop>sbCQTxFreq</tabstop>
|
<tabstop>sbCQTxFreq</tabstop>
|
||||||
<tabstop>cbCQTx</tabstop>
|
<tabstop>cbCQTx</tabstop>
|
||||||
<tabstop>cbShMsgs</tabstop>
|
<tabstop>cbShMsgs</tabstop>
|
||||||
|
@ -163,7 +163,6 @@ void CPlotter::draw(float swide[], bool bScroll, bool bRed)
|
|||||||
int iz=XfromFreq(5000.0);
|
int iz=XfromFreq(5000.0);
|
||||||
int jz=iz*m_binsPerPixel;
|
int jz=iz*m_binsPerPixel;
|
||||||
m_fMax=FreqfromX(iz);
|
m_fMax=FreqfromX(iz);
|
||||||
|
|
||||||
if(bScroll and swide[0]<1.e29) {
|
if(bScroll and swide[0]<1.e29) {
|
||||||
flat4_(swide,&iz,&m_Flatten);
|
flat4_(swide,&iz,&m_Flatten);
|
||||||
if(!m_bReplot) flat4_(&dec_data.savg[j0],&jz,&m_Flatten);
|
if(!m_bReplot) flat4_(&dec_data.savg[j0],&jz,&m_Flatten);
|
||||||
@ -506,11 +505,20 @@ void CPlotter::DrawOverlay() //DrawOverlay()
|
|||||||
or m_mode=="QRA64" or m_mode=="FT8" or m_mode=="FT4"
|
or m_mode=="QRA64" or m_mode=="FT8" or m_mode=="FT4"
|
||||||
or m_mode.startsWith("FST4")) {
|
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=="JT65" and m_bVHF)) {
|
if(m_mode=="QRA64" or (m_mode=="JT65" and m_bVHF)) {
|
||||||
painter0.setPen(penGreen);
|
painter0.setPen(penGreen);
|
||||||
x1=XfromFreq(m_rxFreq-m_tol);
|
x1=XfromFreq(m_rxFreq-m_tol);
|
||||||
x2=XfromFreq(m_rxFreq+m_tol);
|
x2=XfromFreq(m_rxFreq+m_tol);
|
||||||
painter0.drawLine(x1,28,x2,28);
|
painter0.drawLine(x1,26,x2,26);
|
||||||
x1=XfromFreq(m_rxFreq);
|
x1=XfromFreq(m_rxFreq);
|
||||||
painter0.drawLine(x1,24,x1,30);
|
painter0.drawLine(x1,24,x1,30);
|
||||||
|
|
||||||
@ -539,8 +547,7 @@ void CPlotter::DrawOverlay() //DrawOverlay()
|
|||||||
x1=XfromFreq(m_rxFreq-m_tol);
|
x1=XfromFreq(m_rxFreq-m_tol);
|
||||||
x2=XfromFreq(m_rxFreq+m_tol);
|
x2=XfromFreq(m_rxFreq+m_tol);
|
||||||
painter0.drawLine(x1,26,x2,26); // Mark the Tol range
|
painter0.drawLine(x1,26,x2,26); // Mark the Tol range
|
||||||
}
|
} }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_mode=="JT9" or m_mode=="JT65" or m_mode=="JT9+JT65" or
|
if(m_mode=="JT9" or m_mode=="JT65" or m_mode=="JT9+JT65" or
|
||||||
@ -655,7 +662,9 @@ void CPlotter::setPlot2dZero(int plot2dZero) //setPlot2dZero
|
|||||||
void CPlotter::setStartFreq(int f) //SetStartFreq()
|
void CPlotter::setStartFreq(int f) //SetStartFreq()
|
||||||
{
|
{
|
||||||
m_startFreq=f;
|
m_startFreq=f;
|
||||||
|
m_fMax=FreqfromX(XfromFreq(5000.0));
|
||||||
resizeEvent(NULL);
|
resizeEvent(NULL);
|
||||||
|
DrawOverlay();
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -676,6 +685,7 @@ void CPlotter::setRxRange(int fMin) //setRxRange
|
|||||||
void CPlotter::setBinsPerPixel(int n) //setBinsPerPixel
|
void CPlotter::setBinsPerPixel(int n) //setBinsPerPixel
|
||||||
{
|
{
|
||||||
m_binsPerPixel = n;
|
m_binsPerPixel = n;
|
||||||
|
m_fMax=FreqfromX(XfromFreq(5000.0));
|
||||||
DrawOverlay(); //Redraw scales and ticks
|
DrawOverlay(); //Redraw scales and ticks
|
||||||
update(); //trigger a new paintEvent}
|
update(); //trigger a new paintEvent}
|
||||||
}
|
}
|
||||||
@ -809,9 +819,22 @@ void CPlotter::setFlatten(bool b1, bool b2)
|
|||||||
void CPlotter::setTol(int n) //setTol()
|
void CPlotter::setTol(int n) //setTol()
|
||||||
{
|
{
|
||||||
m_tol=n;
|
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)
|
void CPlotter::setColours(QVector<QColor> const& cl)
|
||||||
{
|
{
|
||||||
g_ColorTbl = cl;
|
g_ColorTbl = cl;
|
||||||
|
@ -83,6 +83,9 @@ public:
|
|||||||
void drawRed(int ia, int ib, float swide[]);
|
void drawRed(int ia, int ib, float swide[]);
|
||||||
void setVHF(bool bVHF);
|
void setVHF(bool bVHF);
|
||||||
void setRedFile(QString fRed);
|
void setRedFile(QString fRed);
|
||||||
|
void setFST4_FreqRange(int fLow,int fHigh);
|
||||||
|
void setSingleDecode(bool b);
|
||||||
|
|
||||||
bool scaleOK () const {return m_bScaleOK;}
|
bool scaleOK () const {return m_bScaleOK;}
|
||||||
signals:
|
signals:
|
||||||
void freezeDecode1(int n);
|
void freezeDecode1(int n);
|
||||||
@ -111,6 +114,7 @@ private:
|
|||||||
bool m_bReference;
|
bool m_bReference;
|
||||||
bool m_bReference0;
|
bool m_bReference0;
|
||||||
bool m_bVHF;
|
bool m_bVHF;
|
||||||
|
bool m_bSingleDecode;
|
||||||
|
|
||||||
float m_fSpan;
|
float m_fSpan;
|
||||||
|
|
||||||
@ -125,6 +129,8 @@ private:
|
|||||||
qint32 m_nSubMode;
|
qint32 m_nSubMode;
|
||||||
qint32 m_ia;
|
qint32 m_ia;
|
||||||
qint32 m_ib;
|
qint32 m_ib;
|
||||||
|
qint32 m_nfa;
|
||||||
|
qint32 m_nfb;
|
||||||
|
|
||||||
QPixmap m_WaterfallPixmap;
|
QPixmap m_WaterfallPixmap;
|
||||||
QPixmap m_2DPixmap;
|
QPixmap m_2DPixmap;
|
||||||
|
@ -500,6 +500,16 @@ void WideGraph::setTol(int n) //setTol
|
|||||||
ui->widePlot->update();
|
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)
|
void WideGraph::on_smoSpinBox_valueChanged(int n)
|
||||||
{
|
{
|
||||||
m_nsmo=n;
|
m_nsmo=n;
|
||||||
|
@ -49,6 +49,8 @@ public:
|
|||||||
void drawRed(int ia, int ib);
|
void drawRed(int ia, int ib);
|
||||||
void setVHF(bool bVHF);
|
void setVHF(bool bVHF);
|
||||||
void setRedFile(QString fRed);
|
void setRedFile(QString fRed);
|
||||||
|
void setFST4_FreqRange(int fLow,int fHigh);
|
||||||
|
void setSingleDecode(bool b);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void freezeDecode2(int n);
|
void freezeDecode2(int n);
|
||||||
|
Loading…
Reference in New Issue
Block a user