diff --git a/Configuration.cpp b/Configuration.cpp index bc551216f..c93660a71 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -517,8 +517,8 @@ private: bool rig_changed_; TransceiverState cached_rig_state_; int rig_resolution_; // see Transceiver::resolution signal - double frequency_calibration_intercept_; - double frequency_calibration_slope_ppm_; + CalibrationParams calibration_; + bool frequency_calibration_disabled_; // not persistent unsigned transceiver_command_number_; // configuration fields that we publish @@ -672,15 +672,17 @@ 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_;} -auto Configuration::calibration_params () const -> CalibrationParams + +void Configuration::set_calibration (CalibrationParams params) { - return {m_->frequency_calibration_intercept_, m_->frequency_calibration_slope_ppm_}; + m_->calibration_ = params; } -void Configuration::adjust_calibration_parameters (double intercept, double slope_ppm) +void Configuration::enable_calibration (bool on) { - m_->frequency_calibration_intercept_ += intercept; - m_->frequency_calibration_slope_ppm_ += slope_ppm; + auto target_frequency = m_->remove_calibration (m_->cached_rig_state_.frequency ()) - m_->current_offset_; + m_->frequency_calibration_disabled_ = !on; + transceiver_frequency (target_frequency); } bool Configuration::is_transceiver_online () const @@ -802,12 +804,15 @@ Configuration::impl::impl (Configuration * self, QDir const& temp_directory, QSettings * settings, QWidget * parent) : QDialog {parent} , self_ {self} + , transceiver_thread_ {nullptr} , ui_ {new Ui::configuration_dialog} , settings_ {settings} , doc_dir_ {doc_path ()} , data_dir_ {data_path ()} , temp_dir_ {temp_directory} , writeable_data_dir_ {QStandardPaths::writableLocation (QStandardPaths::DataLocation)} + , restart_sound_input_device_ {false} + , restart_sound_output_device_ {false} , frequencies_ {&bands_} , next_frequencies_ {&bands_} , stations_ {&bands_} @@ -822,6 +827,7 @@ Configuration::impl::impl (Configuration * self, QDir const& temp_directory, , have_rig_ {false} , rig_changed_ {false} , rig_resolution_ {0} + , frequency_calibration_disabled_ {false} , transceiver_command_number_ {0} , degrade_ {0.} // initialize to zero each run, not // saved in settings @@ -1033,9 +1039,6 @@ Configuration::impl::impl (Configuration * self, QDir const& temp_directory, ui_->sound_input_channel_combo_box->setCurrentIndex (audio_input_channel_); ui_->sound_output_channel_combo_box->setCurrentIndex (audio_output_channel_); - restart_sound_input_device_ = false; - restart_sound_output_device_ = false; - enumerate_rigs (); initialize_models (); @@ -1135,8 +1138,8 @@ void Configuration::impl::initialize_models () ui_->accept_udp_requests_check_box->setChecked (accept_udp_requests_); ui_->udpWindowToFront->setChecked(udpWindowToFront_); ui_->udpWindowRestore->setChecked(udpWindowRestore_); - ui_->calibration_intercept_spin_box->setValue (frequency_calibration_intercept_); - ui_->calibration_slope_ppm_spin_box->setValue (frequency_calibration_slope_ppm_); + ui_->calibration_intercept_spin_box->setValue (calibration_.intercept); + ui_->calibration_slope_ppm_spin_box->setValue (calibration_.slope_ppm); if (rig_params_.ptt_port.isEmpty ()) { @@ -1338,8 +1341,8 @@ void Configuration::impl::read_settings () accept_udp_requests_ = settings_->value ("AcceptUDPRequests", false).toBool (); udpWindowToFront_ = settings_->value ("udpWindowToFront",false).toBool (); udpWindowRestore_ = settings_->value ("udpWindowRestore",false).toBool (); - frequency_calibration_intercept_ = settings_->value ("CalibrationIntercept", 0.).toDouble (); - frequency_calibration_slope_ppm_ = settings_->value ("CalibrationSlopePPM", 0.).toDouble (); + calibration_.intercept = settings_->value ("CalibrationIntercept", 0.).toDouble (); + calibration_.slope_ppm = settings_->value ("CalibrationSlopePPM", 0.).toDouble (); pwrBandTxMemory_ = settings_->value("pwrBandTxMemory",false).toBool (); pwrBandTuneMemory_ = settings_->value("pwrBandTuneMemory",false).toBool (); } @@ -1434,8 +1437,8 @@ void Configuration::impl::write_settings () settings_->setValue ("AcceptUDPRequests", accept_udp_requests_); settings_->setValue ("udpWindowToFront", udpWindowToFront_); settings_->setValue ("udpWindowRestore", udpWindowRestore_); - settings_->setValue ("CalibrationIntercept", frequency_calibration_intercept_); - settings_->setValue ("CalibrationSlopePPM", frequency_calibration_slope_ppm_); + settings_->setValue ("CalibrationIntercept", calibration_.intercept); + settings_->setValue ("CalibrationSlopePPM", calibration_.slope_ppm); settings_->setValue ("pwrBandTxMemory", pwrBandTxMemory_); settings_->setValue ("pwrBandTuneMemory", pwrBandTuneMemory_); settings_->setValue ("Region", QVariant::fromValue (region_)); @@ -1824,8 +1827,8 @@ void Configuration::impl::accept () twoPass_ = ui_->cbTwoPass->isChecked (); x2ToneSpacing_ = ui_->cbx2ToneSpacing->isChecked (); realTimeDecode_ = ui_->cbRealTime->isChecked (); - frequency_calibration_intercept_ = ui_->calibration_intercept_spin_box->value (); - frequency_calibration_slope_ppm_ = ui_->calibration_slope_ppm_spin_box->value (); + calibration_.intercept = ui_->calibration_intercept_spin_box->value (); + 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 (); @@ -2677,14 +2680,16 @@ void Configuration::impl::fill_port_combo_box (QComboBox * cb) auto Configuration::impl::apply_calibration (Frequency f) const -> Frequency { - return std::llround (frequency_calibration_intercept_ - + (1. + frequency_calibration_slope_ppm_ / 1.e6) * f); + if (frequency_calibration_disabled_) return f; + return std::llround (calibration_.intercept + + (1. + calibration_.slope_ppm / 1.e6) * f); } auto Configuration::impl::remove_calibration (Frequency f) const -> Frequency { - return std::llround ((f - frequency_calibration_intercept_) - / (1. + frequency_calibration_slope_ppm_ / 1.e6)); + if (frequency_calibration_disabled_) return f; + return std::llround ((f - calibration_.intercept) + / (1. + calibration_.slope_ppm / 1.e6)); } #if !defined (QT_NO_DEBUG_STREAM) diff --git a/Configuration.hpp b/Configuration.hpp index 58b7bde7d..c6e8875fb 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -159,16 +159,30 @@ public: QColor color_NewCall () const; bool pwrBandTxMemory () const; bool pwrBandTuneMemory () const; + struct CalibrationParams { - double intercept; - double slope_ppm; - }; - CalibrationParams calibration_params () const; + CalibrationParams () + : intercept {0.} + , slope_ppm {0.} + { + } - // Adjust the current calibration parameters, both arguments are in - // Hertz. They will be added to the current values. - void adjust_calibration_parameters (double intercept, double slope_ppm); + CalibrationParams (double the_intercept, double the_slope_ppm) + : intercept {the_intercept} + , slope_ppm {the_slope_ppm} + { + } + + double intercept; // Hertz + double slope_ppm; // Hertz + }; + + // Temporarily enable or disable calibration adjustments. + void enable_calibration (bool = true); + + // Set the calibration parameters and enable calibration corrections. + void set_calibration (CalibrationParams); // 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 19f3765b3..5f1a4c985 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -6,7 +6,7 @@ 0 0 - 552 + 521 507 @@ -2622,12 +2622,12 @@ soundcard changes + + - - diff --git a/mainwindow.cpp b/mainwindow.cpp index 486af6241..c401e49ae 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1225,18 +1225,20 @@ void MainWindow::dataSink(qint64 frames) QString t=QString::fromLatin1(line); DecodedText decodedtext {t, false, m_config.my_grid ()}; ui->decodedTextBrowser->displayDecodedText (decodedtext,m_baseCall,m_config.DXCC(), - m_logBook,m_config.color_CQ(),m_config.color_MyCall(),m_config.color_DXCC(), - m_config.color_NewCall()); -// Append results text to file "fmt.all". - QFile f {m_config.writeable_data_dir ().absoluteFilePath ("fmt.all")}; - if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { - QTextStream out(&f); - out << t << endl; - f.close(); - } else { - MessageBox::warning_message (this, tr ("File Open Error") - , tr ("Cannot open \"%1\" for append: %2") - .arg (f.fileName ()).arg (f.errorString ())); + m_logBook,m_config.color_CQ(),m_config.color_MyCall(),m_config.color_DXCC(), + m_config.color_NewCall()); + if (ui->measure_check_box->isChecked ()) { + // Append results text to file "fmt.all". + QFile f {m_config.writeable_data_dir ().absoluteFilePath ("fmt.all")}; + if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { + QTextStream out(&f); + out << t << endl; + f.close(); + } else { + MessageBox::warning_message (this, tr ("File Open Error") + , tr ("Cannot open \"%1\" for append: %2") + .arg (f.fileName ()).arg (f.errorString ())); + } } if(m_ihsym==m_hsymStop && ui->actionFrequency_calibration->isChecked()) { freqCalStep(); @@ -2133,12 +2135,16 @@ void MainWindow::on_actionSolve_FreqCal_triggered() .arg ("StdDev: ", 12).arg (rms, 0, 'f', 2) , QString {} , MessageBox::Cancel | MessageBox::Apply)) { - m_config.adjust_calibration_parameters (a, b); - // rename fmt.all as we have consumed the resulting calibration - // solution - auto const& backup_file_name = m_config.writeable_data_dir ().absoluteFilePath ("fmt.bak"); - QFile::remove (backup_file_name); - QFile::rename (m_config.writeable_data_dir ().absoluteFilePath ("fmt.all"), backup_file_name); + m_config.set_calibration (Configuration::CalibrationParams {a, b}); + if (MessageBox::Yes == MessageBox::query_message (this + , tr ("Delete Calibration Measurements") + , tr ("The \"fmt.all\" file will be renamed as \"fmt.bak\""))) { + // rename fmt.all as we have consumed the resulting calibration + // solution + auto const& backup_file_name = m_config.writeable_data_dir ().absoluteFilePath ("fmt.bak"); + QFile::remove (backup_file_name); + QFile::rename (m_config.writeable_data_dir ().absoluteFilePath ("fmt.all"), backup_file_name); + } } } @@ -4682,6 +4688,7 @@ void MainWindow::displayWidgets(int n) ui->cbFirst->setVisible ("FT8" == m_mode); ui->actionEnable_AP->setVisible ("FT8" == m_mode); ui->cbVHFcontest->setVisible(m_mode=="FT8" or m_mode=="MSK144"); + ui->measure_check_box->setVisible ("FreqCal" == m_mode); m_lastCallsign.clear (); // ensures Tx5 is updated for new modes genStdMsgs (m_rpt, true); } @@ -5121,6 +5128,7 @@ void MainWindow::on_actionFreqCal_triggered() setup_status_bar (true); // 18:15:47 0 1 1500 1550.349 0.100 3.5 10.2 ui->decodedTextLabel->setText(" UTC Freq CAL Offset fMeas DF Level S/N"); + ui->measure_check_box->setChecked (false); displayWidgets(nWidgets("001101000000000000000000")); statusChanged(); } @@ -5214,9 +5222,8 @@ void MainWindow::on_TxFreqSpinBox_valueChanged(int n) void MainWindow::on_RxFreqSpinBox_valueChanged(int n) { m_wideGraph->setRxFreq(n); - if (m_mode == "FreqCal" - && m_frequency_list_fcal_iter != m_config.frequencies ()->end ()) { - setRig (m_frequency_list_fcal_iter->frequency_ - n); + if (m_mode == "FreqCal") { + setRig (); } statusUpdate (); } @@ -5349,15 +5356,11 @@ void MainWindow::band_changed (Frequency f) if ("FreqCal" == m_mode) { m_frequency_list_fcal_iter = m_config.frequencies ()->find (f); - setRig (f - ui->RxFreqSpinBox->value ()); - } - else - { - float r=m_freqNominal/(f+0.0001); - if(r<0.9 or r>1.1) m_bVHFwarned=false; - setRig (f); - setXIT (ui->TxFreqSpinBox->value ()); } + float r=m_freqNominal/(f+0.0001); + if(r<0.9 or r>1.1) m_bVHFwarned=false; + setRig (f); + setXIT (ui->TxFreqSpinBox->value ()); if(monitor_off) monitor(false); } } @@ -6656,6 +6659,10 @@ void MainWindow::setRig (Frequency f) m_freqTxNominal = m_freqNominal; if (m_astroWidget) m_astroWidget->nominal_frequency (m_freqNominal, m_freqTxNominal); } + if (m_mode == "FreqCal" + && m_frequency_list_fcal_iter != m_config.frequencies ()->end ()) { + m_freqNominal = m_frequency_list_fcal_iter->frequency_ - ui->RxFreqSpinBox->value (); + } if(m_transmitting && !m_config.tx_QSY_allowed ()) return; if ((m_monitoring || m_transmitting) && m_config.transceiver_online ()) { @@ -6855,6 +6862,13 @@ void MainWindow::on_cbAutoSeq_toggled(bool b) ui->cbFirst->setVisible((m_mode=="FT8") and b); } +void MainWindow::on_measure_check_box_stateChanged (int state) +{ + if ("FreqCal" == m_mode) { + m_config.enable_calibration (Qt::Checked != state); + } +} + void MainWindow::write_transmit_entry (QString const& file_name) { QFile f {m_config.writeable_data_dir ().absoluteFilePath (file_name)}; diff --git a/mainwindow.h b/mainwindow.h index 5d39184fd..5f5b6b289 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -281,6 +281,7 @@ private slots: void on_actionQRA64_triggered(); void on_actionFreqCal_triggered(); void splash_done (); + void on_measure_check_box_stateChanged (int); private: Q_SIGNAL void initializeAudioOutputStream (QAudioDeviceInfo, diff --git a/mainwindow.ui b/mainwindow.ui index 09a8349c5..44cf6eb25 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 815 - 548 + 555 @@ -21,7 +21,7 @@ - + 3 @@ -974,6 +974,16 @@ QLabel[oob="true"] { + + + + <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> + + + Measure + + +