diff --git a/Configuration.cpp b/Configuration.cpp index e7b9882ad..f4b8f445c 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -673,6 +673,12 @@ 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_;} +void Configuration::adjust_calibration_parameters (double intercept, double slope_ppm) +{ + m_->frequency_calibration_intercept_ += intercept; + m_->frequency_calibration_slope_ppm_ += slope_ppm; +} + bool Configuration::is_transceiver_online () const { return m_->rig_active_; diff --git a/Configuration.hpp b/Configuration.hpp index b0c219167..aca0736c8 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -159,6 +159,11 @@ public: QColor color_NewCall () const; bool pwrBandTxMemory () const; bool pwrBandTuneMemory () const; + + // 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); + // This method queries if a CAT and PTT connection is operational. bool is_transceiver_online () const; diff --git a/lib/calibrate.f90 b/lib/calibrate.f90 index 199beba1f..a27c400a0 100644 --- a/lib/calibrate.f90 +++ b/lib/calibrate.f90 @@ -24,7 +24,7 @@ subroutine calibrate(data_dir,iz,a,b,rms,sigmaa,sigmab,irc) n=0 j=0 do i=1,99999 - read(10,*,end=10) cutc,nkHz,ncal,noffset,faudio,df,dblevel,snr + read(10,*,end=10,err=995) cutc,nkHz,ncal,noffset,faudio,df,dblevel,snr if((nkHz.ne.nkHz0) .and. i.ne.1) then ave=sum/n rms=0.d0 @@ -84,6 +84,7 @@ subroutine calibrate(data_dir,iz,a,b,rms,sigmaa,sigmab,irc) enddo go to 999 +995 irc=-4; iz=i; go to 999 996 irc=-1; go to 999 997 irc=-2; go to 999 998 irc=-3 diff --git a/mainwindow.cpp b/mainwindow.cpp index 189bd78ab..a97705b55 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2110,16 +2110,34 @@ void MainWindow::on_actionSolve_FreqCal_triggered() double a,b,rms,sigmaa,sigmab; strncpy(data_dir,dpath.toLatin1(),len); calibrate_(data_dir,&iz,&a,&b,&rms,&sigmaa,&sigmab,&irc,len); - QString t1; - t1.sprintf("Slope: %10.3f ±%7.3f ppm\nIntercept: %7.2f ±%5.2f Hz\n\nN: %18d\nStdDev: %8.2f Hz", - b,sigmab,a,sigmaa,iz,rms); - QString t2{"Solution looks good."}; - if(irc<0) t1=""; + QString t2; if(irc==-1) t2="Cannot open " + dpath + "fmt.all"; if(irc==-2) t2="Cannot open " + dpath + "fcal2.out"; if(irc==-3) t2="Insufficient data in fmt.all"; + if(irc==-4) t2 = tr ("Invalid data in fmt.all at line %1").arg (iz); if(irc>0 or rms>1.0) t2="Check fmt.all for possible bad data."; - MessageBox::information_message(this,t1,t2,0); + if (irc < 0 || irc > 0 || rms > 1.) { + MessageBox::warning_message (this, "Calibration Error", t2); + } + else if (MessageBox::Apply == MessageBox::query_message (this + , tr ("Good Calibration Solution") + , tr ("
"
+                                                                 "%1%L2 ±%L3 ppm\n"
+                                                                 "%4%L5 ±%L6 Hz\n\n"
+                                                                 "%7%L8\n"
+                                                                 "%9%L10 Hz"
+                                                                 "
") + .arg ("Slope: ", 12).arg (b, 0, 'f', 3).arg (sigmab, 0, 'f', 3) + .arg ("Intercept: ", 12).arg (a, 0, 'f', 2).arg (sigmaa, 0, 'f', 2) + .arg ("N: ", 12).arg (iz) + .arg ("StdDev: ", 12).arg (rms, 0, 'f', 2) + , QString {} + , MessageBox::Cancel | MessageBox::Apply)) { + m_config.adjust_calibration_parameters (a, b); + // discard fmt.all as we have consumed the resulting calibration solution + QFile f {m_config.writeable_data_dir ().absoluteFilePath ("fmt.all")}; + f.remove (); + } } // This allows the window to shrink by removing certain things