Merge branch 'feat-autoLog' into develop: new "AutoLog" feature for contests.

Also a real-time logging window.
This commit is contained in:
Joe Taylor 2018-10-02 13:26:36 -04:00
commit 882ee7c871
14 changed files with 173 additions and 124 deletions

View File

@ -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<Configuration::DataMode> ();
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) {

View File

@ -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;

View File

@ -1702,24 +1702,7 @@ QListView::item:hover {
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLineEdit" name="opCallEntry">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The callsign of the operator, if different from the station callsign.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="log_as_RTTY_check_box">
<property name="toolTip">
<string>Some logging programs will not accept JT-65 or JT9 as a recognized mode.</string>
</property>
<property name="text">
<string>Con&amp;vert mode to RTTY</string>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QCheckBox" name="report_in_comments_check_box">
<property name="toolTip">
<string>Some logging programs will not accept the type of reports
@ -1732,7 +1715,7 @@ comments field.</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<item row="4" column="0" colspan="2">
<widget class="QCheckBox" name="clear_DX_check_box">
<property name="toolTip">
<string>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.</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="log_as_RTTY_check_box">
<property name="toolTip">
<string>Some logging programs will not accept JT-65 or JT9 as a recognized mode.</string>
</property>
<property name="text">
<string>Con&amp;vert mode to RTTY</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLineEdit" name="opCallEntry">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The callsign of the operator, if different from the station callsign.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="cbAutoLog">
<property name="text">
<string>Log automatically</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>

View File

@ -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 <iters>'
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

View File

@ -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

8
lib/emedop.dat Normal file
View File

@ -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

67
lib/emedop.f90 Normal file
View File

@ -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 <infile>'
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

View File

@ -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 ();

View File

@ -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();

View File

@ -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,8 +2409,7 @@ void MainWindow::on_actionColors_triggered()
void MainWindow::on_actionMessage_averaging_triggered()
{
if (!m_msgAvgWidget)
{
if(!m_msgAvgWidget) {
m_msgAvgWidget.reset (new MessageAveraging {m_settings, m_config.decoded_text_font ()});
// Connect signals from Message Averaging window
@ -3630,7 +3631,7 @@ void MainWindow::guiUpdate()
if(m_config.id_after_73 ()) {
icw[0] = m_ncw;
}
if (m_config.prompt_to_log () && !m_tune) {
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();
}
}

View File

@ -518,7 +518,9 @@ private:
NA_VHF,
EU_VHF,
FIELD_DAY,
RTTY
RTTY,
FOX,
HOUND
} m_nContest; //Contest type
enum {CALL, GRID, DXCC, MULT};

View File

@ -656,7 +656,7 @@ QLabel[oob=&quot;true&quot;] {
</property>
<property name="maximumSize">
<size>
<width>20</width>
<width>50</width>
<height>20</height>
</size>
</property>
@ -700,7 +700,7 @@ QLabel[oob=&quot;true&quot;] {
</property>
<property name="maximumSize">
<size>
<width>20</width>
<width>50</width>
<height>20</height>
</size>
</property>
@ -3275,13 +3275,13 @@ QPushButton[state=&quot;ok&quot;] {
</action>
<action name="actionFox_Log">
<property name="text">
<string>Fox Log</string>
<string>Fox or Contest Log</string>
</property>
<property name="iconText">
<string>Fox Log</string>
<string>Fox or Contest Log</string>
</property>
<property name="toolTip">
<string>Fox Log</string>
<string>Fox or Contest Log</string>
</property>
</action>
<action name="actionErase_FoxQSO_txt">
@ -3304,6 +3304,11 @@ QPushButton[state=&quot;ok&quot;] {
<string>Color highlighting scheme</string>
</property>
</action>
<action name="actionContest_Log">
<property name="text">
<string>Contest Log</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>

View File

@ -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,12 +90,19 @@ void MessageAveraging::displayAvg(QString const& t)
ui->msgAvgPlainTextEdit->setPlainText(t);
}
void MessageAveraging::foxLogSetup()
void MessageAveraging::foxLogSetup(int nContest)
{
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)
{

View File

@ -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);