Add facility to disallow CAT commands while transmitting.

Some rigs either do not honour some CAT commands while transmitting or
interpret them  incorrectly. To  deal with this  a settings  option to
allow TX  frequency changes while  transmitting has been added  with a
default value of off.

Any UI actions that directly or indirectly change the TX frequency are
guarded according to this new option. As well as this band changes and
use of  the +2kHz check box  are disabled and guarded  respectively in
transmit mode.

Mode changes via the menu are now disabled while transmitting.

When TX frequency changes are allowed; frequency changes are correctly
implemented while in tune mode.

Double clicking  decodes while  transmitting now  correctly regenerate
and change the message sent on the fly.

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@4349 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Bill Somerville 2014-09-24 17:25:19 +00:00
parent a4c04b6de6
commit 4a32b0bef6
11 changed files with 201 additions and 136 deletions

View File

@ -369,6 +369,7 @@ private:
QString my_grid_; QString my_grid_;
qint32 id_interval_; qint32 id_interval_;
bool id_after_73_; bool id_after_73_;
bool tx_QSY_allowed_;
bool spot_to_psk_reporter_; bool spot_to_psk_reporter_;
bool monitor_off_at_startup_; bool monitor_off_at_startup_;
bool log_as_RTTY_; bool log_as_RTTY_;
@ -425,6 +426,7 @@ QString Configuration::my_grid () const {return m_->my_grid_;}
QFont Configuration::decoded_text_font () const {return m_->decoded_text_font_;} QFont Configuration::decoded_text_font () const {return m_->decoded_text_font_;}
qint32 Configuration::id_interval () const {return m_->id_interval_;} qint32 Configuration::id_interval () const {return m_->id_interval_;}
bool Configuration::id_after_73 () const {return m_->id_after_73_;} bool Configuration::id_after_73 () const {return m_->id_after_73_;}
bool Configuration::tx_QSY_allowed () const {return m_->tx_QSY_allowed_ || !split_mode ();}
bool Configuration::spot_to_psk_reporter () const {return m_->spot_to_psk_reporter_;} bool Configuration::spot_to_psk_reporter () const {return m_->spot_to_psk_reporter_;}
bool Configuration::monitor_off_at_startup () const {return m_->monitor_off_at_startup_;} bool Configuration::monitor_off_at_startup () const {return m_->monitor_off_at_startup_;}
bool Configuration::log_as_RTTY () const {return m_->log_as_RTTY_;} bool Configuration::log_as_RTTY () const {return m_->log_as_RTTY_;}
@ -839,6 +841,7 @@ void Configuration::impl::initialise_models ()
ui_->PTT_method_button_group->button (rig_params_.PTT_method_)->setChecked (true); ui_->PTT_method_button_group->button (rig_params_.PTT_method_)->setChecked (true);
ui_->save_path_display_label->setText (save_directory_.absolutePath ()); ui_->save_path_display_label->setText (save_directory_.absolutePath ());
ui_->CW_id_after_73_check_box->setChecked (id_after_73_); ui_->CW_id_after_73_check_box->setChecked (id_after_73_);
ui_->tx_QSY_check_box->setChecked (tx_QSY_allowed_);
ui_->psk_reporter_check_box->setChecked (spot_to_psk_reporter_); ui_->psk_reporter_check_box->setChecked (spot_to_psk_reporter_);
ui_->monitor_off_check_box->setChecked (monitor_off_at_startup_); ui_->monitor_off_check_box->setChecked (monitor_off_at_startup_);
ui_->log_as_RTTY_check_box->setChecked (log_as_RTTY_); ui_->log_as_RTTY_check_box->setChecked (log_as_RTTY_);
@ -987,6 +990,7 @@ void Configuration::impl::read_settings ()
monitor_off_at_startup_ = settings_->value ("MonitorOFF", false).toBool (); monitor_off_at_startup_ = settings_->value ("MonitorOFF", false).toBool ();
spot_to_psk_reporter_ = settings_->value ("PSKReporter", false).toBool (); spot_to_psk_reporter_ = settings_->value ("PSKReporter", false).toBool ();
id_after_73_ = settings_->value ("After73", false).toBool (); id_after_73_ = settings_->value ("After73", false).toBool ();
tx_QSY_allowed_ = settings_->value ("TxQSYAllowed", false).toBool ();
macros_.setStringList (settings_->value ("Macros", QStringList {"TNX 73 GL"}).toStringList ()); macros_.setStringList (settings_->value ("Macros", QStringList {"TNX 73 GL"}).toStringList ());
@ -1067,6 +1071,7 @@ void Configuration::impl::write_settings ()
settings_->setValue ("MonitorOFF", monitor_off_at_startup_); settings_->setValue ("MonitorOFF", monitor_off_at_startup_);
settings_->setValue ("PSKReporter", spot_to_psk_reporter_); settings_->setValue ("PSKReporter", spot_to_psk_reporter_);
settings_->setValue ("After73", id_after_73_); settings_->setValue ("After73", id_after_73_);
settings_->setValue ("TxQSYAllowed", tx_QSY_allowed_);
settings_->setValue ("Macros", macros_.stringList ()); settings_->setValue ("Macros", macros_.stringList ());
settings_->setValue ("frequencies", QVariant::fromValue (frequencies_.frequencies ())); settings_->setValue ("frequencies", QVariant::fromValue (frequencies_.frequencies ()));
settings_->setValue ("stations", QVariant::fromValue (stations_.stations ())); settings_->setValue ("stations", QVariant::fromValue (stations_.stations ()));
@ -1404,6 +1409,7 @@ void Configuration::impl::accept ()
spot_to_psk_reporter_ = ui_->psk_reporter_check_box->isChecked (); spot_to_psk_reporter_ = ui_->psk_reporter_check_box->isChecked ();
id_interval_ = ui_->CW_id_interval_spin_box->value (); id_interval_ = ui_->CW_id_interval_spin_box->value ();
id_after_73_ = ui_->CW_id_after_73_check_box->isChecked (); id_after_73_ = ui_->CW_id_after_73_check_box->isChecked ();
tx_QSY_allowed_ = ui_->tx_QSY_check_box->isChecked ();
monitor_off_at_startup_ = ui_->monitor_off_check_box->isChecked (); monitor_off_at_startup_ = ui_->monitor_off_check_box->isChecked ();
jt9w_bw_mult_ = ui_->jt9w_bandwidth_mult_combo_box->currentText ().toUInt (); jt9w_bw_mult_ = ui_->jt9w_bandwidth_mult_combo_box->currentText ().toUInt ();
jt9w_min_dt_ = static_cast<float> (ui_->jt9w_min_dt_double_spin_box->value ()); jt9w_min_dt_ = static_cast<float> (ui_->jt9w_min_dt_double_spin_box->value ());

View File

@ -85,6 +85,7 @@ public:
QFont decoded_text_font () const; QFont decoded_text_font () const;
qint32 id_interval () const; qint32 id_interval () const;
bool id_after_73 () const; bool id_after_73 () const;
bool tx_QSY_allowed () const;
bool spot_to_psk_reporter () const; bool spot_to_psk_reporter () const;
bool monitor_off_at_startup () const; bool monitor_off_at_startup () const;
bool log_as_RTTY () const; bool log_as_RTTY () const;

View File

@ -214,6 +214,27 @@
<string>Behavior</string> <string>Behavior</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_8"> <layout class="QGridLayout" name="gridLayout_8">
<item row="2" column="0">
<widget class="QCheckBox" name="disable_TX_on_73_check_box">
<property name="toolTip">
<string>Turns off automatic transmissions after sending a 73 or any other free
text message.</string>
</property>
<property name="text">
<string>Di&amp;sable Tx after sending 73</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="watchdog_check_box">
<property name="toolTip">
<string>Stop transmitting automatically after five periods.</string>
</property>
<property name="text">
<string>Runaway Tx &amp;watchdog</string>
</property>
</widget>
</item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QCheckBox" name="monitor_off_check_box"> <widget class="QCheckBox" name="monitor_off_check_box">
<property name="toolTip"> <property name="toolTip">
@ -237,28 +258,17 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="0" column="1">
<widget class="QCheckBox" name="disable_TX_on_73_check_box"> <widget class="QCheckBox" name="tx_QSY_check_box">
<property name="toolTip"> <property name="toolTip">
<string>Turns off automatic transmissions after sending a 73 or any other free <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Some rigs are not able to process CAT commands while transmitting. This means that if you are operating in split mode you may have to uncheck this option.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
text message.</string>
</property> </property>
<property name="text"> <property name="text">
<string>Di&amp;sable Tx after sending 73</string> <string>Allow Tx Frequency Changes While Transmitting</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="4" column="0" colspan="2">
<widget class="QCheckBox" name="watchdog_check_box">
<property name="toolTip">
<string>Stop transmitting automatically after five periods.</string>
</property>
<property name="text">
<string>Runaway Tx &amp;watchdog</string>
</property>
</widget>
</item>
<item row="4" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_9"> <layout class="QHBoxLayout" name="horizontalLayout_9">
<item> <item>
<widget class="QCheckBox" name="CW_id_after_73_check_box"> <widget class="QCheckBox" name="CW_id_after_73_check_box">
@ -1825,11 +1835,11 @@ soundcard changes</string>
</connections> </connections>
<buttongroups> <buttongroups>
<buttongroup name="CAT_stop_bits_button_group"/> <buttongroup name="CAT_stop_bits_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="CAT_data_bits_button_group"/> <buttongroup name="CAT_data_bits_button_group"/>
<buttongroup name="CAT_handshake_button_group"/> <buttongroup name="CAT_handshake_button_group"/>
<buttongroup name="TX_mode_button_group"/>
<buttongroup name="TX_audio_source_button_group"/>
<buttongroup name="split_mode_button_group"/> <buttongroup name="split_mode_button_group"/>
<buttongroup name="PTT_method_button_group"/> <buttongroup name="PTT_method_button_group"/>
<buttongroup name="TX_mode_button_group"/>
</buttongroups> </buttongroups>
</ui> </ui>

View File

@ -58,7 +58,9 @@ void Modulator::start (unsigned symbolsLength, double framesPerSymbol, unsigned
m_quickClose = false; m_quickClose = false;
m_symbolsLength = symbolsLength; m_symbolsLength = symbolsLength;
m_isym0 = std::numeric_limits<unsigned>::max (); // Arbitrary big number m_isym0 = std::numeric_limits<unsigned>::max (); // Arbitrary big
// number
m_frequency0 = 0.;
m_addNoise = dBSNR < 0.; m_addNoise = dBSNR < 0.;
m_nsps = framesPerSymbol; m_nsps = framesPerSymbol;
m_frequency = frequency; m_frequency = frequency;
@ -223,7 +225,7 @@ qint64 Modulator::readData (char * data, qint64 maxSize)
for (unsigned i = 0; i < numFrames && m_ic <= i1; ++i) { for (unsigned i = 0; i < numFrames && m_ic <= i1; ++i) {
isym = m_tuning ? 0 : m_ic / (4.0 * m_nsps); //Actual fsample=48000 isym = m_tuning ? 0 : m_ic / (4.0 * m_nsps); //Actual fsample=48000
if (isym != m_isym0) { if (isym != m_isym0 || m_frequency != m_frequency0) {
// qDebug () << "@m_ic:" << m_ic << "itone[" << isym << "] =" << itone[isym] << "@" << i << "in numFrames:" << numFrames; // qDebug () << "@m_ic:" << m_ic << "itone[" << isym << "] =" << itone[isym] << "@" << i << "in numFrames:" << numFrames;
if(m_toneSpacing==0.0) { if(m_toneSpacing==0.0) {
@ -233,6 +235,7 @@ qint64 Modulator::readData (char * data, qint64 maxSize)
} }
m_dphi = m_twoPi * toneFrequency0 / m_frameRate; m_dphi = m_twoPi * toneFrequency0 / m_frameRate;
m_isym0 = isym; m_isym0 = isym;
m_frequency0 = m_frequency;
} }
int j=m_ic/480; int j=m_ic/480;

View File

@ -60,6 +60,7 @@ private:
double m_amp; double m_amp;
double m_nsps; double m_nsps;
double volatile m_frequency; double volatile m_frequency;
double m_frequency0;
double m_snr; double m_snr;
double m_fac; double m_fac;
double m_toneSpacing; double m_toneSpacing;

View File

@ -285,8 +285,6 @@ MainWindow::MainWindow(bool multiple, QSettings * settings, QSharedMemory *shdme
m_killAll=false; m_killAll=false;
m_widebandDecode=false; m_widebandDecode=false;
m_ntx=1; m_ntx=1;
m_rxFreq=1500;
m_txFreq=1500;
m_setftx=0; m_setftx=0;
m_loopall=false; m_loopall=false;
m_startAnother=false; m_startAnother=false;
@ -373,8 +371,6 @@ MainWindow::MainWindow(bool multiple, QSettings * settings, QSharedMemory *shdme
if(m_mode!="JT9" and m_mode!="JT9W-1" and m_mode!="JT65" and if(m_mode!="JT9" and m_mode!="JT9W-1" and m_mode!="JT65" and
m_mode!="JT9+JT65") m_mode="JT9"; m_mode!="JT9+JT65") m_mode="JT9";
on_actionWide_Waterfall_triggered(); //### on_actionWide_Waterfall_triggered(); //###
m_wideGraph->setRxFreq(m_rxFreq);
m_wideGraph->setTxFreq(m_txFreq);
m_wideGraph->setLockTxFreq(m_lockTxFreq); m_wideGraph->setLockTxFreq(m_lockTxFreq);
m_wideGraph->setModeTx(m_mode); m_wideGraph->setModeTx(m_mode);
m_wideGraph->setModeTx(m_modeTx); m_wideGraph->setModeTx(m_modeTx);
@ -398,7 +394,7 @@ MainWindow::MainWindow(bool multiple, QSettings * settings, QSharedMemory *shdme
Q_EMIT startAudioInputStream (m_config.audio_input_device (), m_framesAudioInputBuffered, &m_detector, m_downSampleFactor, m_config.audio_input_channel ()); Q_EMIT startAudioInputStream (m_config.audio_input_device (), m_framesAudioInputBuffered, &m_detector, m_downSampleFactor, m_config.audio_input_channel ());
Q_EMIT initializeAudioOutputStream (m_config.audio_output_device (), AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2, m_msAudioOutputBuffered); Q_EMIT initializeAudioOutputStream (m_config.audio_output_device (), AudioDevice::Mono == m_config.audio_output_channel () ? 1 : 2, m_msAudioOutputBuffered);
Q_EMIT transmitFrequency (m_txFreq - m_XIT); Q_EMIT transmitFrequency (ui->TxFreqSpinBox->value () - m_XIT);
auto t = "UTC dB DT Freq Message"; auto t = "UTC dB DT Freq Message";
ui->decodedTextLabel->setText(t); ui->decodedTextLabel->setText(t);
@ -447,8 +443,8 @@ void MainWindow::writeSettings()
m_settings->setValue("SaveDecoded",ui->actionSave_decoded->isChecked()); m_settings->setValue("SaveDecoded",ui->actionSave_decoded->isChecked());
m_settings->setValue("SaveAll",ui->actionSave_all->isChecked()); m_settings->setValue("SaveAll",ui->actionSave_all->isChecked());
m_settings->setValue("NDepth",m_ndepth); m_settings->setValue("NDepth",m_ndepth);
m_settings->setValue("RxFreq",m_rxFreq); m_settings->setValue("RxFreq",ui->RxFreqSpinBox->value ());
m_settings->setValue("TxFreq",m_txFreq); m_settings->setValue("TxFreq",ui->TxFreqSpinBox->value ());
m_settings->setValue ("DialFreq", QVariant::fromValue(m_lastMonitoredFrequency)); m_settings->setValue ("DialFreq", QVariant::fromValue(m_lastMonitoredFrequency));
m_settings->setValue("InGain",m_inGain); m_settings->setValue("InGain",m_inGain);
m_settings->setValue("OutAttenuation", ui->outAttenuation->value ()); m_settings->setValue("OutAttenuation", ui->outAttenuation->value ());
@ -500,12 +496,10 @@ void MainWindow::readSettings()
ui->actionSave_decoded->setChecked(m_settings->value( ui->actionSave_decoded->setChecked(m_settings->value(
"SaveDecoded",false).toBool()); "SaveDecoded",false).toBool());
ui->actionSave_all->setChecked(m_settings->value("SaveAll",false).toBool()); ui->actionSave_all->setChecked(m_settings->value("SaveAll",false).toBool());
m_rxFreq=m_settings->value("RxFreq",1500).toInt(); ui->RxFreqSpinBox->setValue(m_settings->value("RxFreq",1500).toInt());
ui->RxFreqSpinBox->setValue(m_rxFreq);
m_txFreq=m_settings->value("TxFreq",1500).toInt();
m_lastMonitoredFrequency = m_settings->value ("DialFreq", QVariant::fromValue<Frequency> (default_frequency)).value<Frequency> (); m_lastMonitoredFrequency = m_settings->value ("DialFreq", QVariant::fromValue<Frequency> (default_frequency)).value<Frequency> ();
ui->TxFreqSpinBox->setValue(m_txFreq); ui->TxFreqSpinBox->setValue(m_settings->value("TxFreq",1500).toInt());
Q_EMIT transmitFrequency (m_txFreq - m_XIT); Q_EMIT transmitFrequency (ui->TxFreqSpinBox->value () - m_XIT);
m_saveDecoded=ui->actionSave_decoded->isChecked(); m_saveDecoded=ui->actionSave_decoded->isChecked();
m_saveAll=ui->actionSave_all->isChecked(); m_saveAll=ui->actionSave_all->isChecked();
m_ndepth=m_settings->value("NDepth",3).toInt(); m_ndepth=m_settings->value("NDepth",3).toInt();
@ -644,7 +638,7 @@ void MainWindow::on_actionSettings_triggered() //Setup Dialog
displayDialFrequency (); displayDialFrequency ();
} }
setXIT (m_txFreq); setXIT (ui->TxFreqSpinBox->value ());
if (m_config.transceiver_online ()) if (m_config.transceiver_online ())
{ {
Q_EMIT m_config.transceiver_frequency (m_dialFreq); Q_EMIT m_config.transceiver_frequency (m_dialFreq);
@ -664,7 +658,7 @@ void MainWindow::on_monitorButton_clicked (bool checked)
// put rig back where it was when last in control // put rig back where it was when last in control
Q_EMIT m_config.transceiver_frequency (m_lastMonitoredFrequency); Q_EMIT m_config.transceiver_frequency (m_lastMonitoredFrequency);
setXIT (m_txFreq); setXIT (ui->TxFreqSpinBox->value ());
} }
Q_EMIT m_config.sync_transceiver (true, checked); // gets Q_EMIT m_config.sync_transceiver (true, checked); // gets
@ -828,14 +822,17 @@ void MainWindow::bumpFqso(int n) //bumpFqso()
int i; int i;
bool ctrl = (n>=100); bool ctrl = (n>=100);
n=n%100; n=n%100;
i=m_wideGraph->rxFreq(); i=ui->RxFreqSpinBox->value ();
if(n==11) i--; if(n==11) i--;
if(n==12) i++; if(n==12) i++;
m_wideGraph->setRxFreq(i); if (ui->RxFreqSpinBox->isEnabled ())
if(ctrl) { {
ui->TxFreqSpinBox->setValue(i); ui->RxFreqSpinBox->setValue (i);
m_wideGraph->setTxFreq(i); }
} if(ctrl && ui->TxFreqSpinBox->isEnabled ())
{
ui->TxFreqSpinBox->setValue (i);
}
} }
void MainWindow::qsy (Frequency f) void MainWindow::qsy (Frequency f)
@ -848,14 +845,11 @@ void MainWindow::qsy (Frequency f)
if (m_dialFreq != f) if (m_dialFreq != f)
{ {
m_dialFreq = f; m_dialFreq = f;
setXIT(m_txFreq); setXIT(ui->TxFreqSpinBox->value ());
m_repeatMsg=0; m_repeatMsg=0;
m_secBandChanged=QDateTime::currentMSecsSinceEpoch()/1000; m_secBandChanged=QDateTime::currentMSecsSinceEpoch()/1000;
bumpFqso(11);
bumpFqso(12);
QFile f2(m_config.data_path ().absoluteFilePath ("ALL.TXT")); QFile f2(m_config.data_path ().absoluteFilePath ("ALL.TXT"));
f2.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append); f2.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append);
QTextStream out(&f2); QTextStream out(&f2);
@ -1198,12 +1192,6 @@ void MainWindow::on_DecodeButton_clicked (bool /* checked */) //Decode request
void MainWindow::freezeDecode(int n) //freezeDecode() void MainWindow::freezeDecode(int n) //freezeDecode()
{ {
bool ctrl = (n>=100);
int i=m_wideGraph->rxFreq();
if(ctrl) {
ui->TxFreqSpinBox->setValue(i);
m_wideGraph->setTxFreq(i);
}
if((n%100)==2) on_DecodeButton_clicked (true); if((n%100)==2) on_DecodeButton_clicked (true);
} }
@ -1426,7 +1414,7 @@ void MainWindow::guiUpdate()
bTxTime=true; bTxTime=true;
} }
Frequency onAirFreq = m_dialFreq + m_txFreq; Frequency onAirFreq = m_dialFreq + ui->TxFreqSpinBox->value ();
if (onAirFreq > 10139900 && onAirFreq < 10140320) if (onAirFreq > 10139900 && onAirFreq < 10140320)
{ {
bTxTime=false; bTxTime=false;
@ -1506,7 +1494,7 @@ void MainWindow::guiUpdate()
f.close(); f.close();
if (m_config.TX_messages ()) if (m_config.TX_messages ())
{ {
ui->decodedTextBrowser2->displayTransmittedText(t,m_modeTx,m_txFreq); ui->decodedTextBrowser2->displayTransmittedText(t,m_modeTx,ui->TxFreqSpinBox->value ());
} }
} }
@ -1553,36 +1541,48 @@ void MainWindow::guiUpdate()
if (g_iptt == 1 && iptt0 == 0) if (g_iptt == 1 && iptt0 == 0)
{ {
QString t=QString::fromLatin1(msgsent); QString t=QString::fromLatin1(msgsent);
if(t==m_msgSent0) { if(t==m_msgSent0)
m_repeatMsg++;
} else {
m_repeatMsg=0;
m_msgSent0=t;
}
signalMeter->setValue(0);
if (m_monitoring)
{ {
monitor (false); m_repeatMsg++;
}
else
{
m_repeatMsg=0;
m_msgSent0=t;
if(!m_tune)
{
QFile f(m_config.data_path ().absoluteFilePath ("ALL.TXT"));
f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append);
QTextStream out(&f);
out << QDateTime::currentDateTimeUtc().toString("hhmm")
<< " Transmitting " << (m_dialFreq / 1.e6) << " MHz " << m_modeTx
<< ": " << t << endl;
f.close();
}
if (m_config.TX_messages () && !m_tune)
{
ui->decodedTextBrowser2->displayTransmittedText(t,m_modeTx,ui->TxFreqSpinBox->value ());
}
}
if(!m_tune)
{
QFile f(m_config.data_path ().absoluteFilePath ("ALL.TXT"));
f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append);
QTextStream out(&f);
out << QDateTime::currentDateTimeUtc().toString("hhmm")
<< " Transmitting " << (m_dialFreq / 1.e6) << " MHz " << m_modeTx
<< ": " << t << endl;
f.close();
} }
m_btxok=true;
m_transmitting=true;
ui->pbTxMode->setEnabled(false);
if(!m_tune) {
QFile f(m_config.data_path ().absoluteFilePath ("ALL.TXT"));
f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append);
QTextStream out(&f);
out << QDateTime::currentDateTimeUtc().toString("hhmm")
<< " Transmitting " << (m_dialFreq / 1.e6) << " MHz " << m_modeTx
<< ": " << t << endl;
f.close();
}
if (m_config.TX_messages () && !m_tune) if (m_config.TX_messages () && !m_tune)
{ {
ui->decodedTextBrowser2->displayTransmittedText(t,m_modeTx,m_txFreq); ui->decodedTextBrowser2->displayTransmittedText(t,m_modeTx,ui->TxFreqSpinBox->value ());
} }
m_transmitting = true;
transmitDisplay (true);
} }
if(!m_btxok && btxok0 && g_iptt==1) stopTx(); if(!m_btxok && btxok0 && g_iptt==1) stopTx();
@ -1604,7 +1604,7 @@ void MainWindow::guiUpdate()
QDateTime t = QDateTime::currentDateTimeUtc(); QDateTime t = QDateTime::currentDateTimeUtc();
int fQSO=125; int fQSO=125;
if(m_astroWidget) m_astroWidget->astroUpdate(t, m_config.my_grid (), m_hisGrid, fQSO, if(m_astroWidget) m_astroWidget->astroUpdate(t, m_config.my_grid (), m_hisGrid, fQSO,
m_setftx, m_txFreq); m_setftx, ui->TxFreqSpinBox->value ());
if(m_transmitting) { if(m_transmitting) {
if(nsendingsh==1) { if(nsendingsh==1) {
@ -1658,21 +1658,14 @@ void MainWindow::startTx2()
if(snr>0.0 or snr < -50.0) snr=99.0; if(snr>0.0 or snr < -50.0) snr=99.0;
transmit (snr); transmit (snr);
signalMeter->setValue(0); signalMeter->setValue(0);
//monitor (false);
//m_btxok=true;
//m_transmitting=true;
ui->pbTxMode->setEnabled(false);
} }
} }
void MainWindow::stopTx() void MainWindow::stopTx()
{ {
Q_EMIT endTransmitMessage (); Q_EMIT endTransmitMessage ();
m_transmitting=false;
m_btxok = false; m_btxok = false;
if ("JT9+JT65" == m_mode) ui->pbTxMode->setEnabled(true); m_transmitting = false;
g_iptt=0; g_iptt=0;
tx_status_label->setStyleSheet(""); tx_status_label->setStyleSheet("");
tx_status_label->setText(""); tx_status_label->setText("");
@ -1819,18 +1812,23 @@ void MainWindow::doubleClickOnCall(bool shift, bool ctrl)
int frequency = decodedtext.frequencyOffset(); int frequency = decodedtext.frequencyOffset();
m_wideGraph->setRxFreq(frequency); //Set Rx freq if (ui->RxFreqSpinBox->isEnabled ())
{
ui->RxFreqSpinBox->setValue (frequency); //Set Rx freq
}
if (decodedtext.isTX()) if (decodedtext.isTX())
{ {
if (ctrl) if (ctrl && ui->TxFreqSpinBox->isEnabled ())
ui->TxFreqSpinBox->setValue(frequency); //Set Tx freq {
ui->TxFreqSpinBox->setValue(frequency); //Set Tx freq
}
return; return;
} }
QString firstcall = decodedtext.call(); QString firstcall = decodedtext.call();
// Don't change Tx freq if a station is calling me, unless m_lockTxFreq // Don't change Tx freq if a station is calling me, unless m_lockTxFreq
// is true or CTRL is held down // is true or CTRL is held down
if ((firstcall!=m_config.my_callsign ()) or m_lockTxFreq or ctrl) if (((firstcall!=m_config.my_callsign ()) or m_lockTxFreq or ctrl) and ui->TxFreqSpinBox->isEnabled ())
ui->TxFreqSpinBox->setValue(frequency); ui->TxFreqSpinBox->setValue(frequency);
if (decodedtext.isJT9()) if (decodedtext.isJT9())
@ -1929,6 +1927,7 @@ void MainWindow::doubleClickOnCall(bool shift, bool ctrl)
ui->rbGenMsg->setChecked(true); ui->rbGenMsg->setChecked(true);
} }
} }
if(m_transmitting) m_restart=true;
if(m_config.quick_call ()) if(m_config.quick_call ())
{ {
auto_tx_mode (true); auto_tx_mode (true);
@ -2288,7 +2287,7 @@ void MainWindow::on_logQSOButton_clicked() //Log QSO button
, m_rptSent , m_rptSent
, m_rptRcvd , m_rptRcvd
, m_dateTimeQSO , m_dateTimeQSO
, (m_dialFreq + m_txFreq) / 1.e6 , (m_dialFreq + ui->TxFreqSpinBox->value ()) / 1.e6
, m_config.my_callsign () , m_config.my_callsign ()
, m_config.my_grid () , m_config.my_grid ()
, m_noSuffix , m_noSuffix
@ -2301,7 +2300,7 @@ void MainWindow::acceptQSO2(bool accepted)
{ {
if(accepted) if(accepted)
{ {
QString band = ADIF::bandFromFrequency ((m_dialFreq + m_txFreq) / 1.e6); QString band = ADIF::bandFromFrequency ((m_dialFreq + ui->TxFreqSpinBox->value ()) / 1.e6);
QString date = m_dateTimeQSO.toString("yyyy-MM-dd"); QString date = m_dateTimeQSO.toString("yyyy-MM-dd");
date=date.mid(0,4) + date.mid(5,2) + date.mid(8,2); date=date.mid(0,4) + date.mid(5,2) + date.mid(8,2);
m_logBook.addAsWorked(m_hisCall,band,m_modeTx,date); m_logBook.addAsWorked(m_hisCall,band,m_modeTx,date);
@ -2394,17 +2393,19 @@ void MainWindow::on_actionJT9_JT65_triggered()
void MainWindow::on_TxFreqSpinBox_valueChanged(int n) void MainWindow::on_TxFreqSpinBox_valueChanged(int n)
{ {
m_txFreq=n;
m_wideGraph->setTxFreq(n); m_wideGraph->setTxFreq(n);
if(m_lockTxFreq) ui->RxFreqSpinBox->setValue(n); if(m_lockTxFreq) ui->RxFreqSpinBox->setValue(n);
Q_EMIT transmitFrequency (m_txFreq - m_XIT); Q_EMIT transmitFrequency (n - m_XIT);
} }
void MainWindow::on_RxFreqSpinBox_valueChanged(int n) void MainWindow::on_RxFreqSpinBox_valueChanged(int n)
{ {
m_rxFreq=n;
m_wideGraph->setRxFreq(n); m_wideGraph->setRxFreq(n);
if(m_lockTxFreq) ui->TxFreqSpinBox->setValue(n);
if (m_lockTxFreq && ui->TxFreqSpinBox->isEnabled ())
{
ui->TxFreqSpinBox->setValue (n);
}
} }
void MainWindow::on_actionQuickDecode_triggered() void MainWindow::on_actionQuickDecode_triggered()
@ -2662,7 +2663,6 @@ void MainWindow::on_stopTxButton_clicked() //Stop Tx
auto_tx_mode (false); auto_tx_mode (false);
} }
m_transmitting = false;
m_btxok=false; m_btxok=false;
m_repeatMsg=0; m_repeatMsg=0;
} }
@ -2679,13 +2679,18 @@ void MainWindow::rigOpen ()
void MainWindow::on_pbR2T_clicked() void MainWindow::on_pbR2T_clicked()
{ {
int n=m_wideGraph->rxFreq(); if (ui->TxFreqSpinBox->isEnabled ())
ui->TxFreqSpinBox->setValue(n); {
ui->TxFreqSpinBox->setValue(ui->RxFreqSpinBox->value ());
}
} }
void MainWindow::on_pbT2R_clicked() void MainWindow::on_pbT2R_clicked()
{ {
m_wideGraph->setRxFreq(m_txFreq); if (ui->RxFreqSpinBox->isEnabled ())
{
ui->RxFreqSpinBox->setValue (ui->TxFreqSpinBox->value ());
}
} }
@ -2731,15 +2736,20 @@ void MainWindow::setXIT(int n)
} }
} }
Q_EMIT transmitFrequency (m_txFreq - m_XIT); Q_EMIT transmitFrequency (ui->TxFreqSpinBox->value () - m_XIT);
} }
void MainWindow::setFreq4(int rxFreq, int txFreq) void MainWindow::setFreq4(int rxFreq, int txFreq)
{ {
m_rxFreq=rxFreq; if (ui->RxFreqSpinBox->isEnabled ())
m_txFreq=txFreq; {
ui->RxFreqSpinBox->setValue(m_rxFreq); ui->RxFreqSpinBox->setValue(rxFreq);
ui->TxFreqSpinBox->setValue(m_txFreq); }
if (ui->TxFreqSpinBox->isEnabled ())
{
ui->TxFreqSpinBox->setValue(txFreq);
}
} }
void MainWindow::on_cbTxLock_clicked(bool checked) void MainWindow::on_cbTxLock_clicked(bool checked)
@ -2773,6 +2783,14 @@ void MainWindow::on_cbPlus2kHz_toggled(bool checked)
void MainWindow::handle_transceiver_update (Transceiver::TransceiverState s) void MainWindow::handle_transceiver_update (Transceiver::TransceiverState s)
{ {
static bool prior_ptt {false};
if (!s.ptt () && prior_ptt)
{
transmitDisplay (false);
}
prior_ptt = s.ptt ();
if ((s.frequency () - m_dialFreq) || s.split () != m_splitMode) if ((s.frequency () - m_dialFreq) || s.split () != m_splitMode)
{ {
m_splitMode = s.split (); m_splitMode = s.split ();
@ -2821,11 +2839,11 @@ void MainWindow::transmit (double snr)
{ {
if (m_modeTx == "JT65") if (m_modeTx == "JT65")
{ {
Q_EMIT sendMessage (NUM_JT65_SYMBOLS, 4096.0 * 12000.0 / 11025.0, m_txFreq - m_XIT, m_toneSpacing, &m_soundOutput, m_config.audio_output_channel (), true, snr); Q_EMIT sendMessage (NUM_JT65_SYMBOLS, 4096.0 * 12000.0 / 11025.0, ui->TxFreqSpinBox->value () - m_XIT, m_toneSpacing, &m_soundOutput, m_config.audio_output_channel (), true, snr);
} }
else else
{ {
Q_EMIT sendMessage (NUM_JT9_SYMBOLS, m_nsps, m_txFreq - m_XIT, m_toneSpacing, &m_soundOutput, m_config.audio_output_channel (), true, snr); Q_EMIT sendMessage (NUM_JT9_SYMBOLS, m_nsps, ui->TxFreqSpinBox->value () - m_XIT, m_toneSpacing, &m_soundOutput, m_config.audio_output_channel (), true, snr);
} }
} }
@ -2951,3 +2969,45 @@ void MainWindow::pskSetLocal ()
, m_config.my_grid () , m_config.my_grid ()
, antenna_description, "WSJT-X " + m_revision); , antenna_description, "WSJT-X " + m_revision);
} }
void MainWindow::transmitDisplay (bool transmitting)
{
if (transmitting)
{
signalMeter->setValue(0);
if (m_monitoring)
{
monitor (false);
}
m_btxok=true;
}
auto QSY_allowed = !transmitting || m_config.tx_QSY_allowed ();
if (ui->cbTxLock->isChecked ())
{
ui->RxFreqSpinBox->setEnabled (QSY_allowed);
ui->pbT2R->setEnabled (QSY_allowed);
}
ui->TxFreqSpinBox->setEnabled (QSY_allowed);
ui->pbR2T->setEnabled (QSY_allowed);
ui->cbTxLock->setEnabled (QSY_allowed);
ui->cbPlus2kHz->setEnabled (QSY_allowed);
// the following are always disallowed in transmit
ui->menuMode->setEnabled (!transmitting);
ui->bandComboBox->setEnabled (!transmitting);
if (!transmitting)
{
if ("JT9+JT65" == m_mode)
{
// allow mode switch in Rx when in dual mode
ui->pbTxMode->setEnabled (true);
}
}
else
{
ui->pbTxMode->setEnabled (false);
}
}

View File

@ -220,8 +220,6 @@ private:
qint32 m_waterfallAvg; qint32 m_waterfallAvg;
qint32 m_ntx; qint32 m_ntx;
qint32 m_timeout; qint32 m_timeout;
qint32 m_rxFreq;
qint32 m_txFreq;
int m_XIT; int m_XIT;
qint32 m_setftx; qint32 m_setftx;
qint32 m_ndepth; qint32 m_ndepth;
@ -389,6 +387,7 @@ private:
void rigFailure (QString const& reason, QString const& detail); void rigFailure (QString const& reason, QString const& detail);
void pskSetLocal (); void pskSetLocal ();
void displayDialFrequency (); void displayDialFrequency ();
void transmitDisplay (bool);
}; };
extern void getfile(QString fname, int ntrperiod); extern void getfile(QString fname, int ntrperiod);

View File

@ -399,18 +399,9 @@ int CPlotter::binsPerPixel() // get nbpp
return m_binsPerPixel; return m_binsPerPixel;
} }
void CPlotter::setRxFreq(int x, bool bf) //setRxFreq() void CPlotter::setRxFreq (int x)
{ {
if(bf) { m_rxFreq = x; // x is freq in Hz
m_rxFreq=x; // x is freq in Hz
m_xClick=XfromFreq(m_rxFreq);
} else {
if(x<0) x=0; // x is pixel number
if(x>m_Size.width()) x=m_Size.width();
m_rxFreq=int(FreqfromX(x)+0.5);
m_xClick=x;
}
emit setFreq1(m_rxFreq,m_txFreq);
DrawOverlay(); DrawOverlay();
update(); update();
} }
@ -420,18 +411,22 @@ int CPlotter::rxFreq() {return m_rxFreq;} //get rxFreq
void CPlotter::mousePressEvent(QMouseEvent *event) //mousePressEvent void CPlotter::mousePressEvent(QMouseEvent *event) //mousePressEvent
{ {
int x=event->x(); int x=event->x();
setRxFreq(x,false); // Wideband waterfall if(x<0) x=0;
if(x>m_Size.width()) x=m_Size.width();
bool ctrl = (event->modifiers() & Qt::ControlModifier); bool ctrl = (event->modifiers() & Qt::ControlModifier);
int freq = int(FreqfromX(x)+0.5);
int tx_freq = m_txFreq;
if (ctrl or m_lockTxFreq) tx_freq = freq;
emit setFreq1 (freq, tx_freq);
int n=1; int n=1;
if(ctrl) n+=100; if(ctrl) n+=100;
emit freezeDecode1(n); emit freezeDecode1(n);
if(ctrl or m_lockTxFreq) setTxFreq(m_rxFreq);
} }
void CPlotter::mouseDoubleClickEvent(QMouseEvent *event) //mouse2click void CPlotter::mouseDoubleClickEvent(QMouseEvent *event) //mouse2click
{ {
// int x=event->x();
// setRxFreq(x,false);
bool ctrl = (event->modifiers() & Qt::ControlModifier); bool ctrl = (event->modifiers() & Qt::ControlModifier);
int n=2; int n=2;
if(ctrl) n+=100; if(ctrl) n+=100;
@ -464,7 +459,6 @@ void CPlotter::setNsps(int ntrperiod, int nsps)
void CPlotter::setTxFreq(int n) //setTol() void CPlotter::setTxFreq(int n) //setTol()
{ {
m_txFreq=n; m_txFreq=n;
emit setFreq1(m_rxFreq,m_txFreq);
DrawOverlay(); DrawOverlay();
update(); update();
} }

View File

@ -48,7 +48,7 @@ public:
void setRxRange(int fMin); void setRxRange(int fMin);
void setBinsPerPixel(int n); void setBinsPerPixel(int n);
int binsPerPixel(); int binsPerPixel();
void setRxFreq(int n, bool bf); void setRxFreq(int n);
void DrawOverlay(); void DrawOverlay();
int rxFreq(); int rxFreq();
void setFsample(int n); void setFsample(int n);

View File

@ -214,9 +214,8 @@ void WideGraph::keyPressEvent(QKeyEvent *e)
void WideGraph::setRxFreq(int n) void WideGraph::setRxFreq(int n)
{ {
m_rxFreq=n; ui->widePlot->setRxFreq(n);
ui->widePlot->setRxFreq(m_rxFreq,true); if(m_lockTxFreq) setTxFreq(n);
if(m_lockTxFreq) setTxFreq(m_rxFreq);
} }
int WideGraph::rxFreq() int WideGraph::rxFreq()
@ -322,14 +321,11 @@ void WideGraph::setLockTxFreq(bool b)
void WideGraph::setFreq2(int rxFreq, int txFreq) void WideGraph::setFreq2(int rxFreq, int txFreq)
{ {
m_rxFreq=rxFreq;
m_txFreq=txFreq;
emit setFreq3(rxFreq,txFreq); emit setFreq3(rxFreq,txFreq);
} }
void WideGraph::setDialFreq(double d) void WideGraph::setDialFreq(double d)
{ {
m_dialFreq=d;
ui->widePlot->setDialFreq(d); ui->widePlot->setDialFreq(d);
} }

View File

@ -77,11 +77,6 @@ private:
QDir m_palettes_path; QDir m_palettes_path;
WFPalette m_userPalette; WFPalette m_userPalette;
qint32 m_rxFreq;
qint32 m_txFreq;
double m_dialFreq;
qint32 m_waterfallAvg; qint32 m_waterfallAvg;
qint32 m_fSample; qint32 m_fSample;
qint32 m_TRperiod; qint32 m_TRperiod;