Change Fox/Hound checkboxes to radio buttons and move them into the same group box as the other contest radio buttons.

Make the group box checkable and the radio buttons mutually exclusive.
Prevent switch from any other mode to MSK144 and put up an error box if the contest radio button setting is not allowed for MSK144.
If currently in MSK144 mode and an invalid contest type is selected, put up an error box and change mode to FT8 where any contest type is allowed.
This commit is contained in:
Steve Franke 2018-10-27 17:21:29 -05:00
parent 5f37525db4
commit 9baa8c755d
4 changed files with 243 additions and 234 deletions

View File

@ -446,8 +446,8 @@ private:
Q_SLOT void handle_transceiver_failure (QString const& reason);
Q_SLOT void on_reset_highlighting_to_defaults_push_button_clicked (bool);
Q_SLOT void on_LotW_CSV_fetch_push_button_clicked (bool);
Q_SLOT void on_cbFox_clicked (bool);
Q_SLOT void on_cbHound_clicked (bool);
Q_SLOT void on_rbFox_clicked (bool);
Q_SLOT void on_rbHound_clicked (bool);
Q_SLOT void on_cbx2ToneSpacing_clicked(bool);
Q_SLOT void on_cbx4ToneSpacing_clicked(bool);
Q_SLOT void on_rbFieldDay_toggled();
@ -578,7 +578,7 @@ private:
bool twoPass_;
bool bFox_;
bool bHound_;
bool bNoSpecial_;
bool bSpecialOp_;
bool bFieldDay_;
bool bRTTYroundup_;
bool bNA_VHF_Contest_;
@ -676,7 +676,7 @@ bool Configuration::single_decode () const {return m_->single_decode_;}
bool Configuration::twoPass() const {return m_->twoPass_;}
bool Configuration::bFox() const {return m_->bFox_;}
bool Configuration::bHound() const {return m_->bHound_;}
bool Configuration::bNoSpecial() const {return m_->bNoSpecial_;}
bool Configuration::bSpecialOp() const {return m_->bSpecialOp_;}
bool Configuration::bFieldDay() const {return m_->bFieldDay_;}
bool Configuration::bRTTYroundup() const {return m_->bRTTYroundup_;}
bool Configuration::bNA_VHF_Contest() const {return m_->bNA_VHF_Contest_;}
@ -1201,9 +1201,9 @@ void Configuration::impl::initialize_models ()
ui_->decode_at_52s_check_box->setChecked(decode_at_52s_);
ui_->single_decode_check_box->setChecked(single_decode_);
ui_->cbTwoPass->setChecked(twoPass_);
ui_->cbFox->setChecked(bFox_);
ui_->cbHound->setChecked(bHound_);
ui_->rbNone->setChecked(bNoSpecial_);
ui_->rbFox->setChecked(bFox_);
ui_->rbHound->setChecked(bHound_);
ui_->gbSpecialOpActivity->setChecked(bSpecialOp_);
ui_->rbFieldDay->setChecked(bFieldDay_);
ui_->rbRTTYroundup->setChecked(bRTTYroundup_);
ui_->rbNA_VHF_Contest->setChecked(bNA_VHF_Contest_);
@ -1455,7 +1455,7 @@ void Configuration::impl::read_settings ()
twoPass_ = settings_->value("TwoPass",true).toBool ();
bFox_ = settings_->value("Fox",false).toBool ();
bHound_ = settings_->value("Hound",false).toBool ();
bNoSpecial_ = settings_->value("NoSpecial",false).toBool ();
bSpecialOp_ = settings_->value("SpecialOpActivity",false).toBool ();
bFieldDay_ = settings_->value("FieldDay",false).toBool ();
bRTTYroundup_ = settings_->value("RTTYroundup",false).toBool ();
bNA_VHF_Contest_ = settings_->value("NA_VHF_Contest",false).toBool ();
@ -1566,7 +1566,7 @@ void Configuration::impl::write_settings ()
settings_->setValue ("TwoPass", twoPass_);
settings_->setValue ("Fox", bFox_);
settings_->setValue ("Hound", bHound_);
settings_->setValue ("NoSpecial", bNoSpecial_);
settings_->setValue ("SpecialOpActivity", bSpecialOp_);
settings_->setValue ("FieldDay", bFieldDay_);
settings_->setValue ("RTTYroundup", bRTTYroundup_);
settings_->setValue ("NA_VHF_Contest", bNA_VHF_Contest_);
@ -1971,10 +1971,10 @@ void Configuration::impl::accept ()
decode_at_52s_ = ui_->decode_at_52s_check_box->isChecked ();
single_decode_ = ui_->single_decode_check_box->isChecked ();
twoPass_ = ui_->cbTwoPass->isChecked ();
bFox_ = ui_->cbFox->isChecked ();
bHound_ = ui_->cbHound->isChecked ();
if(bFox_ or bHound_) ui_->rbNone->setChecked(true); //###
bNoSpecial_ = ui_->rbNone->isChecked ();
bFox_ = ui_->rbFox->isChecked ();
bHound_ = ui_->rbHound->isChecked ();
// if(bFox_ or bHound_) ui_->gbSpecialOpActivity->setChecked(true); //###
bSpecialOp_ = ui_->gbSpecialOpActivity->isChecked ();
bFieldDay_ = ui_->rbFieldDay->isChecked ();
bRTTYroundup_ = ui_->rbRTTYroundup->isChecked ();
bNA_VHF_Contest_ = ui_->rbNA_VHF_Contest->isChecked ();
@ -2458,19 +2458,21 @@ void Configuration::impl::on_cbAutoLog_clicked(bool checked)
if(checked) ui_->prompt_to_log_check_box->setChecked(false);
}
void Configuration::impl::on_cbFox_clicked (bool checked)
//These are not needed because Fox and Hound have been converted to
//mutually exclusive radio buttons.
void Configuration::impl::on_rbFox_clicked (bool checked)
{
if(checked) {
ui_->cbHound->setChecked (false);
ui_->rbNone->setChecked(true);
// ui_->rbHound->setChecked (false);
// ui_->rbNone->setChecked(true);
}
}
void Configuration::impl::on_cbHound_clicked (bool checked)
void Configuration::impl::on_rbHound_clicked (bool checked)
{
if(checked) {
ui_->cbFox->setChecked (false);
ui_->rbNone->setChecked(true);
// ui_->rbFox->setChecked (false);
// ui_->rbNone->setChecked(true);
}
}

View File

@ -136,7 +136,7 @@ public:
bool bHound() const;
bool bGenerate77() const;
bool bDecode77() const;
bool bNoSpecial() const;
bool bSpecialOp() const;
bool bFieldDay() const;
bool bRTTYroundup() const;
bool bNA_VHF_Contest() const;

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>527</width>
<height>540</height>
<width>679</width>
<height>619</height>
</rect>
</property>
<property name="windowTitle">
@ -20,7 +20,7 @@
<string>Select tab to change configuration parameters.</string>
</property>
<property name="currentIndex">
<number>0</number>
<number>7</number>
</property>
<widget class="QWidget" name="general_tab">
<attribute name="title">
@ -2425,131 +2425,32 @@ Right click for insert and delete options.</string>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_7">
<property name="title">
<string>FT8 DXpedition mode</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_16">
<item>
<widget class="QCheckBox" name="cbFox">
<property name="toolTip">
<string>Fox is the DXpedition station</string>
</property>
<property name="text">
<string> Fox</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cbHound">
<property name="toolTip">
<string>Everybody else is a Hound</string>
</property>
<property name="text">
<string>Hound</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_9">
<item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="gbSpecialOpActivity">
<property name="title">
<string>Special operating activity: Generation of FT8 and MSK144 messages</string>
</property>
<layout class="QGridLayout" name="gridLayout_15" columnstretch="1,2,1,0">
<item row="0" column="0">
<widget class="QRadioButton" name="rbNone">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;For normal operating&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_15" columnstretch="1,2,1,0,0">
<item row="0" column="1" rowspan="3">
<spacer name="horizontalSpacer_11">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="text">
<string>None</string>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</spacer>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="rbEU_VHF_Contest">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;European VHF+ contests requiring a signal report, serial number, and 6-character locator.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>EU VHF Contest</string>
</property>
</widget>
</item>
<item row="2" column="2">
<layout class="QHBoxLayout" name="horizontalLayout_18" stretch="2,1,1">
<item>
<widget class="QRadioButton" name="rbRTTYroundup">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &amp;quot;DX&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>ARRL RTTY Roundup</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_10">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QFormLayout" name="formLayout_17">
<item row="0" column="0">
<widget class="QLabel" name="labRTTY">
<property name="text">
<string>Exch:</string>
</property>
<property name="buddy">
<cstring>RTTY_Exchange</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="RTTY_Exchange">
<property name="minimumSize">
<size>
<width>70</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &amp;quot;DX&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>NJ</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="1" column="2">
<item row="1" column="3">
<layout class="QHBoxLayout" name="horizontalLayout_17" stretch="2,1,1">
<item>
<widget class="QRadioButton" name="rbFieldDay">
@ -2609,6 +2510,95 @@ Right click for insert and delete options.</string>
</item>
</layout>
</item>
<item row="2" column="3">
<layout class="QHBoxLayout" name="horizontalLayout_18" stretch="2,1,1">
<item>
<widget class="QRadioButton" name="rbRTTYroundup">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &amp;quot;DX&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>ARRL RTTY Roundup</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_10">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QFormLayout" name="formLayout_17">
<item row="0" column="0">
<widget class="QLabel" name="labRTTY">
<property name="text">
<string>Exch:</string>
</property>
<property name="buddy">
<cstring>RTTY_Exchange</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="RTTY_Exchange">
<property name="minimumSize">
<size>
<width>70</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ARRL RTTY Roundup and similar contests. Exchange is US state, Canadian province, or &amp;quot;DX&amp;quot;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>NJ</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="rbFox">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;For normal operating&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Fox</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="rbEU_VHF_Contest">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;European VHF+ contests requiring a signal report, serial number, and 6-character locator.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>EU VHF Contest</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="rbNA_VHF_Contest">
<property name="sizePolicy">
@ -2625,20 +2615,7 @@ Right click for insert and delete options.</string>
</property>
</widget>
</item>
<item row="0" column="1" rowspan="3">
<spacer name="horizontalSpacer_11">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="3" rowspan="3">
<item row="0" column="4" rowspan="3">
<spacer name="horizontalSpacer_12">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@ -2651,6 +2628,16 @@ Right click for insert and delete options.</string>
</property>
</spacer>
</item>
<item row="0" column="3">
<widget class="QRadioButton" name="rbHound">
<property name="text">
<string>Hound</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -2788,7 +2775,7 @@ Right click for insert and delete options.</string>
</layout>
</widget>
</item>
<item row="3" column="0" colspan="2">
<item row="2" column="0" colspan="2">
<spacer name="verticalSpacer_8">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -2928,9 +2915,7 @@ Right click for insert and delete options.</string>
<tabstop>sbTxDelay</tabstop>
<tabstop>cbx2ToneSpacing</tabstop>
<tabstop>cbx4ToneSpacing</tabstop>
<tabstop>cbFox</tabstop>
<tabstop>cbHound</tabstop>
<tabstop>rbNone</tabstop>
<tabstop>rbFox</tabstop>
<tabstop>rbNA_VHF_Contest</tabstop>
<tabstop>rbEU_VHF_Contest</tabstop>
<tabstop>rbFieldDay</tabstop>
@ -3006,12 +2991,12 @@ Right click for insert and delete options.</string>
</connection>
</connections>
<buttongroups>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="split_mode_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="PTT_method_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
</buttongroups>
</ui>

View File

@ -1179,12 +1179,21 @@ void MainWindow::readSettings()
void MainWindow::setContestType()
{
m_nContest=NONE;
if(m_config.bNA_VHF_Contest()) m_nContest=NA_VHF;
if(m_config.bEU_VHF_Contest()) m_nContest=EU_VHF;
if(m_config.bFieldDay()) m_nContest=FIELD_DAY;
if(m_config.bRTTYroundup()) m_nContest=RTTY;
if(m_config.bFox()) m_nContest=FOX;
if(m_config.bHound()) m_nContest=HOUND;
if(m_config.bSpecialOp())
{
if(m_config.bNA_VHF_Contest()) m_nContest=NA_VHF;
if(m_config.bEU_VHF_Contest()) m_nContest=EU_VHF;
if(m_config.bFieldDay()) m_nContest=FIELD_DAY;
if(m_config.bRTTYroundup()) m_nContest=RTTY;
if(m_config.bFox()) m_nContest=FOX;
if(m_config.bHound()) m_nContest=HOUND;
if(m_mode=="MSK144" && m_nContest>EU_VHF)
{
MessageBox::warning_message (this, tr ("Improper mode"),
"Mode will be changed to FT8. MSK144 not available if Fox, Hound, Field Day, or RTTY contest is selected.");
on_actionFT8_triggered();
}
}
}
void MainWindow::set_application_font (QFont const& font)
@ -1772,7 +1781,7 @@ void MainWindow::auto_tx_mode (bool state)
void MainWindow::keyPressEvent (QKeyEvent * e)
{
if(m_config.bFox()) {
if(FOX==m_nContest) {
switch (e->key()) {
case Qt::Key_Return:
doubleClickOnCall2(Qt::KeyboardModifier(Qt::ShiftModifier + Qt::ControlModifier + Qt::AltModifier));
@ -1787,7 +1796,7 @@ void MainWindow::keyPressEvent (QKeyEvent * e)
QMainWindow::keyPressEvent (e);
}
if(m_config.bHound()) {
if(HOUND==m_nContest) {
switch (e->key()) {
case Qt::Key_Return:
auto_tx_mode(true);
@ -2706,8 +2715,8 @@ void MainWindow::decode() //decode()
dec_data.params.nfa=m_wideGraph->nStartFreq();
dec_data.params.nfSplit=m_wideGraph->Fmin();
dec_data.params.nfb=m_wideGraph->Fmax();
if(m_mode=="FT8" and m_config.bHound() and !ui->cbRxAll->isChecked()) dec_data.params.nfb=1000;
if(m_mode=="FT8" and m_config.bFox()) dec_data.params.nfqso=200;
if(m_mode=="FT8" and m_nContest==HOUND and !ui->cbRxAll->isChecked()) dec_data.params.nfb=1000;
if(m_mode=="FT8" and m_nContest==FOX) dec_data.params.nfqso=200;
dec_data.params.ntol=ui->sbFtol->value ();
if(m_mode=="JT9+JT65" or !m_config.enable_VHF_features()) {
dec_data.params.ntol=20;
@ -2883,7 +2892,7 @@ void MainWindow::decodeDone ()
decodeBusy(false);
m_RxLog=0;
m_blankLine=true;
if(m_config.bFox()) houndCallers();
if(m_nContest==FOX) houndCallers();
}
void MainWindow::readFromStdout() //readFromStdout
@ -2937,7 +2946,7 @@ void MainWindow::readFromStdout() //readFromStdout
, tr ("Cannot open \"%1\" for append: %2")
.arg (f.fileName ()).arg (f.errorString ()));
}
if (m_config.insert_blank () && m_blankLine && !m_config.bFox()) {
if (m_config.insert_blank () && m_blankLine && m_nContest!=FOX) {
QString band;
if((QDateTime::currentMSecsSinceEpoch() / 1000 - m_secBandChanged) > 4*m_TRperiod/4) {
band = ' ' + m_config.bands ()->find (m_freqNominal);
@ -2951,7 +2960,7 @@ void MainWindow::readFromStdout() //readFromStdout
DecodedText decodedtext {QString::fromUtf8(t.constData())
.remove(QRegularExpression {"\r|\n"}).remove("TU; ")};
if(m_mode=="FT8" and m_config.bFox() and
if(m_mode=="FT8" and m_nContest==FOX and
(decodedtext.string().contains("R+") or decodedtext.string().contains("R-"))) {
auto for_us = decodedtext.string().contains(" " + m_config.my_callsign() + " ") or
decodedtext.string().contains(" "+m_baseCall) or
@ -2967,7 +2976,7 @@ void MainWindow::readFromStdout() //readFromStdout
//Left (Band activity) window
if(!bAvgMsg) {
if(m_mode=="FT8" and m_config.bFox()) {
if(m_mode=="FT8" and m_nContest==FOX) {
if(!m_bDisplayedOnce) {
// This hack sets the font. Surely there's a better way!
DecodedText dt{"."};
@ -2994,15 +3003,15 @@ void MainWindow::readFromStdout() //readFromStdout
|| ("DE" == parts[5] && qAbs (ui->RxFreqSpinBox->value () - audioFreq) <= 10);
if(m_baseCall==m_config.my_callsign() and m_baseCall!=parts[5]) for_us=false;
if(m_bCallingCQ && !m_bAutoReply && for_us && ui->cbFirst->isChecked() and
!m_config.bFox() and !m_config.bHound()) {
m_nContest<FOX) {
m_bDoubleClicked=true;
m_bAutoReply = true;
if(!m_config.bFox()) processMessage (decodedtext);
if(m_nContest!=FOX) processMessage (decodedtext);
ui->cbFirst->setStyleSheet("");
}
if(m_config.bFox() and decodedtext.string().contains(" DE ")) for_us=true; //Hound with compound callsign
if(m_config.bFox() and for_us and (audioFreq<1000)) bDisplayRight=true;
if(!m_config.bFox() and (for_us or (abs(audioFreq - m_wideGraph->rxFreq()) <= 10))) bDisplayRight=true;
if(m_nContest==FOX and decodedtext.string().contains(" DE ")) for_us=true; //Hound with compound callsign
if(m_nContest==FOX and for_us and (audioFreq<1000)) bDisplayRight=true;
if(m_nContest!=FOX and (for_us or (abs(audioFreq - m_wideGraph->rxFreq()) <= 10))) bDisplayRight=true;
}
} else {
if(abs(audioFreq - m_wideGraph->rxFreq()) <= 10) bDisplayRight=true;
@ -3022,7 +3031,7 @@ void MainWindow::readFromStdout() //readFromStdout
m_QSOText = decodedtext.string ().trimmed ();
}
if(m_mode=="FT8" and m_config.bHound()) {
if(m_mode=="FT8" and m_nContest==HOUND) {
if(decodedtext.string().contains(";")) {
QStringList w=decodedtext.string().mid(24).split(" ",QString::SkipEmptyParts);
QString foxCall=w.at(3);
@ -3064,7 +3073,7 @@ void MainWindow::readFromStdout() //readFromStdout
}
//### I think this is where we are preventing Hounds from spotting Fox ###
if(m_mode!="FT8" or !m_config.bHound()) {
if(m_mode!="FT8" or (m_nContest != HOUND)) {
if(m_mode=="FT8" or m_mode=="QRA64" or m_mode=="JT4" or m_mode=="JT65" or m_mode=="JT9") {
auto_sequence (decodedtext, 25, 50);
}
@ -3165,7 +3174,7 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler
// look for type 2 compound call replies on our Tx and Rx offsets
&& ((within_tolerance && "DE" == message_words.at (1))
|| message_words.at (1).contains (m_baseCall))))) {
if(!m_config.bFox()) processMessage (message);
if(m_nContest!=FOX) processMessage (message);
}
}
}
@ -3349,7 +3358,7 @@ void MainWindow::guiUpdate()
}
}
if(m_mode=="FT8" and m_config.bFox()) {
if(m_mode=="FT8" and m_nContest==FOX) {
// Don't allow Fox mode in any of the default FT8 sub-bands.
qint32 ft8Freq[]={1840,3573,7074,10136,14074,18100,21074,24915,28074,50313,70100};
for(int i=0; i<11; i++) {
@ -3393,12 +3402,12 @@ void MainWindow::guiUpdate()
g_iptt = 1;
setRig ();
if(m_mode=="FT8") {
if (m_config.bFox()) {
if (m_nContest==FOX) {
if (ui->TxFreqSpinBox->value() > 900) {
ui->TxFreqSpinBox->setValue(300);
}
}
else if (m_config.bHound ()) {
else if (m_nContest==HOUND) {
if(m_auto && !m_tune) {
if (ui->TxFreqSpinBox->value() < 999 && m_ntx != 3) {
int nf = (qrand() % 2000) + 1000; // Hound randomized range: 1000-3000 Hz
@ -3420,7 +3429,7 @@ void MainWindow::guiUpdate()
// If HoldTxFreq is not checked, randomize Fox's Tx Freq
// NB: Maybe this should be done no more than once every 5 minutes or so ?
if(m_mode=="FT8" and m_config.bFox() and !ui->cbHoldTxFreq->isChecked()) {
if(m_mode=="FT8" and m_nContest==FOX and !ui->cbHoldTxFreq->isChecked()) {
int fTx = 300.0 + 300.0*double(qrand())/RAND_MAX;
ui->TxFreqSpinBox->setValue(fTx);
}
@ -3476,7 +3485,7 @@ void MainWindow::guiUpdate()
}
ba=msg2.toLatin1();
} else {
if(m_config.bHound() and m_ntx!=3) { //Hound transmits only Tx1 or Tx3
if(m_nContest==HOUND and m_ntx!=3) { //Hound transmits only Tx1 or Tx3
m_ntx=1;
ui->txrb1->setChecked(true);
}
@ -3533,7 +3542,7 @@ void MainWindow::guiUpdate()
}
}
if(m_modeTx=="FT8") {
if(m_config.bFox() and ui->tabWidget->currentIndex()==2) {
if(m_nContest==FOX and ui->tabWidget->currentIndex()==2) {
foxTxSequencer();
} else {
m_isync=2;
@ -3541,7 +3550,7 @@ void MainWindow::guiUpdate()
char ft8msgbits[77];
genft8_(message, &m_i3, &m_n3, &m_isync, msgsent,
const_cast<char *> (ft8msgbits), const_cast<int *> (itone), 37, 37);
if(m_config.bFox()) {
if(m_nContest==FOX) {
//Fox must generate the full Tx waveform, not just an itone[] array.
QString fm = QString::fromStdString(message).trimmed();
foxGenWaveform(0,fm);
@ -3694,7 +3703,7 @@ void MainWindow::guiUpdate()
write_transmit_entry ("ALL.TXT");
}
if (m_config.TX_messages () && !m_tune && !m_config.bFox()) {
if (m_config.TX_messages () && !m_tune && m_nContest==FOX) {
ui->decodedTextBrowser2->displayTransmittedText(current_message, m_modeTx,
ui->TxFreqSpinBox->value(),m_bFastMode);
}
@ -3750,7 +3759,7 @@ void MainWindow::guiUpdate()
}
m_currentBand=m_config.bands()->find(m_freqNominal);
if(m_config.bHound()) {
if(m_nContest == HOUND) {
qint32 tHound=QDateTime::currentMSecsSinceEpoch()/1000 - m_tAutoOn;
//To keep calling Fox, Hound must reactivate Enable Tx at least once every 2 minutes
if(tHound >= 120 and m_ntx==1) auto_tx_mode(false);
@ -3774,7 +3783,7 @@ void MainWindow::guiUpdate()
if(m_transmitting) {
char s[42];
if(m_config.bFox() and ui->tabWidget->currentIndex()==2) {
if(m_nContest==FOX and ui->tabWidget->currentIndex()==2) {
sprintf(s,"Tx: %d Slots",foxcom_.nslots);
} else {
sprintf(s,"Tx: %s",msgsent);
@ -3796,7 +3805,7 @@ void MainWindow::guiUpdate()
} else {
s[40]=0;
QString t{QString::fromLatin1(s)};
if(m_config.bFox() and ui->tabWidget->currentIndex()==2 and foxcom_.nslots==1) {
if(m_nContest==FOX and ui->tabWidget->currentIndex()==2 and foxcom_.nslots==1) {
t=m_fm1.trimmed();
}
tx_status_label.setText(t.trimmed());
@ -3908,7 +3917,7 @@ void MainWindow::stopTx2()
m_ntr=0;
}
last_tx_label.setText("Last Tx: " + m_currentMessage.trimmed());
//### if(m_mode=="FT8" and m_config.bHound()) auto_tx_mode(false); ###
//### if(m_mode=="FT8" and (m_nContest == HOUND)) auto_tx_mode(false); ###
}
void MainWindow::ba2msg(QByteArray ba, char message[]) //ba2msg()
@ -3970,7 +3979,7 @@ void MainWindow::on_txrb1_toggled (bool status)
void MainWindow::on_txrb1_doubleClicked ()
{
if(m_mode=="FT8" and m_config.bHound()) return;
if(m_mode=="FT8" and (m_nContest==HOUND)) return;
// skip Tx1, only allowed if not a type 2 compound callsign
auto const& my_callsign = m_config.my_callsign ();
auto is_compound = my_callsign != m_baseCall;
@ -4050,7 +4059,7 @@ void MainWindow::on_txb1_clicked()
void MainWindow::on_txb1_doubleClicked()
{
if(m_mode=="FT8" and m_config.bHound()) return;
if(m_mode=="FT8" and (m_nContest==HOUND)) return;
// skip Tx1, only allowed if not a type 1 compound callsign
auto const& my_callsign = m_config.my_callsign ();
auto is_compound = my_callsign != m_baseCall;
@ -4139,7 +4148,7 @@ void MainWindow::doubleClickOnCall(Qt::KeyboardModifiers modifiers)
cursor.setPosition(cursor.selectionStart());
}
if(m_config.bFox() and m_decodedText2) {
if(m_nContest==FOX and m_decodedText2) {
if(m_houndQueue.count()<10 and m_nSortedHounds>0) {
QString t=cursor.block().text();
selectHound(t);
@ -4198,8 +4207,8 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
int nmod = message.timeInSeconds () % (2*m_TRperiod);
m_txFirst=(nmod!=0);
if(m_config.bHound()) m_txFirst=false; //Hound must not transmit first
if(m_config.bFox()) m_txFirst=true; //Fox must always transmit first
if(m_nContest==HOUND) m_txFirst=false; //Hound must not transmit first
if(m_nContest==FOX) m_txFirst=true; //Fox must always transmit first
ui->txFirstCheckBox->setChecked(m_txFirst);
auto const& message_words = message.messageWords ();
@ -4250,7 +4259,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
&& firstcall != m_config.my_callsign () && firstcall != m_baseCall
&& firstcall != "DE")
|| "CQ" == firstcall || "QRZ" == firstcall || ctrl || shift) {
if ((!m_config.bHound () || m_mode != "FT8")
if (((m_nContest != HOUND) || m_mode != "FT8")
&& (!ui->cbHoldTxFreq->isChecked () || shift || ctrl)) {
ui->TxFreqSpinBox->setValue(frequency);
}
@ -4291,7 +4300,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie
m_nContest=EU_VHF;
if(m_transmitting) m_restart=true;
ui->decodedTextBrowser2->displayQSY (QString{"Enabled EU VHF Contest messages."});
QString t0=" Tx2.0 EU VHF";
QString t0="EU VHF";
ui->labDXped->setVisible(true);
ui->labDXped->setText(t0);
}
@ -4768,9 +4777,9 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
t=t0a;
msgtype(t0a, ui->tx1);
}
if(m_config.bNA_VHF_Contest()) sent=my_grid;
if(m_config.bFieldDay()) sent=m_config.FieldDayExchange();
if(m_config.bRTTYroundup()) {
if(m_nContest==NA_VHF) sent=my_grid;
if(m_nContest==FIELD_DAY) sent=m_config.FieldDayExchange();
if(m_nContest==RTTY) {
sent=rst + m_config.RTTYExchange();
QString t1=m_config.RTTYExchange();
if(t1=="DX" or t1=="#") {
@ -4778,7 +4787,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
sent=rst + t1;
}
}
if(m_config.bEU_VHF_Contest()) {
if(m_nContest==EU_VHF) {
QString t1,a;
t=t0.split(" ").at(0) + " ";
a.sprintf("%4.4d ",ui->sbSerialNumber->value());
@ -4792,7 +4801,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
if(m_mode=="MSK144" and m_bShMsgs) {
int i=t0s.length()-1;
t0="<" + t0s.mid(0,i) + "> ";
if(!m_config.bNA_VHF_Contest()) {
if(m_nContest != NA_VHF) {
if(n<=-2) n=-3;
if(n>=-1 and n<=1) n=0;
if(n>=2 and n<=4) n=3;
@ -4854,7 +4863,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
case Configuration::type_2_msg_1_full:
msgtype(t + my_grid, ui->tx1);
if (!eme_short_codes) {
if((m_mode=="MSK144" || m_mode=="FT8") && m_config.bNA_VHF_Contest()) {
if((m_mode=="MSK144" || m_mode=="FT8") && m_nContest == NA_VHF) {
msgtype(t + "R " + my_grid, ui->tx3);
} else {
msgtype(t + "R" + rpt, ui->tx3);
@ -4866,7 +4875,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
break;
case Configuration::type_2_msg_3_full:
if ((m_mode=="MSK144" || m_mode=="FT8") && m_config.bNA_VHF_Contest()) {
if ((m_mode=="MSK144" || m_mode=="FT8") && m_nContest==NA_VHF) {
msgtype(t + "R " + my_grid, ui->tx3);
msgtype(t + "RRR", ui->tx4);
} else {
@ -4881,7 +4890,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
case Configuration::type_2_msg_5_only:
msgtype(t00 + my_grid, ui->tx1);
if (!eme_short_codes) {
if ((m_mode=="MSK144" || m_mode=="FT8") && m_config.bNA_VHF_Contest()) {
if ((m_mode=="MSK144" || m_mode=="FT8") && m_nContest==NA_VHF) {
msgtype(t + "R " + my_grid, ui->tx3);
msgtype(t + "RRR", ui->tx4);
} else {
@ -4902,7 +4911,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
msgtype(t, ui->tx5->lineEdit ());
}
} else {
if (hisCall != hisBase and !m_config.bHound()) {
if (hisCall != hisBase and m_nContest != HOUND) {
if (shortList(hisCall)) {
// cfm we know his full call with a type 1 tx1 message
t = hisCall + " " + my_callsign;
@ -4916,7 +4925,7 @@ void MainWindow::genStdMsgs(QString rpt, bool unconditional)
}
}
m_rpt=rpt;
if(m_config.bHound() and is_compound) ui->tx1->setText("DE " + m_config.my_callsign());
if(m_nContest==HOUND and is_compound) ui->tx1->setText("DE " + m_config.my_callsign());
}
void MainWindow::TxAgain()
@ -4944,7 +4953,7 @@ void MainWindow::clearDX ()
m_gen_message_is_cq = true;
ui->rbGenMsg->setChecked(true);
} else {
if(m_mode=="FT8" and m_config.bHound()) {
if(m_mode=="FT8" and m_nContest==HOUND) {
m_ntx=1;
ui->txrb1->setChecked(true);
} else {
@ -5094,7 +5103,7 @@ void MainWindow::msgtype(QString t, QLineEdit* tx) //msgtype()
//### Check this stuff ###
if(itype==7 and m_config.enable_VHF_features() and m_mode=="JT65") shortMsg=true;
if(m_mode=="MSK144" and t.mid(0,1)=="<") text=false;
if((m_mode=="MSK144" or m_mode=="FT8") and m_config.bNA_VHF_Contest()) {
if((m_mode=="MSK144" or m_mode=="FT8") and m_nContest==NA_VHF) {
int i0=t.trimmed().length()-7;
if(t.mid(i0,3)==" R ") text=false;
}
@ -5252,11 +5261,12 @@ void MainWindow::on_logQSOButton_clicked() //Log QSO button
}
bool bAutoLog=m_config.autoLog() and m_nContest>0;
bool bFoxMode= FOX==m_nContest;
m_logDlg->initLogQSO (m_hisCall, grid, m_modeTx, m_rptSent, m_rptRcvd,
m_dateTimeQSOOn, dateTimeQSOOff, m_freqNominal +
ui->TxFreqSpinBox->value(), m_config.my_callsign(),
m_config.my_grid(), m_noSuffix, m_config.log_as_RTTY(),
m_config.report_in_comments(), m_config.bFox(),
m_config.report_in_comments(), bFoxMode,
bAutoLog, m_opCall, m_nContest, m_xSent, m_xRcvd);
}
@ -5320,7 +5330,7 @@ void MainWindow::acceptQSO (QDateTime const& QSO_date_off, QString const& call,
}
}
if (m_config.clear_DX () and !m_config.bHound ()) clearDX ();
if (m_config.clear_DX () and m_nContest!=HOUND) clearDX ();
m_dateTimeQSOOn = QDateTime {};
}
@ -5386,7 +5396,7 @@ void MainWindow::displayWidgets(qint64 n)
if(i==32) ui->cbCQonly->setVisible(b);
j=j>>1;
}
b=m_config.bEU_VHF_Contest() or (m_config.bRTTYroundup() and
b=m_nContest==EU_VHF or (m_nContest==RTTY and
(m_config.RTTYExchange()=="#" or m_config.RTTYExchange()=="DX"));
ui->sbSerialNumber->setVisible(b);
m_lastCallsign.clear (); // ensures Tx5 is updated for new modes
@ -5421,7 +5431,7 @@ void MainWindow::on_actionFT8_triggered()
m_modulator->setTRPeriod(m_TRperiod); // TODO - not thread safe
m_detector->setTRPeriod(m_TRperiod); // TODO - not thread safe
ui->label_7->setText("Rx Frequency");
if(m_config.bFox()) {
if(m_nContest==FOX) {
ui->label_6->setText("Stations calling DXpedition " + m_config.my_callsign());
ui->decodedTextLabel->setText( "Call Grid dB Freq Dist Age Continent");
} else {
@ -5439,7 +5449,7 @@ void MainWindow::on_actionFT8_triggered()
ui->txb6->setEnabled(true);
ui->txFirstCheckBox->setEnabled(true);
ui->cbAutoSeq->setEnabled(true);
if(m_config.bFox()) {
if(m_nContest==FOX) {
ui->txFirstCheckBox->setChecked(true);
ui->txFirstCheckBox->setEnabled(false);
ui->cbHoldTxFreq->setChecked(true);
@ -5450,7 +5460,7 @@ void MainWindow::on_actionFT8_triggered()
ui->labDXped->setText("Fox");
on_actionFox_Log_triggered();
}
if(m_config.bHound()) {
if(m_nContest != HOUND) {
ui->txFirstCheckBox->setChecked(false);
ui->txFirstCheckBox->setEnabled(false);
ui->cbAutoSeq->setEnabled(false);
@ -5469,13 +5479,12 @@ void MainWindow::on_actionFT8_triggered()
ui->txb6->setEnabled(false);
}
if(!m_config.bFox() and !m_config.bHound()) {
if(m_nContest<FOX) {
QString t0="";
t0=" Tx2.0 ";
if(m_config.bNA_VHF_Contest()) t0+="NA VHF";
if(m_config.bEU_VHF_Contest()) t0+="EU VHF";
if(m_config.bFieldDay()) t0+="Field Day";
if(m_config.bRTTYroundup()) t0+="RTTY";
if(m_nContest==NA_VHF) t0+="NA VHF";
if(m_nContest==EU_VHF) t0+="EU VHF";
if(m_nContest==FIELD_DAY) t0+="Field Day";
if(m_nContest==RTTY) t0+="RTTY";
if(t0=="") {
ui->labDXped->setVisible(false);
} else {
@ -5484,7 +5493,7 @@ void MainWindow::on_actionFT8_triggered()
}
}
if((m_config.bFox() or m_config.bHound()) and !m_config.split_mode() and !m_bWarnedSplit) {
if((m_nContest==FOX or m_nContest==HOUND) and !m_config.split_mode() and !m_bWarnedSplit) {
QString errorMsg;
MessageBox::critical_message (this,
"Operation in FT8 DXpedition mode normally requires\n"
@ -5746,7 +5755,20 @@ void MainWindow::on_actionISCAT_triggered()
void MainWindow::on_actionMSK144_triggered()
{
if(m_nContest>=3) {
if(m_nContest>EU_VHF) {
// We are rejecting the requested mode change, so re-check the old mode
if("FT8"==m_mode) ui->actionFT8->setChecked(true);
if("JT4"==m_mode) ui->actionJT4->setChecked(true);
if("JT9"==m_mode) ui->actionJT9->setChecked(true);
if("JT65"==m_mode) ui->actionJT65->setChecked(true);
if("JT9_JT65"==m_mode) ui->actionJT9_JT65->setChecked(true);
if("ISCAT"==m_mode) ui->actionISCAT->setChecked(true);
if("QRA64"==m_mode) ui->actionQRA64->setChecked(true);
if("WSPR"==m_mode) ui->actionWSPR->setChecked(true);
if("Echo"==m_mode) ui->actionEcho->setChecked(true);
if("FreqCal"==m_mode) ui->actionFreqCal->setChecked(true);
// Make sure that MSK144 is not checked.
ui->actionMSK144->setChecked(false);
MessageBox::warning_message (this, tr ("Improper mode"),
"MSK144 not available if Fox, Hound, Field Day, or RTTY contest is selected.");
return;
@ -5790,8 +5812,8 @@ void MainWindow::on_actionMSK144_triggered()
statusChanged();
QString t0="";
if(m_config.bNA_VHF_Contest()) t0+="NA VHF";
if(m_config.bEU_VHF_Contest()) t0+="EU VHF";
if(m_nContest==NA_VHF) t0+="NA VHF";
if(m_nContest==EU_VHF) t0+="EU VHF";
if(t0=="") {
ui->labDXped->setVisible(false);
} else {
@ -6628,7 +6650,7 @@ void MainWindow::transmit (double snr)
toneSpacing=12000.0/1920.0;
if(m_config.x2ToneSpacing()) toneSpacing=2*12000.0/1920.0;
if(m_config.x4ToneSpacing()) toneSpacing=4*12000.0/1920.0;
if(m_config.bFox() and !m_tune) toneSpacing=-1;
if(m_nContest==FOX and !m_tune) toneSpacing=-1;
Q_EMIT sendMessage (NUM_FT8_SYMBOLS,
1920.0, ui->TxFreqSpinBox->value () - m_XIT,
toneSpacing, m_soundOutput, m_config.audio_output_channel (),
@ -6874,7 +6896,7 @@ void::MainWindow::VHF_features_enabled(bool b)
ui->actionMessage_averaging->setEnabled(b);
ui->actionEnable_AP_DXcall->setVisible (m_mode=="QRA64");
ui->actionEnable_AP_JT65->setVisible (b && m_mode=="JT65");
if(!b && m_msgAvgWidget and !m_config.bFox() and !m_config.autoLog()) {
if(!b && m_msgAvgWidget and (m_nContest!=FOX) and !m_config.autoLog()) {
if(m_msgAvgWidget->isVisible()) m_msgAvgWidget->close();
}
}