diff --git a/Configuration.cpp b/Configuration.cpp index 719fe731d..d9be02e71 100644 --- a/Configuration.cpp +++ b/Configuration.cpp @@ -461,6 +461,8 @@ private: Q_SLOT void on_rbRTTYroundup_toggled(); Q_SLOT void on_FieldDay_Exchange_textChanged(); Q_SLOT void on_RTTY_Exchange_textChanged(); + Q_SLOT void on_prompt_to_log_check_box_clicked(bool); + Q_SLOT void on_cbAutoLog_clicked(bool); // typenames used as arguments must match registered type names :( Q_SIGNAL void start_transceiver (unsigned seqeunce_number) const; @@ -579,6 +581,7 @@ private: bool log_as_RTTY_; bool report_in_comments_; bool prompt_to_log_; + bool autoLog_; bool insert_blank_; bool DXCC_; bool ppfx_; @@ -692,6 +695,7 @@ bool Configuration::monitor_last_used () const {return m_->rig_is_dummy_ || m_-> bool Configuration::log_as_RTTY () const {return m_->log_as_RTTY_;} bool Configuration::report_in_comments () const {return m_->report_in_comments_;} bool Configuration::prompt_to_log () const {return m_->prompt_to_log_;} +bool Configuration::autoLog() const {return m_->autoLog_;} bool Configuration::insert_blank () const {return m_->insert_blank_;} bool Configuration::DXCC () const {return m_->DXCC_;} bool Configuration::ppfx() const {return m_->ppfx_;} @@ -1213,6 +1217,7 @@ void Configuration::impl::initialize_models () ui_->log_as_RTTY_check_box->setChecked (log_as_RTTY_); ui_->report_in_comments_check_box->setChecked (report_in_comments_); ui_->prompt_to_log_check_box->setChecked (prompt_to_log_); + ui_->cbAutoLog->setChecked(autoLog_); ui_->insert_blank_check_box->setChecked (insert_blank_); ui_->DXCC_check_box->setChecked (DXCC_); ui_->ppfx_check_box->setChecked (ppfx_); @@ -1466,6 +1471,7 @@ void Configuration::impl::read_settings () rig_params_.ptt_port = settings_->value ("PTTport").toString (); data_mode_ = settings_->value ("DataMode", QVariant::fromValue (data_mode_none)).value (); prompt_to_log_ = settings_->value ("PromptToLog", false).toBool (); + autoLog_ = settings_->value ("AutoLog", false).toBool (); insert_blank_ = settings_->value ("InsertBlank", false).toBool (); DXCC_ = settings_->value ("DXCCEntity", false).toBool (); ppfx_ = settings_->value ("PrincipalPrefix", false).toBool (); @@ -1578,6 +1584,7 @@ void Configuration::impl::write_settings () settings_->setValue ("CATHandshake", QVariant::fromValue (rig_params_.handshake)); settings_->setValue ("DataMode", QVariant::fromValue (data_mode_)); settings_->setValue ("PromptToLog", prompt_to_log_); + settings_->setValue ("AutoLog", autoLog_); settings_->setValue ("InsertBlank", insert_blank_); settings_->setValue ("DXCCEntity", DXCC_); settings_->setValue ("PrincipalPrefix", ppfx_); @@ -1999,6 +2006,7 @@ void Configuration::impl::accept () log_as_RTTY_ = ui_->log_as_RTTY_check_box->isChecked (); report_in_comments_ = ui_->report_in_comments_check_box->isChecked (); prompt_to_log_ = ui_->prompt_to_log_check_box->isChecked (); + autoLog_ = ui_->cbAutoLog->isChecked(); insert_blank_ = ui_->insert_blank_check_box->isChecked (); DXCC_ = ui_->DXCC_check_box->isChecked (); ppfx_ = ui_->ppfx_check_box->isChecked (); @@ -2596,6 +2604,16 @@ void Configuration::impl::on_calibration_slope_ppm_spin_box_valueChanged (double rig_active_ = false; // force reset } +void Configuration::impl::on_prompt_to_log_check_box_clicked(bool checked) +{ + if(checked) ui_->cbAutoLog->setChecked(false); +} + +void Configuration::impl::on_cbAutoLog_clicked(bool checked) +{ + if(checked) ui_->prompt_to_log_check_box->setChecked(false); +} + void Configuration::impl::on_cbFox_clicked (bool checked) { if(checked) { diff --git a/Configuration.hpp b/Configuration.hpp index c7372f1b4..f697ed4a3 100644 --- a/Configuration.hpp +++ b/Configuration.hpp @@ -115,6 +115,7 @@ public: bool log_as_RTTY () const; bool report_in_comments () const; bool prompt_to_log () const; + bool autoLog() const; bool insert_blank () const; bool DXCC () const; bool ppfx() const; diff --git a/Configuration.ui b/Configuration.ui index 47cd2147c..5e2993de9 100644 --- a/Configuration.ui +++ b/Configuration.ui @@ -1702,24 +1702,7 @@ QListView::item:hover { - - - - <html><head/><body><p>The callsign of the operator, if different from the station callsign.</p></body></html> - - - - - - - Some logging programs will not accept JT-65 or JT9 as a recognized mode. - - - Con&vert mode to RTTY - - - - + Some logging programs will not accept the type of reports @@ -1732,7 +1715,7 @@ comments field. - + Check this option to force the clearing of the DX Call @@ -1743,6 +1726,30 @@ and DX Grid fields when a 73 or free text message is sent. + + + + Some logging programs will not accept JT-65 or JT9 as a recognized mode. + + + Con&vert mode to RTTY + + + + + + + <html><head/><body><p>The callsign of the operator, if different from the station callsign.</p></body></html> + + + + + + + Log automatically + + + diff --git a/lib/77bit/t1.f90 b/lib/77bit/t1.f90 deleted file mode 100644 index 28c99292e..000000000 --- a/lib/77bit/t1.f90 +++ /dev/null @@ -1,54 +0,0 @@ -program t1 - - real x(13) - real(KIND=16) :: dlong,dlong0 - character wd*13,w*13,error*5 - character c*44 !NB: 44^13 = 2^(70.973) - data c/' 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+-./?@$'/ - - nargs=iargc() - if(nargs.ne.1) then - print*,'Usage: t1 "FreeText13"' - print*,' t1 ' - go to 999 - endif - call getarg(1,w) - iters=1 - read(w,*,err=10) iters -10 continue - - do iter=1,iters - if(iters.gt.1) then -! Create a random free-text word - call random_number(x) - do i=1,13 - j=44*x(i) + 1 - w(i:i)=c(j:j) - enddo - endif -! Encode a 13-character free-text message into a 71-bit integer. - dlong=0.d0 - do i=1,13 - n=index(c,w(i:i))-1 - dlong=44.d0*dlong + n - enddo - dlong0=dlong - - ! Decode a a 71-bit integer into a 13-character free-text message. - do i=13,1,-1 - j=mod(dlong,44.d0)+1.d0 - wd(i:i)=c(j:j) - dlong=dlong/44.d0 - enddo - - - error=' ' - if(wd.ne.w) then - error='ERROR' - write(*,1010) w,dlong0,wd,error -1010 format('"',a13,'"',f25.1,2x,'"',a13'"',2x,a5) - endif - if(mod(iter,1000).eq.0) print*,iter - enddo - -999 end program t1 diff --git a/lib/77bit/t3.f90 b/lib/77bit/t3.f90 deleted file mode 100644 index 0b074c5a1..000000000 --- a/lib/77bit/t3.f90 +++ /dev/null @@ -1,25 +0,0 @@ -program t3 - character*3 csec - character*70 line - logical eof - - eof=.false. - j=1 - do i=1,83 - read(*,1001,end=1) csec -1001 format(a3) - go to 2 -1 eof=.true. -2 line(j:j+5)='"'//csec//'",' - j=j+6 - if(j.gt.60 .or. i.eq.83 .or.eof) then - line(j:j+2)=' &' - line(j+3:)=' ' - write(*,1010) line -1010 format(a70) - j=1 - endif - if(eof) go to 999 - enddo - -999 end program t3 diff --git a/lib/emedop.dat b/lib/emedop.dat new file mode 100644 index 000000000..c37d5b85c --- /dev/null +++ b/lib/emedop.dat @@ -0,0 +1,8 @@ +Lat_A 40.35417 +WLong_A 75.62500 +Lat_B 45.1875 +WLong_B -1.541667 +TxFreqMHz 143.05 +StartTime 20180907 08:00:00 +StopTime 20180907 09:00:00 +StepSec 60.0 diff --git a/lib/emedop.f90 b/lib/emedop.f90 new file mode 100644 index 000000000..4a95fb87a --- /dev/null +++ b/lib/emedop.f90 @@ -0,0 +1,67 @@ +program emedop + + real*8 txfreq8 + real*8 rxfreq8 + real*4 LST + real*4 lat_a + real*4 lat_b + character*80 infile + character*256 jpleph_file_name + common/jplcom/jpleph_file_name + data jpleph_file_name/'JPLEPH'/ + + nargs=iargc() + if(nargs.ne.1) then + print*,'Usage: emedop ' + go to 999 + endif + + call getarg(1,infile) + open(10,file=infile,status='old',err=900) + read(10,1001) lat_a +1001 format(10x,f12.0) + read(10,1001) wlon_a + read(10,1001) lat_b + read(10,1001) wlon_b + read(10,1001) txfreq8 + read(10,1002) nyear,month,nday,ih,im,is +1002 format(10x,i4,2i2,1x,i2,1x,i2,1x,i2) + sec_start=3600.0*ih + 60.0*im + is + read(10,1002) nyear,month,nday,ih,im,is + sec_stop=3600.0*ih + 60.0*im + is + read(10,1001) sec_step + + write(*,1005) +1005 format(' Date UTC Tx Freq Rx Freq Doppler'/ & + '------------------------------------------------------') + + sec=sec_start + ncalc=(sec_stop - sec_start)/sec_step + + do icalc=1,ncalc + uth=sec/3600.0 + call MoonDopJPL(nyear,month,nday,uth,-wlon_a,lat_a,RAMoon,DecMoon, & + LST,HA,AzMoon,ElMoon,vr_a,techo) + + call MoonDopJPL(nyear,month,nday,uth,-wlon_b,lat_b,RAMoon,DecMoon, & + LST,HA,AzMoon,ElMoon,vr_b,techo) + + dop_a=-txfreq8*vr_a/2.99792458e5 !One-way Doppler from a + dop_b=-txfreq8*vr_b/2.99792458e5 !One-way Doppler to b + doppler=1.e6*(dop_a + dop_b) + rxfreq8=txfreq8 + dop_a + dop_b + + ih=sec/3600.0 + im=(sec-ih*3600.0)/60.0 + is=nint(mod(sec,60.0)) + write(*,1010) nyear,month,nday,ih,im,is,txFreq8,rxFreq8,doppler +1010 format(i4,2i2.2,2x,i2.2,':',i2.2,':',i2.2,2f13.7,f8.1) + + sec=sec + sec_step + enddo + go to 999 +900 print*,'Cannot open file ',trim(infile) +999 end program emedop + + + diff --git a/logqso.cpp b/logqso.cpp index 980cdcef2..e66f2e696 100644 --- a/logqso.cpp +++ b/logqso.cpp @@ -59,7 +59,8 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn, QDateTime const& dateTimeOff, Radio::Frequency dialFreq, QString const& myCall, QString const& myGrid, - bool noSuffix, bool toRTTY, bool dBtoComments, bool bFox, QString const& opCall) + bool noSuffix, bool toRTTY, bool dBtoComments, bool bFox, + bool bAutoLog, QString const& opCall) { if(!isHidden()) return; ui->call->setText(hisCall); @@ -87,7 +88,7 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString m_myGrid=myGrid; ui->band->setText (m_config->bands ()->find (dialFreq)); ui->loggedOperator->setText(opCall); - if(bFox) { + if(bFox or bAutoLog) { accept(); } else { show (); diff --git a/logqso.h b/logqso.h index fb92201e1..971117dd8 100644 --- a/logqso.h +++ b/logqso.h @@ -33,7 +33,8 @@ public: QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn, QDateTime const& dateTimeOff, Radio::Frequency dialFreq, QString const& myCall, QString const& myGrid, - bool noSuffix, bool toRTTY, bool dBtoComments, bool bFox, QString const& opCall); + bool noSuffix, bool toRTTY, bool dBtoComments, bool bFox, + bool bAutoLog, QString const& opCall); public slots: void accept(); diff --git a/mainwindow.cpp b/mainwindow.cpp index b13b5b290..4bf103cec 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1199,6 +1199,8 @@ void MainWindow::setContestType() if(m_config.bEU_VHF_Contest()) m_nContest=EU_VHF; if(m_config.bFieldDay()) m_nContest=FIELD_DAY; if(m_config.bRTTYroundup()) m_nContest=RTTY; + if(m_config.bFox()) m_nContest=FOX; + if(m_config.bHound()) m_nContest=HOUND; } void MainWindow::set_application_font (QFont const& font) @@ -2388,7 +2390,7 @@ void MainWindow::on_actionAstronomical_data_toggled (bool checked) void MainWindow::on_actionFox_Log_triggered() { on_actionMessage_averaging_triggered(); - m_msgAvgWidget->foxLogSetup(); + m_msgAvgWidget->foxLogSetup(m_nContest); } void MainWindow::on_actionColors_triggered() @@ -2407,13 +2409,12 @@ void MainWindow::on_actionColors_triggered() void MainWindow::on_actionMessage_averaging_triggered() { - if (!m_msgAvgWidget) - { - m_msgAvgWidget.reset (new MessageAveraging {m_settings, m_config.decoded_text_font ()}); + if(!m_msgAvgWidget) { + m_msgAvgWidget.reset (new MessageAveraging {m_settings, m_config.decoded_text_font ()}); - // Connect signals from Message Averaging window - connect (this, &MainWindow::finished, m_msgAvgWidget.data (), &MessageAveraging::close); - } + // Connect signals from Message Averaging window + connect (this, &MainWindow::finished, m_msgAvgWidget.data (), &MessageAveraging::close); + } m_msgAvgWidget->showNormal(); m_msgAvgWidget->raise (); m_msgAvgWidget->activateWindow (); @@ -3630,8 +3631,8 @@ void MainWindow::guiUpdate() if(m_config.id_after_73 ()) { icw[0] = m_ncw; } - if (m_config.prompt_to_log () && !m_tune) { - logQSOTimer.start (0); + if ((m_config.prompt_to_log() or m_config.autoLog()) && !m_tune) { + logQSOTimer.start(0); } } @@ -3754,7 +3755,7 @@ void MainWindow::guiUpdate() //Once per second: if(nsec != m_sec0) { -// qDebug() << "OneSec:"; +// qDebug() << "OneSec:" << m_nContest; if(m_freqNominal!=0 and m_freqNominal<50000000 and m_config.enable_VHF_features()) { if(!m_bVHFwarned) vhfWarning(); @@ -5185,11 +5186,12 @@ void MainWindow::on_logQSOButton_clicked() //Log QSO button if (dateTimeQSOOff < m_dateTimeQSOOn) dateTimeQSOOff = m_dateTimeQSOOn; QString grid=m_hisGrid; if(grid=="....") grid=""; + bool bAutoLog=m_config.autoLog() and m_nContest>0; m_logDlg->initLogQSO (m_hisCall, grid, m_modeTx, m_rptSent, m_rptRcvd, m_dateTimeQSOOn, dateTimeQSOOff, m_freqNominal + ui->TxFreqSpinBox->value(), m_config.my_callsign(), m_config.my_grid(), m_noSuffix, m_config.log_as_RTTY(), m_config.report_in_comments(), - m_config.bFox(), m_opCall); + m_config.bFox(), bAutoLog, m_opCall); if(m_nContest!=NONE) { if(m_nContest==NA_VHF) { m_xSent=m_config.my_grid().left(4); @@ -5217,6 +5219,13 @@ void MainWindow::cabLog() QTextStream out(&f); out << t << endl; f.close(); + if(m_msgAvgWidget != NULL and m_msgAvgWidget->isVisible()) { + QString band; + band.sprintf(" %5d ",nfreq); + t=QDateTime::currentDateTimeUtc().toString("yyyy-MM-dd hhmm ") + band + + m_hisCall.leftJustified(13,' ') + m_xSent.leftJustified(14,' ') + m_xRcvd; + m_msgAvgWidget->foxAddLog(t); + } } else { MessageBox::warning_message (this, tr("File Open Error"), tr("Cannot open \"%1\" for append: %2").arg(f.fileName()).arg(f.errorString())); @@ -6773,7 +6782,7 @@ void::MainWindow::VHF_features_enabled(bool b) ui->actionMessage_averaging->setEnabled(b); ui->actionEnable_AP_DXcall->setVisible (m_mode=="QRA64"); ui->actionEnable_AP_JT65->setVisible (b && m_mode=="JT65"); - if(!b && m_msgAvgWidget and !m_config.bFox()) { + if(!b && m_msgAvgWidget and !m_config.bFox() and !m_config.autoLog()) { if(m_msgAvgWidget->isVisible()) m_msgAvgWidget->close(); } } diff --git a/mainwindow.h b/mainwindow.h index 94f009871..607c832bd 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -518,7 +518,9 @@ private: NA_VHF, EU_VHF, FIELD_DAY, - RTTY + RTTY, + FOX, + HOUND } m_nContest; //Contest type enum {CALL, GRID, DXCC, MULT}; diff --git a/mainwindow.ui b/mainwindow.ui index 5b6dc38b0..b93653962 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -656,7 +656,7 @@ QLabel[oob="true"] { - 20 + 50 20 @@ -700,7 +700,7 @@ QLabel[oob="true"] { - 20 + 50 20 @@ -3275,13 +3275,13 @@ QPushButton[state="ok"] { - Fox Log + Fox or Contest Log - Fox Log + Fox or Contest Log - Fox Log + Fox or Contest Log @@ -3304,6 +3304,11 @@ QPushButton[state="ok"] { Color highlighting scheme + + + Contest Log + + diff --git a/messageaveraging.cpp b/messageaveraging.cpp index 052de7273..b73a5a9d9 100644 --- a/messageaveraging.cpp +++ b/messageaveraging.cpp @@ -20,6 +20,8 @@ MessageAveraging::MessageAveraging(QSettings * settings, QFont const& font, QWid read_settings (); if(m_title_.contains("Fox")) { ui->header_label->setText(" Date Time Call Grid Sent Rcvd Band"); + } else if(m_title_.contains("Contest")) { + ui->header_label->setText(" Date UTC Band Call Sent Rcvd"); } else { ui->header_label->setText(" UTC Sync DT Freq "); ui->lab1->setVisible(false); @@ -88,11 +90,18 @@ void MessageAveraging::displayAvg(QString const& t) ui->msgAvgPlainTextEdit->setPlainText(t); } -void MessageAveraging::foxLogSetup() +void MessageAveraging::foxLogSetup(int nContest) { - m_title_=QApplication::applicationName () + " - Fox Log"; - setWindowTitle(m_title_); - ui->header_label->setText(" Date Time Call Grid Sent Rcvd Band"); + if(nContest==5) { + m_title_=QApplication::applicationName () + " - Fox Log"; + setWindowTitle(m_title_); + ui->header_label->setText(" Date Time Call Grid Sent Rcvd Band"); + } + if(nContest>0 and nContest<5) { + m_title_=QApplication::applicationName () + " - Contest Log"; + setWindowTitle(m_title_); + ui->header_label->setText(" Date UTC Band Call Sent Rcvd"); + } } void MessageAveraging::foxLabCallers(int n) diff --git a/messageaveraging.h b/messageaveraging.h index ea8e06b9e..05358db89 100644 --- a/messageaveraging.h +++ b/messageaveraging.h @@ -17,7 +17,7 @@ public: ~MessageAveraging(); void displayAvg(QString const&); void changeFont (QFont const&); - void foxLogSetup(); + void foxLogSetup(int nContest); void foxLabCallers(int n); void foxLabQueued(int n); void foxLabRate(int n);