diff --git a/lib/ft8/sync8.f90 b/lib/ft8/sync8.f90 index d498e6f4c..f93afe75a 100644 --- a/lib/ft8/sync8.f90 +++ b/lib/ft8/sync8.f90 @@ -73,10 +73,6 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,maxcand,nzhsym,candidate, & t0c=t0c + sum(s(i:i+nfos*6:nfos,m+nssy*72)) endif enddo - t=ta+tb - t0=t0a+t0b - t0=(t0-t)/6.0 - sync_ab=t/t0 t=ta+tb+tc t0=t0a+t0b+t0c t0=(t0-t)/6.0 @@ -85,14 +81,7 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,maxcand,nzhsym,candidate, & t0=t0b+t0c t0=(t0-t)/6.0 sync_bc=t/t0 - if(j.le.-12) then - sync2d(i,j)=sync_bc - elseif(j.gt.-12 .and. j.lt. 49) then - if(nzhsym.eq.41) sync2d(i,j)=sync_ab - if(nzhsym.eq.50) sync2d(i,j)=max(sync_abc,sync_bc) - elseif(j.ge.49) then - sync2d(i,j)=sync_ab - endif + sync2d(i,j)=max(sync_abc,sync_bc) enddo enddo diff --git a/lib/ft8_decode.f90 b/lib/ft8_decode.f90 index 911ecb31e..4bd637e95 100644 --- a/lib/ft8_decode.f90 +++ b/lib/ft8_decode.f90 @@ -44,7 +44,7 @@ contains class(ft8_decoder), intent(inout) :: this procedure(ft8_decode_callback) :: callback - parameter (MAXCAND=500,MAX_EARLY=100) + parameter (MAXCAND=600,MAX_EARLY=100) real*8 tsec,tseq real s(NH1,NHSYM) real sbase(NH1) @@ -109,6 +109,7 @@ contains dd=iwave dd1=dd endif + if(nzhsym.eq.41) then ndecodes=0 allmessages=' ' @@ -116,10 +117,12 @@ contains else ndecodes=ndec_early endif + if(nzhsym.eq.47 .and. ndec_early.eq.0) then dd1=dd go to 800 endif + if(nzhsym.eq.47 .and. ndec_early.ge.1) then lsubtracted=.false. lrefinedt=.true. @@ -142,6 +145,7 @@ contains dd1=dd go to 900 endif + if(nzhsym.eq.50 .and. ndec_early.ge.1 .and. .not.nagain) then n=47*3456 dd(1:n)=dd1(1:n) @@ -153,6 +157,7 @@ contains enddo call timer('sub_ft8c',1) endif + ifa=nfa ifb=nfb if(nzhsym.eq.50 .and. nagain) then @@ -171,7 +176,6 @@ contains newdat=.true. syncmin=1.3 if(ndepth.le.2) syncmin=1.6 -! if(nzhsym.eq.41.or.ipass.eq.1) syncmin=2.0 if(nzhsym.eq.41) syncmin=2.0 if(ipass.eq.1) then lsubtract=.true. @@ -225,10 +229,6 @@ contains if(emedelay.ne.0) xdt=xdt+2.0 call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual) call ft8_a7_save(nutc,xdt,f1,msg37) !Enter decode in table -! ii=ndec(jseq,1) -! write(41,3041) jseq,ii,nint(f0(ii,jseq,0)),msg0(ii,jseq,0)(1:22),& -! nint(f0(ii,jseq,1)),msg0(ii,jseq,1)(1:22) -!3041 format(3i5,2x,a22,i5,2x,a22) endif endif call timestamp(tsec,tseq,ctime) 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 52b353112..f518c43bb 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -209,6 +209,8 @@ QVector g_ColorTbl; using SpecOp = Configuration::SpecialOperatingActivity; bool m_displayBand = false; +bool no_a7_decodes = false; +bool keep_frequency = false; namespace { @@ -3700,6 +3702,10 @@ void MainWindow::readFromStdout() //readFromStdout continue; } } + + // Don't allow a7 decodes during the first period because they can be leftovers from the previous band + if (!(no_a7_decodes && line_read.contains("a7"))) { + if (m_mode!="FT8" and m_mode!="FT4" and !m_mode.startsWith ("FST4") and m_mode!="Q65") { //Pad 22-char msg to at least 37 chars line_read = line_read.left(44) + " " + line_read.mid(44); @@ -3766,6 +3772,7 @@ void MainWindow::readFromStdout() //readFromStdout } m_tBlankLine = line_read.left(ntime); } + } if ("FST4W" == m_mode) { uploadWSPRSpots (true, line_read); @@ -4139,7 +4146,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)) { @@ -6764,7 +6771,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) { @@ -7487,6 +7494,10 @@ void MainWindow::on_bandComboBox_activated (int index) void MainWindow::band_changed (Frequency f) { + // Don't allow a7 decodes during the first period because they can be leftovers from the previous band + no_a7_decodes = true; + QTimer::singleShot ((int(1000.0*m_TRperiod)), [=] {no_a7_decodes = false;}); + // Set the attenuation value if options are checked if (m_config.pwrBandTxMemory() && !m_tune) { auto const&curBand = ui->bandComboBox->currentText(); @@ -10113,6 +10124,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();