Enhancements to Doppler tracking capabilities for EME. Thanks to G3WDG!

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@8466 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Joe Taylor 2018-02-07 13:43:32 +00:00
parent da7da823cb
commit 778fd7b3e9
3 changed files with 117 additions and 26 deletions

102
astro.cpp
View File

@ -29,7 +29,7 @@ extern "C" {
double* ramoon, double* decmoon, double* dgrd, double* poloffset, double* ramoon, double* decmoon, double* dgrd, double* poloffset,
double* xnr, double* techo, double* width1, double* width2, double* xnr, double* techo, double* width1, double* width2,
bool* bTx, const char* AzElFileName, const char* jpleph, bool* bTx, const char* AzElFileName, const char* jpleph,
int len1, int len2, int len3, int len4); int len1, int len2, int len3, int len4);
} }
Astro::Astro(QSettings * settings, Configuration const * configuration, QWidget * parent) Astro::Astro(QSettings * settings, Configuration const * configuration, QWidget * parent)
@ -38,6 +38,9 @@ Astro::Astro(QSettings * settings, Configuration const * configuration, QWidget
, configuration_ {configuration} , configuration_ {configuration}
, ui_ {new Ui::Astro} , ui_ {new Ui::Astro}
, m_DopplerMethod {0} , m_DopplerMethod {0}
, m_dop {0}
, m_dop00 {0}
, m_dx_two_way_dop {0}
{ {
ui_->setupUi (this); ui_->setupUi (this);
setWindowTitle (QApplication::applicationName () + " - " + tr ("Astronomical Data")); setWindowTitle (QApplication::applicationName () + " - " + tr ("Astronomical Data"));
@ -70,7 +73,9 @@ void Astro::read_settings ()
case 0: ui_->rbNoDoppler->setChecked (true); break; case 0: ui_->rbNoDoppler->setChecked (true); break;
case 1: ui_->rbFullTrack->setChecked (true); break; case 1: ui_->rbFullTrack->setChecked (true); break;
case 2: ui_->rbConstFreqOnMoon->setChecked (true); break; case 2: ui_->rbConstFreqOnMoon->setChecked (true); break;
case 3: ui_->rbRxOnly->setChecked (true); break; case 3: ui_->rbOwnEcho->setChecked (true); break;
case 4: ui_->rbOnDxEcho->setChecked (true); break;
case 5: ui_->rbCallDx->setChecked (true); break;
} }
move (settings_->value ("window/pos", pos ()).toPoint ()); move (settings_->value ("window/pos", pos ()).toPoint ());
} }
@ -104,14 +109,15 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const
double freq8 {static_cast<double> (freq_moon)}; double freq8 {static_cast<double> (freq_moon)};
auto const& AzElFileName = QDir::toNativeSeparators (configuration_->azel_directory ().absoluteFilePath ("azel.dat")); auto const& AzElFileName = QDir::toNativeSeparators (configuration_->azel_directory ().absoluteFilePath ("azel.dat"));
auto const& jpleph = configuration_->data_dir ().absoluteFilePath ("JPLEPH"); auto const& jpleph = configuration_->data_dir ().absoluteFilePath ("JPLEPH");
int ndop;
int ndop00;
QString mygrid_padded {(mygrid + " ").left (6)}; QString mygrid_padded {(mygrid + " ").left (6)};
QString hisgrid_padded {(hisgrid + " ").left (6)}; QString hisgrid_padded {(hisgrid + " ").left (6)};
astrosub_(&nyear, &month, &nday, &uth, &freq8, mygrid_padded.toLatin1().constData(), astrosub_(&nyear, &month, &nday, &uth, &freq8, mygrid_padded.toLatin1().constData(),
hisgrid_padded.toLatin1().constData(), &azsun, &elsun, &azmoon, &elmoon, hisgrid_padded.toLatin1().constData(), &azsun, &elsun, &azmoon, &elmoon,
&azmoondx, &elmoondx, &ntsky, &ndop, &ndop00, &ramoon, &decmoon, &azmoondx, &elmoondx, &ntsky, &m_dop, &m_dop00, &ramoon, &decmoon,
&dgrd, &poloffset, &xnr, &techo, &width1, &width2, &bTx, &dgrd, &poloffset, &xnr, &techo, &width1, &width2, &bTx,
AzElFileName.toLatin1().constData(), jpleph.toLatin1().constData(), 6, 6, AzElFileName.toLatin1().constData(), jpleph.toLatin1().constData(), 6, 6,
AzElFileName.length(), jpleph.length()); AzElFileName.length(), jpleph.length());
@ -119,7 +125,7 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const
if(hisgrid_padded==" ") { if(hisgrid_padded==" ") {
azmoondx=0.0; azmoondx=0.0;
elmoondx=0.0; elmoondx=0.0;
ndop=0; m_dop=0;
width2=0.0; width2=0.0;
} }
QString message; QString message;
@ -132,14 +138,14 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const
<< qSetRealNumberPrecision (1) << qSetRealNumberPrecision (1)
<< "Az: " << azmoon << "\n" << "Az: " << azmoon << "\n"
"El: " << elmoon << "\n" "El: " << elmoon << "\n"
"SelfDop:" << ndop00 << "\n" "SelfDop:" << m_dop00 << "\n"
"Width: " << int(width1) << "\n" "Width: " << int(width1) << "\n"
<< qSetRealNumberPrecision (2) << qSetRealNumberPrecision (2)
<< "Delay: " << techo << "\n" << "Delay: " << techo << "\n"
<< qSetRealNumberPrecision (1) << qSetRealNumberPrecision (1)
<< "DxAz: " << azmoondx << "\n" << "DxAz: " << azmoondx << "\n"
"DxEl: " << elmoondx << "\n" "DxEl: " << elmoondx << "\n"
"DxDop: " << ndop << "\n" "DxDop: " << m_dop << "\n"
"DxWid: " << int(width2) << "\n" "DxWid: " << int(width2) << "\n"
"Dec: " << decmoon << "\n" "Dec: " << decmoon << "\n"
"SunAz: " << azsun << "\n" "SunAz: " << azsun << "\n"
@ -159,24 +165,48 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const
switch (m_DopplerMethod) switch (m_DopplerMethod)
{ {
case 1: // All Doppler correction done here; DX station stays at nominal dial frequency. case 1: // All Doppler correction done here; DX station stays at nominal dial frequency.
correction.rx = m_dop;
break;
case 4: // All Doppler correction done here; DX station stays at nominal dial frequency. (Trial for OnDxEcho)
correction.rx = m_dop;
break;
//case 5: // All Doppler correction done here; DX station stays at nominal dial frequency.
case 3: // Both stations do full correction on Rx and none on Tx case 3: // Both stations do full correction on Rx and none on Tx
correction.rx = dx_is_self ? ndop00 : ndop; //correction.rx = dx_is_self ? m_dop00 : m_dop;
correction.rx = m_dop00; // Now always sets RX to *own* echo freq
break; break;
case 2:
case 2:
// Doppler correction to constant frequency on Moon // Doppler correction to constant frequency on Moon
correction.rx = ndop00 / 2; correction.rx = m_dop00 / 2;
break; break;
} }
switch (m_DopplerMethod)
if (3 != m_DopplerMethod) correction.tx = -correction.rx; {
case 1: correction.tx = -correction.rx;
break;
case 2: correction.tx = -correction.rx;
break;
case 3: correction.tx = 0;
break;
case 4: // correction.tx = m_dop - m_dop00;
correction.tx = m_dx_two_way_dop - m_dop;
qDebug () << "correction.tx:" << correction.tx;
break;
case 5: correction.tx = - m_dop00;
break;
}
//if (3 != m_DopplerMethod || 4 != m_DopplerMethod) correction.tx = -correction.rx;
if(dx_is_self && m_DopplerMethod == 1) correction.rx = 0; if(dx_is_self && m_DopplerMethod == 1) correction.rx = 0;
if (no_tx_QSY && 3 != m_DopplerMethod && 0 != m_DopplerMethod) if (no_tx_QSY && 3 != m_DopplerMethod && 0 != m_DopplerMethod)
{ {
// calculate a single correction for transmit half way through // calculate a single correction for transmit half way through
// the period as a compromise for rigs that can't CAT QSY // the period as a compromise for rigs that can't CAT QSY
// while transmitting // while transmitting
// //
// use a base time of (secs-since-epoch + 2) so as to be sure // use a base time of (secs-since-epoch + 2) so as to be sure
// we do the next period if we calculate just before it starts // we do the next period if we calculate just before it starts
@ -194,7 +224,7 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const
double uth {nhr + nmin/60.0 + sec/3600.0}; double uth {nhr + nmin/60.0 + sec/3600.0};
astrosub_(&nyear, &month, &nday, &uth, &freq8, mygrid_padded.toLatin1().constData(), astrosub_(&nyear, &month, &nday, &uth, &freq8, mygrid_padded.toLatin1().constData(),
hisgrid_padded.toLatin1().constData(), &azsun, &elsun, &azmoon, &elmoon, hisgrid_padded.toLatin1().constData(), &azsun, &elsun, &azmoon, &elmoon,
&azmoondx, &elmoondx, &ntsky, &ndop, &ndop00, &ramoon, &decmoon, &azmoondx, &elmoondx, &ntsky, &m_dop, &m_dop00, &ramoon, &decmoon,
&dgrd, &poloffset, &xnr, &techo, &width1, &width2, &bTx, &dgrd, &poloffset, &xnr, &techo, &width1, &width2, &bTx,
"", jpleph.toLatin1().constData(), 6, 6, "", jpleph.toLatin1().constData(), 6, 6,
0, jpleph.length()); 0, jpleph.length());
@ -203,15 +233,27 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const
{ {
case 1: case 1:
// All Doppler correction done here; DX station stays at nominal dial frequency. // All Doppler correction done here; DX station stays at nominal dial frequency.
offset = dx_is_self ? ndop00 : ndop; offset = dx_is_self ? m_dop00 : m_dop;
break; break;
case 2: case 2:
// Doppler correction to constant frequency on Moon // Doppler correction to constant frequency on Moon
offset = ndop00 / 2; offset = m_dop00 / 2;
break;
case 4:
// Doppler correction for OnDxEcho
offset = m_dop - m_dx_two_way_dop;
break; break;
//case 5: correction.tx = - m_dop00;
case 5: offset = m_dop00;// version for _7
break;
} }
correction.tx = -offset; correction.tx = -offset;
qDebug () << "correction.tx (no tx qsy):" << correction.tx;
} }
} }
return correction; return correction;
@ -235,13 +277,31 @@ void Astro::on_rbFullTrack_clicked()
Q_EMIT tracking_update (); Q_EMIT tracking_update ();
} }
void Astro::on_rbRxOnly_clicked() void Astro::on_rbOnDxEcho_clicked(bool checked)
{
m_DopplerMethod = 4;
check_split ();
if (checked) {
m_dx_two_way_dop = 2 * (m_dop - (m_dop00/2));
qDebug () << "Starting Doppler:" << m_dx_two_way_dop;
}
Q_EMIT tracking_update ();
}
void Astro::on_rbOwnEcho_clicked()
{ {
m_DopplerMethod = 3; m_DopplerMethod = 3;
check_split (); check_split ();
Q_EMIT tracking_update (); Q_EMIT tracking_update ();
} }
void Astro::on_rbCallDx_clicked()
{
m_DopplerMethod = 5;
check_split ();
Q_EMIT tracking_update ();
}
void Astro::on_rbConstFreqOnMoon_clicked() void Astro::on_rbConstFreqOnMoon_clicked()
{ {
m_DopplerMethod = 2; m_DopplerMethod = 2;

View File

@ -57,8 +57,10 @@ protected:
private slots: private slots:
void on_rbConstFreqOnMoon_clicked(); void on_rbConstFreqOnMoon_clicked();
void on_rbFullTrack_clicked(); void on_rbFullTrack_clicked();
void on_rbRxOnly_clicked(); void on_rbOwnEcho_clicked();
void on_rbNoDoppler_clicked(); void on_rbNoDoppler_clicked();
void on_rbOnDxEcho_clicked(bool);
void on_rbCallDx_clicked();
void on_cbDopplerTracking_toggled(bool); void on_cbDopplerTracking_toggled(bool);
private: private:
@ -71,6 +73,9 @@ private:
QScopedPointer<Ui::Astro> ui_; QScopedPointer<Ui::Astro> ui_;
qint32 m_DopplerMethod; qint32 m_DopplerMethod;
int m_dop;
int m_dop00;
int m_dx_two_way_dop;
}; };
inline inline

View File

@ -48,12 +48,12 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QRadioButton" name="rbRxOnly"> <widget class="QRadioButton" name="rbOwnEcho">
<property name="toolTip"> <property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Both stations do full correction to their QSO partner's grid square during receive, no correction is applied on transmit.&lt;/p&gt;&lt;p&gt;This mode facilitates accurate Doppler shift correction when one or both stations have a rig that does not accept CAT QSY commands while transmitting.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Transmit takes place on sked frequency and receive frequency is corrected for own echoes. &lt;/p&gt;&lt;p&gt;This mode can be used for calling CQ, or when using Echo mode.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="text"> <property name="text">
<string>Receive only</string> <string>Own Echo</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -70,6 +70,32 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QRadioButton" name="rbOnDxEcho">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;DX station announces their TX Freq, which is entered as the Sked Freq. Correction applied to RX and TX so you appear on the DX's station's own echo Freq.&lt;/p&gt;&lt;p&gt;If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>On DX Echo</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="rbCallDx">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Tune radio manually and select this mode to put your echo on the same frequency.&lt;/p&gt;&lt;p&gt;If the rig does not accept CAT QSY commands while transmitting a single correction is applied for the whole transmit period.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Call DX</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item> <item>
<widget class="QRadioButton" name="rbNoDoppler"> <widget class="QRadioButton" name="rbNoDoppler">
<property name="toolTip"> <property name="toolTip">
@ -83,7 +109,7 @@
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item> <item>