mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-12 23:26:15 -05:00
3c384f7cbb
When "Auto Grid" is checked in "Settings->General" UDP messages of type "Location" will update a temporary DE grid square. The intent is to allow an external application joining the WSJT-X UDP message protocol to dynamically update the DE grid during mobile operation. This change also tidies up some outstanding issues around logging the operator call. This change adds a new UDP message "Logged ADIF" that is emitted in parallel with "QSO Logged" messages. The new message is valid ADIF file format and contains the logged QSO fields. The intent is that basic UDP server applications might already have ADIF log record capture capabilities and could use this message to feed existing ADIF parsing routines to log QSOs. All that should be needed is to identify this message type and the single field is ADIF compatible ASCII. Thanks to Brian, N9ADG, for the patches that lead to these enhancements. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@8454 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
171 lines
6.0 KiB
C++
171 lines
6.0 KiB
C++
#include "logqso.h"
|
|
|
|
#include <QString>
|
|
#include <QSettings>
|
|
#include <QStandardPaths>
|
|
#include <QDir>
|
|
#include <QDebug>
|
|
#include <QUdpSocket>
|
|
|
|
#include "logbook/adif.h"
|
|
#include "MessageBox.hpp"
|
|
#include "Configuration.hpp"
|
|
#include "Bands.hpp"
|
|
|
|
#include "ui_logqso.h"
|
|
#include "moc_logqso.cpp"
|
|
|
|
LogQSO::LogQSO(QString const& programTitle, QSettings * settings
|
|
, Configuration const * config, QWidget *parent)
|
|
: QDialog(parent)
|
|
, ui(new Ui::LogQSO)
|
|
, m_settings (settings)
|
|
, m_config {config}
|
|
{
|
|
ui->setupUi(this);
|
|
setWindowTitle(programTitle + " - Log QSO");
|
|
loadSettings ();
|
|
}
|
|
|
|
LogQSO::~LogQSO ()
|
|
{
|
|
}
|
|
|
|
void LogQSO::loadSettings ()
|
|
{
|
|
m_settings->beginGroup ("LogQSO");
|
|
restoreGeometry (m_settings->value ("geometry", saveGeometry ()).toByteArray ());
|
|
ui->cbTxPower->setChecked (m_settings->value ("SaveTxPower", false).toBool ());
|
|
ui->cbComments->setChecked (m_settings->value ("SaveComments", false).toBool ());
|
|
m_txPower = m_settings->value ("TxPower", "").toString ();
|
|
m_comments = m_settings->value ("LogComments", "").toString();
|
|
m_settings->endGroup ();
|
|
}
|
|
|
|
void LogQSO::storeSettings () const
|
|
{
|
|
m_settings->beginGroup ("LogQSO");
|
|
m_settings->setValue ("geometry", saveGeometry ());
|
|
m_settings->setValue ("SaveTxPower", ui->cbTxPower->isChecked ());
|
|
m_settings->setValue ("SaveComments", ui->cbComments->isChecked ());
|
|
m_settings->setValue ("TxPower", m_txPower);
|
|
m_settings->setValue ("LogComments", m_comments);
|
|
m_settings->endGroup ();
|
|
}
|
|
|
|
void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString mode,
|
|
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)
|
|
{
|
|
if(!isHidden()) return;
|
|
ui->call->setText(hisCall);
|
|
ui->grid->setText(hisGrid);
|
|
ui->name->setText("");
|
|
ui->txPower->setText("");
|
|
ui->comments->setText("");
|
|
if (ui->cbTxPower->isChecked ()) ui->txPower->setText(m_txPower);
|
|
if (ui->cbComments->isChecked ()) ui->comments->setText(m_comments);
|
|
if(dBtoComments) {
|
|
QString t=mode;
|
|
if(rptSent!="") t+=" Sent: " + rptSent;
|
|
if(rptRcvd!="") t+=" Rcvd: " + rptRcvd;
|
|
ui->comments->setText(t);
|
|
}
|
|
if(noSuffix and mode.mid(0,3)=="JT9") mode="JT9";
|
|
if(toRTTY and mode.mid(0,3)=="JT9") mode="RTTY";
|
|
ui->mode->setText(mode);
|
|
ui->sent->setText(rptSent);
|
|
ui->rcvd->setText(rptRcvd);
|
|
ui->start_date_time->setDateTime (dateTimeOn);
|
|
ui->end_date_time->setDateTime (dateTimeOff);
|
|
m_dialFreq=dialFreq;
|
|
m_myCall=myCall;
|
|
m_myGrid=myGrid;
|
|
ui->band->setText (m_config->bands ()->find (dialFreq));
|
|
ui->loggedOperator->setText(opCall);
|
|
if(bFox) {
|
|
accept();
|
|
} else {
|
|
show ();
|
|
}
|
|
}
|
|
|
|
void LogQSO::accept()
|
|
{
|
|
QString hisCall,hisGrid,mode,rptSent,rptRcvd,dateOn,dateOff,timeOn,timeOff,band,operator_call;
|
|
QString comments,name;
|
|
|
|
hisCall=ui->call->text();
|
|
hisGrid=ui->grid->text();
|
|
mode=ui->mode->text();
|
|
rptSent=ui->sent->text();
|
|
rptRcvd=ui->rcvd->text();
|
|
m_dateTimeOn = ui->start_date_time->dateTime ();
|
|
m_dateTimeOff = ui->end_date_time->dateTime ();
|
|
band=ui->band->text();
|
|
name=ui->name->text();
|
|
m_txPower=ui->txPower->text();
|
|
comments=ui->comments->text();
|
|
m_comments=comments;
|
|
QString strDialFreq(QString::number(m_dialFreq / 1.e6,'f',6));
|
|
operator_call = ui->loggedOperator->text();
|
|
//Log this QSO to ADIF file "wsjtx_log.adi"
|
|
QString filename = "wsjtx_log.adi"; // TODO allow user to set
|
|
ADIF adifile;
|
|
auto adifilePath = QDir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}.absoluteFilePath ("wsjtx_log.adi");
|
|
adifile.init(adifilePath);
|
|
|
|
QByteArray ADIF {adifile.QSOToADIF (hisCall, hisGrid, mode, rptSent, rptRcvd, m_dateTimeOn, m_dateTimeOff, band
|
|
, comments, name, strDialFreq, m_myCall, m_myGrid, m_txPower, operator_call)};
|
|
if (!adifile.addQSOToFile (ADIF))
|
|
{
|
|
MessageBox::warning_message (this, tr ("Log file error"),
|
|
tr ("Cannot open \"%1\"").arg (adifilePath));
|
|
}
|
|
|
|
// Log to N1MM Logger
|
|
if (m_config->broadcast_to_n1mm() && m_config->valid_n1mm_info()) {
|
|
const QHostAddress n1mmhost = QHostAddress(m_config->n1mm_server_name());
|
|
QUdpSocket _sock;
|
|
auto rzult = _sock.writeDatagram (ADIF + " <eor>", n1mmhost, quint16(m_config->n1mm_server_port()));
|
|
if (rzult == -1) {
|
|
MessageBox::warning_message (this, tr ("Error sending log to N1MM"),
|
|
tr ("Write returned \"%1\"").arg (rzult));
|
|
}
|
|
}
|
|
|
|
//Log this QSO to file "wsjtx.log"
|
|
static QFile f {QDir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}.absoluteFilePath ("wsjtx.log")};
|
|
if(!f.open(QIODevice::Text | QIODevice::Append)) {
|
|
MessageBox::warning_message (this, tr ("Log file error"),
|
|
tr ("Cannot open \"%1\" for append").arg (f.fileName ()),
|
|
tr ("Error: %1").arg (f.errorString ()));
|
|
} else {
|
|
QString logEntry=m_dateTimeOn.date().toString("yyyy-MM-dd,") +
|
|
m_dateTimeOn.time().toString("hh:mm:ss,") +
|
|
m_dateTimeOff.date().toString("yyyy-MM-dd,") +
|
|
m_dateTimeOff.time().toString("hh:mm:ss,") + hisCall + "," +
|
|
hisGrid + "," + strDialFreq + "," + mode +
|
|
"," + rptSent + "," + rptRcvd + "," + m_txPower +
|
|
"," + comments + "," + name;
|
|
QTextStream out(&f);
|
|
out << logEntry << endl;
|
|
f.close();
|
|
}
|
|
|
|
//Clean up and finish logging
|
|
Q_EMIT acceptQSO (m_dateTimeOff, hisCall, hisGrid, m_dialFreq, mode, rptSent, rptRcvd, m_txPower, comments, name,m_dateTimeOn, operator_call, m_myCall, m_myGrid, ADIF);
|
|
QDialog::accept();
|
|
}
|
|
|
|
// closeEvent is only called from the system menu close widget for a
|
|
// modeless dialog so we use the hideEvent override to store the
|
|
// window settings
|
|
void LogQSO::hideEvent (QHideEvent * e)
|
|
{
|
|
storeSettings ();
|
|
QDialog::hideEvent (e);
|
|
}
|