diff --git a/map65/astro.cpp b/map65/astro.cpp index a91c048b4..427518382 100644 --- a/map65/astro.cpp +++ b/map65/astro.cpp @@ -7,6 +7,7 @@ #include #include "SettingsGroup.hpp" #include "commons.h" +#include extern "C" { void astrosub_ (int* nyear, int* month, int* nday, double* uth, int* nfreq, @@ -44,7 +45,7 @@ Astro::~Astro() } void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, - int fQSO, int nsetftx, int ntxFreq, QString azelDir) + int fQSO, int nsetftx, int ntxFreq, QString azelDir, double xavg) { static int ntxFreq0=-99; char cc[300]; @@ -86,6 +87,65 @@ void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, ntsky,xnr,dgrd); ui->astroTextBrowser->setText(" "+ date + "\nUTC: " + utc + "\n" + cc); + double azOffset=0.0; + double elOffset=0.0; + double rad=57.2957795131; + int iCycle=2; +// Are we doing pointing tests? + bool bPointing=ui->cbPointingTests->isChecked(); + ui->gbPointing->setVisible(bPointing); + if(bPointing) { + int nDwell=int(ui->sbDwell->value()); + if(ui->cbAutoCycle->isChecked()) { + iCycle=(t.currentSecsSinceEpoch()%(6*nDwell))/nDwell + 1; + if(iCycle==1) { + azOffset = -ui->sbOffset->value()/cos(elsun/rad); + ui->rb1->setChecked(true); + } + if(iCycle==2 or iCycle==5) { + ui->rb2->setChecked(true); + } + if(iCycle==3) { + azOffset = +ui->sbOffset->value()/cos(elsun/rad); + ui->rb3->setChecked(true); + } + if(iCycle==4) { + elOffset = -ui->sbOffset->value(); + ui->rb4->setChecked(true); + } + if(iCycle==6) { + elOffset = +ui->sbOffset->value(); + ui->rb6->setChecked(true); + } + } + if(ui->cbOnOff->isChecked()) { + iCycle=(t.currentSecsSinceEpoch()%(2*nDwell))/nDwell + 1; + if(iCycle==1) { + azOffset = -ui->sbOffset->value()/cos(elsun/rad); + ui->rb1->setChecked(true); + } + if(iCycle==2) { + ui->rb2->setChecked(true); + } + } + if(ui->cbAutoCycle->isChecked() or ui->cbOnOff->isChecked()) { + QFile f("pointing.out"); + if(f.open(QIODevice::WriteOnly | QIODevice::Append)) { + QTextStream out(&f); + out << t.toString("yyyy-MMM-dd hh:mm:ss"); + sprintf(cc,"%7.1f %7.1f %d %7.1f %7.1f %10.1f %7.2f\n", + azsun,elsun,iCycle,azOffset,elOffset,xavg,10.0*log10(xavg)); + out << cc; + f.close(); + } + } + } else { + ui->rb2->setChecked(true); + ui->cbAutoCycle->setChecked(false); + ui->cbOnOff->setChecked(false); + } + +// Write pointing data to azel.dat QString fname=azelDir+"/azel.dat"; QFile f(fname); if(!f.open(QIODevice::WriteOnly | QIODevice::Text)) { @@ -107,7 +167,7 @@ void Astro::astroUpdate(QDateTime t, QString mygrid, QString hisgrid, "%3d,%1d,fQSO\n" "%3d,%1d,fQSO2\n", nhr,nmin,isec,azmoon,elmoon, - nhr,nmin,isec,azsun,elsun, + nhr,nmin,isec,azsun+azOffset,elsun+elOffset, nhr,nmin,isec,0.0,0.0, nfreq,ndop,ndop00, fQSO,nsetftx, @@ -120,3 +180,14 @@ void Astro::setFontSize(int n) { ui->astroTextBrowser->setFontPointSize(n); } + +void Astro::on_cbAutoCycle_clicked(bool checked) +{ + if(checked) ui->cbOnOff->setChecked(false); +} + +void Astro::on_cbOnOff_clicked(bool checked) +{ + if(checked) ui->cbAutoCycle->setChecked(false); +} + diff --git a/map65/astro.h b/map65/astro.h index f425f3e73..6b574237f 100644 --- a/map65/astro.h +++ b/map65/astro.h @@ -15,10 +15,14 @@ class Astro : public QWidget public: explicit Astro (QString const& settings_filename, QWidget *parent = 0); void astroUpdate(QDateTime t, QString mygrid, QString hisgrid, - int fQSO, int nsetftx, int ntxFreq, QString azelDir); + int fQSO, int nsetftx, int ntxFreq, QString azelDir, double xavg); void setFontSize(int n); ~Astro (); +private slots: + void on_cbOnOff_clicked(bool checked); + void on_cbAutoCycle_clicked(bool checked); + private: Ui::Astro *ui; QString m_settings_filename; diff --git a/map65/astro.ui b/map65/astro.ui index 30cce70bb..991a002f4 100644 --- a/map65/astro.ui +++ b/map65/astro.ui @@ -6,30 +6,242 @@ 0 0 - 262 + 441 483 Form - + + + + 269 + 19 + 151 + 431 + + + + + + + + + 10 + 100 + 30 + 17 + + + + 1 + + + + + + 60 + 100 + 40 + 17 + + + + 2, 5 + + + true + + + + + + 110 + 100 + 30 + 17 + + + + 3 + + + + + + 60 + 150 + 30 + 17 + + + + 4 + + + + + + 60 + 50 + 30 + 17 + + + + 6 + + + + + + 10 + 230 + 130 + 22 + + + + Qt::AlignCenter + + + Offset + + + deg + + + 1 + + + 0.500000000000000 + + + 20.000000000000000 + + + 0.500000000000000 + + + 2.500000000000000 + + + + + + 30 + 330 + 91 + 17 + + + + Auto Cycle + + + + + + 30 + 380 + 70 + 17 + + + + On Off + + + + + + 10 + 280 + 130 + 22 + + + + Qt::AlignCenter + + + s + + + Dwell + + + 10 + + + 300 + + + 10 + + + + 0 10 - 256 - 451 + 258 + 471 - - - Courier New - 20 - 75 - true - - + + + + + + Courier New + 20 + 75 + true + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Pointing Tests + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + diff --git a/map65/mainwindow.cpp b/map65/mainwindow.cpp index 2a8bb4705..99dd59527 100644 --- a/map65/mainwindow.cpp +++ b/map65/mainwindow.cpp @@ -520,6 +520,8 @@ void MainWindow::dataSink(int k) static int nkhz; static int nfsample=96000; static int nxpol=0; + static int nsec0=0; + static int nsum=0; static float fgreen; static int ndiskdat; static int nb; @@ -529,6 +531,7 @@ void MainWindow::dataSink(int k) static float rejectx; static float rejecty; static float slimit; + static double xsum=0.0; if(m_diskData) { ndiskdat=1; @@ -551,8 +554,22 @@ void MainWindow::dataSink(int k) &nfsample, &fgreen, &m_adjustIQ, &m_applyIQcal, &m_gainx, &m_gainy, &m_phasex, &m_phasey, &rejectx, &rejecty, &px, &py, s, &nkhz, &ihsym, &nzap, &slimit, lstrong); + + int nsec=QDateTime::currentSecsSinceEpoch(); + if(nsec==nsec0) { + xsum+=pow(10.0,0.1*px); + nsum+=1; + } else { + m_xavg=0.0; + if(nsum>0) m_xavg=xsum/nsum; + xsum=pow(10.0,0.1*px); + nsum=1; + } + nsec0=nsec; + QString t; m_pctZap=nzap/178.3; + ui->yMeterFrame->setVisible(m_xpol); if(m_xpol) { lab4->setText ( QString {" Rx noise: %1 %2 %3 %% "} @@ -1693,7 +1710,7 @@ void MainWindow::guiUpdate() QDateTime t = QDateTime::currentDateTimeUtc(); int fQSO=m_wide_graph_window->QSOfreq(); m_astro_window->astroUpdate(t, m_myGrid, m_hisGrid, fQSO, m_setftx, - m_txFreq, m_azelDir); + m_txFreq, m_azelDir, m_xavg); m_setftx=0; QString utc = t.date().toString(" yyyy MMM dd \n") + t.time().toString(); ui->labUTC->setText(utc); diff --git a/map65/mainwindow.h b/map65/mainwindow.h index 46e6f0775..bbf3e707c 100644 --- a/map65/mainwindow.h +++ b/map65/mainwindow.h @@ -200,6 +200,7 @@ private: // double m_IQphase; double m_cal570; double m_TxOffset; + double m_xavg; bool m_monitoring; bool m_transmitting; diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index 3a0c04f03..17acca44c 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -210,6 +210,7 @@ using SpecOp = Configuration::SpecialOperatingActivity; bool m_displayBand = false; bool no_a7_decodes = false; +bool keep_frequency = false; namespace { @@ -4133,7 +4134,7 @@ void MainWindow::pskPost (DecodedText const& decodedtext) } int snr = decodedtext.snr(); Frequency frequency = m_freqNominalPeriod + audioFrequency; // prevent spotting wrong band - if(grid.contains (grid_regexp)) { + if(grid.contains (grid_regexp) || decodedtext.string().contains(" CQ ")) { // qDebug() << "To PSKreporter:" << deCall << grid << frequency << msgmode << snr; if (!m_psk_Reporter.addRemoteStation (deCall, grid, frequency, msgmode, snr)) { @@ -6758,7 +6759,7 @@ void MainWindow::on_actionFT8_triggered() ui->txb5->setEnabled(false); ui->txb6->setEnabled(false); } else { - switch_mode (Modes::FT8); + if (!(keep_frequency)) switch_mode (Modes::FT8); } if(m_specOp != SpecOp::HOUND) { @@ -10006,6 +10007,8 @@ void MainWindow::on_houndButton_clicked (bool checked) } else { ui->houndButton->setStyleSheet(""); m_config.setSpecial_None(); + keep_frequency = true; + QTimer::singleShot (250, [=] {keep_frequency = false;}); } m_specOp=m_config.special_op_id(); on_actionFT8_triggered();