diff --git a/Configuration.cpp b/Configuration.cpp index 4be3f414d..22a66d268 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -548,6 +548,8 @@ private: bool udpWindowToFront_; bool udpWindowRestore_; DataMode data_mode_; + bool pwrBandTxMemory_; + bool pwrBandTuneMemory_; QAudioDeviceInfo audio_input_device_; bool default_audio_input_device_selected_; @@ -646,6 +648,8 @@ QStringListModel const * Configuration::macros () const {return &m_->macros_;} QDir Configuration::save_directory () const {return m_->save_directory_;} QDir Configuration::azel_directory () const {return m_->azel_directory_;} QString Configuration::rig_name () const {return m_->rig_params_.rig_name;} +bool Configuration::pwrBandTxMemory () const {return m_->pwrBandTxMemory_;} +bool Configuration::pwrBandTuneMemory () const {return m_->pwrBandTuneMemory_;} bool Configuration::is_transceiver_online () const { @@ -1066,6 +1070,8 @@ void Configuration::impl::initialize_models () ui_->CAT_data_bits_button_group->button (rig_params_.data_bits)->setChecked (true); ui_->CAT_stop_bits_button_group->button (rig_params_.stop_bits)->setChecked (true); ui_->CAT_handshake_button_group->button (rig_params_.handshake)->setChecked (true); + ui_->checkBoxPwrBandTxMemory->setChecked(pwrBandTxMemory_); + ui_->checkBoxPwrBandTuneMemory->setChecked(pwrBandTuneMemory_); if (rig_params_.force_dtr) { ui_->force_DTR_combo_box->setCurrentIndex (rig_params_.dtr_high ? 1 : 2); @@ -1293,6 +1299,8 @@ void Configuration::impl::read_settings () udpWindowRestore_ = settings_->value ("udpWindowRestore",false).toBool (); frequency_calibration_intercept_ = settings_->value ("CalibrationIntercept", 0.).toDouble (); frequency_calibration_slope_ppm_ = settings_->value ("CalibrationSlopePPM", 0.).toDouble (); + pwrBandTxMemory_ = settings_->value("pwrBandTxMemory",false).toBool (); + pwrBandTuneMemory_ = settings_->value("pwrBandTuneMemory",false).toBool (); } void Configuration::impl::write_settings () @@ -1389,6 +1397,8 @@ void Configuration::impl::write_settings () settings_->setValue ("udpWindowRestore", udpWindowRestore_); settings_->setValue ("CalibrationIntercept", frequency_calibration_intercept_); settings_->setValue ("CalibrationSlopePPM", frequency_calibration_slope_ppm_); + settings_->setValue ("pwrBandTxMemory", pwrBandTxMemory_); + settings_->setValue ("pwrBandTuneMemory", pwrBandTuneMemory_); } void Configuration::impl::set_rig_invariants () @@ -1778,7 +1788,8 @@ void Configuration::impl::accept () offsetRxFreq_ = ui_->offset_Rx_freq_check_box->isChecked(); frequency_calibration_intercept_ = ui_->calibration_intercept_spin_box->value (); frequency_calibration_slope_ppm_ = ui_->calibration_slope_ppm_spin_box->value (); - + pwrBandTxMemory_ = ui_->checkBoxPwrBandTxMemory->isChecked (); + pwrBandTuneMemory_ = ui_->checkBoxPwrBandTuneMemory->isChecked (); auto new_server = ui_->udp_server_line_edit->text (); if (new_server != udp_server_name_) { diff --git a/Configuration.hpp b/Configuration.hpp index 2b102fb6c..0e2fc1878 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -153,7 +153,8 @@ public: QColor color_TxMsg () const; QColor color_DXCC () const; QColor color_NewCall () const; - + bool pwrBandTxMemory () const; + bool pwrBandTuneMemory () const; // This method queries if a CAT and PTT connection is operational. bool is_transceiver_online () const; diff --git a/Configuration.ui b/Configuration.ui index 0c555aef3..e92688a1f 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -6,7 +6,7 @@ 0 0 - 545 + 628 591 @@ -14,8 +14,29 @@ Settings + + + + Discard or apply configuration changes including +resetting the radio interface and applying any +soundcard changes + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 0 + 0 + + Select tab to change configuration parameters. @@ -1231,237 +1252,297 @@ radio interface behave as expected. Audio interface settings - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Horizontal - - - - - - - Save Directory - - - - - - Loc&ation: - - - save_path_select_push_button - - - - - - - - 1 - 0 - - - - Path to which .WAV files are saved. - - - false - - - background-color: rgb(255, 255, 255); - - - TextLabel - - - - - - - Click to select a different save directory for .WAV files. - - - S&elect - - - - - - - - - - Soundcard - - - - - - - 1 - 0 - - - - Select the audio CODEC to use for transmitting. + + + + 9 + 10 + 511 + 431 + + + + + + + Souncard + + + Soundcard + + + + + + + 1 + 0 + + + + Select the audio CODEC to use for transmitting. If this is your default device for system sounds then ensure that all system sounds are disabled otherwise you will broadcast any systems sounds generated during transmitting periods. - - - - - - - - 1 - 0 - - - - Select the audio CODEC to use for receiving. - - - - - - - &Input: - - - sound_input_combo_box - - - - - - - Select the channel to use for receiving. - - - - Mono - - - - Left + + + + + + + 1 + 0 + - - - - Right + + Select the audio CODEC to use for receiving. - - + + + + - Both + &Input: - - - - - - - Select the audio channel used for transmission. + + sound_input_combo_box + + + + + + + Select the channel to use for receiving. + + + + Mono + + + + + Left + + + + + Right + + + + + Both + + + + + + + + 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. - - - - Mono - - + + + Mono + + + + + Left + + + + + Right + + + + + Both + + + + + + - Left + Ou&tput: - - + + sound_output_combo_box + + + + + + + + + + Save Directory + + + Save Directory + + + + - Right + Loc&ation: + + + save_path_select_push_button + + + + + + + + 1 + 0 + + + + Path to which .WAV files are saved. + + + false + + + background-color: rgb(255, 255, 255); - - - Both + TextLabel - - - - - - - Ou&tput: - - - sound_output_combo_box - - - - - - - - - - AzEl Directory - - - - - - Location: - - - azel_path_select_push_button - - - - - - - - 1 - 0 - - - - background-color: rgb(255, 255, 255); - - - TextLabel - - - - - - - Select - - - - - - - + + + + + + Click to select a different save directory for .WAV files. + + + S&elect + + + + + + + + + + AzEl Directory + + + AzEl Directory + + + + + + Location: + + + azel_path_select_push_button + + + + + + + + 1 + 0 + + + + background-color: rgb(255, 255, 255); + + + TextLabel + + + + + + + Select + + + + + + + + + + + 0 + 55 + + + + Power Memory By Band + + + Remember Power Settings By Band + + + + + 10 + 23 + 90 + 17 + + + + Enable power memory during transmit + + + Transmit + + + + + + 100 + 23 + 90 + 17 + + + + Enable power memory during tuning + + + Tune + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + @@ -1992,7 +2073,7 @@ Right click for insert and delete options. Colors - + 44 @@ -2378,25 +2459,9 @@ Right click for insert and delete options. - - - - Discard or apply configuration changes including -resetting the radio interface and applying any -soundcard changes - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - configuration_tabs callsign_line_edit grid_line_edit type_2_msg_gen_combo_box @@ -2539,12 +2604,12 @@ soundcard changes - - - - - + + + + + diff --git a/doc/user_guide/en/new_features.adoc b/doc/user_guide/en/new_features.adoc index 3cde11c86..3ec6dd0e3 100644 --- a/doc/user_guide/en/new_features.adoc +++ b/doc/user_guide/en/new_features.adoc @@ -25,3 +25,6 @@ subtracted out, allowing the decoding of weaker signals. - Many corrections and improvements to the Hamlib library, fixing balky rig-control features + +- Power settings for Transmit and Tune optionally remembered for +each band. \ No newline at end of file diff --git a/doc/user_guide/en/settings-audio.adoc b/doc/user_guide/en/settings-audio.adoc index b76f225b6..818f26cf7 100644 --- a/doc/user_guide/en/settings-audio.adoc +++ b/doc/user_guide/en/settings-audio.adoc @@ -33,3 +33,8 @@ calculated Doppler shift for the specified EME path. The file is updated once per second whenever the <> window is displayed. +- _Power Memory By Band_: Checking one or both of these will cause +_WSJT-X_ to remember the *Pwr* slider setting for that operation on a +band-by-band basis. For example, when *Tune* is enabled here and you +click the *Tune* on the main window, the power slider will change to +the most recent setting used for *Tune* on that band. diff --git a/mainwindow.cpp b/mainwindow.cpp index 75a65f27d..76c648a8a 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -327,9 +327,8 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, m_transmitting {false}, m_tune {false}, m_tx_watchdog {false}, - m_tune_attenuation {0}, - m_tune_attenuation_restore {0}, m_block_pwr_tooltip {false}, + m_PwrBandSetOK {true}, m_lastMonitoredFrequency {default_frequency}, m_toneSpacing {0.}, m_firstDecode {0}, @@ -934,8 +933,10 @@ void MainWindow::writeSettings() m_settings->setValue("FastMode",m_bFastMode); m_settings->setValue("Fast9",m_bFast9); m_settings->setValue("CQRxfreq",m_freqCQ); - m_settings->setValue("TuneAttenuation",m_tune_attenuation); + m_settings->setValue("pwrBandTxMemory",m_pwrBandTxMemory); + m_settings->setValue("pwrBandTuneMemory",m_pwrBandTuneMemory); m_settings->endGroup(); + } //---------------------------------------------------------- readSettings() @@ -994,7 +995,6 @@ void MainWindow::readSettings() m_block_pwr_tooltip = true; ui->outAttenuation->setValue (m_settings->value ("OutAttenuation", 0).toInt ()); m_block_pwr_tooltip = false; - m_tune_attenuation = m_settings->value ("TuneAttenuation", 0).toInt (); m_freqCQ=m_settings->value("CQRxFreq",285).toInt(); m_noSuffix=m_settings->value("NoSuffix",false).toBool(); int n=m_settings->value("GUItab",0).toInt(); @@ -1002,6 +1002,8 @@ void MainWindow::readSettings() outBufSize=m_settings->value("OutBufSize",4096).toInt(); m_lockTxFreq=m_settings->value("LockTxFreq",false).toBool(); m_TRindex=m_settings->value("TRindex",4).toInt(); + m_pwrBandTxMemory=m_settings->value("pwrBandTxMemory").toHash(); + m_pwrBandTuneMemory=m_settings->value("pwrBandTuneMemory").toHash(); m_settings->endGroup(); // use these initialisation settings to tune the audio o/p buffer @@ -4490,6 +4492,12 @@ void MainWindow::on_bandComboBox_activated (int index) void MainWindow::band_changed (Frequency f) { + // Set the attenuation value if options are checked + QString curBand = ui->bandComboBox->currentText(); + if (m_config.pwrBandTxMemory() && !m_tune) { + ui->outAttenuation->setValue(m_pwrBandTxMemory[curBand].toInt()); + } + if (m_bandEdited) { if (!m_mode.startsWith ("WSPR")) { // band hopping preserves auto Tx if (f + m_wideGraph->nStartFreq () > m_freqNominal + ui->TxFreqSpinBox->value () @@ -4644,19 +4652,32 @@ void MainWindow::on_rptSpinBox_valueChanged(int n) void MainWindow::on_tuneButton_clicked (bool checked) { + static bool lastChecked = false; + if (lastChecked == checked) return; + lastChecked = checked; + QString curBand = ui->bandComboBox->currentText(); + if (checked && m_tune==false) { // we're starting tuning so remember Tx and change pwr to Tune value + if (m_config.pwrBandTuneMemory ()) { + m_pwrBandTxMemory[curBand] = ui->outAttenuation->value(); // remember our Tx pwr + m_PwrBandSetOK = false; + ui->outAttenuation->setValue(m_pwrBandTuneMemory[curBand].toInt()); // set to Tune pwr + m_PwrBandSetOK = true; + } + } + else { // we're turning off so remember our Tune pwr setting and reset to Tx pwr + if (m_config.pwrBandTuneMemory() || m_config.pwrBandTxMemory()) { + m_pwrBandTuneMemory[curBand] = ui->outAttenuation->value(); // remember our Tune pwr + m_PwrBandSetOK = false; + ui->outAttenuation->setValue(m_pwrBandTxMemory[curBand].toInt()); // set to Tx pwr + m_PwrBandSetOK = true; + } + } if (m_tune) { tuneButtonTimer.start(250); } else { m_sentFirst73=false; itone[0]=0; on_monitorButton_clicked (true); - m_tune_attenuation_restore = ui->outAttenuation->value(); - if (m_tune_attenuation) - { - m_block_pwr_tooltip = true; - ui->outAttenuation->setValue(m_tune_attenuation); - m_block_pwr_tooltip = false; - } m_tune=true; } Q_EMIT tune (checked); @@ -4668,12 +4689,6 @@ void MainWindow::stop_tuning () ui->tuneButton->setChecked (false); m_bTxTime=false; m_tune=false; - if (m_tune_attenuation) - { - m_block_pwr_tooltip = true; - ui->outAttenuation->setValue(m_tune_attenuation_restore); - m_block_pwr_tooltip = false; - } } void MainWindow::stopTuneATU() @@ -5034,30 +5049,32 @@ void MainWindow::on_outAttenuation_valueChanged (int a) { QString tt_str; qreal dBAttn {a / 10.}; // slider interpreted as dB / 100 - if (m_tune && Qt::ShiftModifier == QGuiApplication::keyboardModifiers ()) + if (m_tune && m_config.pwrBandTuneMemory()) { - // special attenuation value for Tune button - m_tune_attenuation = a; - if (a) - { - tt_str = tr ("Tune digital gain ") - + (a ? QString::number (-dBAttn, 'f', 1) : "0") + "dB\n" - "Set at top to cancel"; - } - else - { - tt_str = tr ("Tune power = Tx power"); - } + tt_str = tr ("Tune digital gain"); } else { - tt_str = tr ("Transmit digital gain ") - + (a ? QString::number (-dBAttn, 'f', 1) : "0") + "dB"; + tt_str = tr ("Transmit digital gain"); } + tt_str += (a ? QString::number (-dBAttn, 'f', 1) : "0") + "dB"; if (!m_block_pwr_tooltip) { QToolTip::showText (QCursor::pos (), tt_str, ui->outAttenuation); } + QString curBand = ui->bandComboBox->currentText(); + if (m_PwrBandSetOK && !m_tune && m_config.pwrBandTxMemory ()) + { + m_pwrBandTxMemory[curBand] = a; // remember our Tx pwr + qDebug () << "Tx=" << QString::number(a); + } + if (m_PwrBandSetOK && m_tune && m_config.pwrBandTuneMemory()) + { + m_pwrBandTuneMemory[curBand] = a; // remember our Tune pwr + qDebug () << "Tune=" << QString::number(a); + } + // Updating attenuation for tuning is done in stop_tuning + Q_EMIT outAttenuationChanged (dBAttn); } diff --git a/mainwindow.h b/mainwindow.h index c54d0d37f..a6e693fab 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -504,9 +504,8 @@ private: bool m_transmitting; bool m_tune; bool m_tx_watchdog; // true when watchdog triggered - int m_tune_attenuation; - int m_tune_attenuation_restore; bool m_block_pwr_tooltip; + bool m_PwrBandSetOK; Frequency m_lastMonitoredFrequency; double m_toneSpacing; int m_firstDecode; @@ -515,6 +514,8 @@ private: MessageClient * m_messageClient; PSK_Reporter *psk_Reporter; DisplayManual m_manual; + QHash m_pwrBandTxMemory; // Remembers power level by band + QHash m_pwrBandTuneMemory; // Remembers power level by band for tuning //---------------------------------------------------- private functions void readSettings(); diff --git a/v1.7_Features.txt b/v1.7_Features.txt index 064c7a990..93d33cedc 100644 --- a/v1.7_Features.txt +++ b/v1.7_Features.txt @@ -16,42 +16,39 @@ Short list of new features New Modes --------- -1. MSK144 is intended for meteor scatter at 50 MHz and higher. -Designed and tested by K9AN and K1JT, it uses a low-density parity -check code (LDPC) -- one of the latest-and-greatest areas of active -research in communication theory. -MSK144 is a direct descendant of the now-defunct mode JTMSK, with a +1. MSK144 is intended for meteor scatter at 50 MHz and higher. It +uses a low-density parity check code (LDPC) designed by K9AN. The +mode is a direct descendant of the now-defunct mode JTMSK, with a number of improvements for better performance on weak and short meteor pings. The effective character transmission rate is about 250 cps, -compared with 147 cps for FSK441 and 154 cps for JTMSK. Like JT4, -JT9, JT65, and JTMSK, MSK144 uses strong forward error correction, so -message decoding is essentially "all or nothing". You will see little -or no garbage on your screen. +compared with 147 cps for FSK441. Like JT4, JT9, JT65, and QRA64, +MSK144 uses strong forward error correction. Message decoding is +essentially "all or nothing": partial decodes do not occur, and you +will see little or no garbage on your screen. -Standard MSK144 message frames are 72 ms long, compared to 117 ms for -JTMSK. The MSK144 waveform allows coherent demodulation, allowing up -to 3 dB better sensitivity. After QSO partners have exchanged -callsigns, MSK144 can use even shorter messages, only 20 ms long. As -in all the fast modes in WSJT-X, the 20 ms or 72 ms messages are -repeated without gaps for the duration of a transmission cycle. For -most purposes we recommend a T/R cycle duration of 15 s, but 5 s and -10 s sequences are also supported. +Standard MSK144 message frames are 72 ms long, compared to about 120 +ms for FSK441. The MSK144 waveform allows coherent demodulation, +allowing up to 3 dB better sensitivity. After QSO partners have +exchanged callsigns, MSK144 can use even shorter messages, only 20 ms +long. As in all the fast modes in WSJT-X, the 20 ms or 72 ms messages +are repeated without gaps for the duration of a transmission cycle. +For most purposes we recommend a T/R cycle duration of 15 s, but 5 s +and 10 s sequences are also supported. -Short ("Sh") messages in MSK144 are intended primarily for 144 MHz, -where most pings are short. These messages do not contain full -callsigns; instead, they contain a hash of the entire transmitted -message along with a report. They are not encrypted -- the report is -sent in the clear along with the hash. Short messages are fully +Short ("Sh") messages in MSK144 are intended primarily for 144 MHz and +higher, where many pings are short. These messages do not contain +full callsigns; instead, they contain a hash of the two callsigns +along with a report, acknowledgement, or 73. Short messages are fully decodable only by the station to whom they are addressed, as part of an ongoing QSO, because only then will the received hash match that -calculated using the known strings for "My Call" and "DX Call" and the -received report, RRR, or 73. If you are monitoring someone else's -QSO, you will not be able to decode its Sh messages. +calculated using the known strings for "My Call" and "DX Call". If +you are monitoring someone else's QSO, you will not be able to decode +its Sh messages. An MSK144 signal occupies the full bandwidth of a typical SSB transmitter, so transmissions are always centered at an offset of -1500Hz. For best results, selectable/adjustable Rx and Tx filters +1500Hz. For best results, selectable or adjustable Rx and Tx filters should be set to provide the flattest possible response over at least 300 - 2700 Hz. The maximum permissible frequency offset between you and your QSO partner is 200 Hz, and less is better.