mirror of
https://github.com/jtdx-project/jtdx
synced 2026-08-13 17:35:38 -04:00
287 lines
11 KiB
C++
287 lines
11 KiB
C++
#include "logqso.h"
|
|
|
|
#include <QTcpSocket>
|
|
#include <QString>
|
|
#include <QSettings>
|
|
#include <QStandardPaths>
|
|
#include <QDir>
|
|
#include <QDebug>
|
|
|
|
#include "JTDXMessageBox.hpp"
|
|
|
|
#include "logbook/adif.h"
|
|
#include "Configuration.hpp"
|
|
#include "Bands.hpp"
|
|
|
|
#include "ui_logqso.h"
|
|
#include "moc_logqso.cpp"
|
|
|
|
LogQSO::LogQSO(QSettings * settings, Configuration const * config, JTDXDateTime * jtdxtime, QWidget *parent)
|
|
: QDialog(parent)
|
|
, ui(new Ui::LogQSO)
|
|
, m_settings (settings)
|
|
, m_config {config}
|
|
, m_jtdxtime {jtdxtime}
|
|
{
|
|
ui->setupUi(this);
|
|
ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("&OK"));
|
|
ui->buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("&Cancel"));
|
|
// setWindowTitle("JTDX " + versnumber.simplified () + " - Log QSO");
|
|
setWindowTitle(QCoreApplication::applicationName () + " v" + QCoreApplication::applicationVersion () + " - 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 ());
|
|
ui->cbEqslComments->setChecked (m_settings->value ("SaveEQSLComments", false).toBool ());
|
|
m_txPower = m_settings->value ("TxPower", "").toString ();
|
|
m_comments = m_settings->value ("LogComments", "").toString();
|
|
m_eqslcomments = m_settings->value ("LogEQSLComments", "").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 ("SaveEQSLComments", ui->cbEqslComments->isChecked ());
|
|
m_settings->setValue ("TxPower", m_txPower);
|
|
m_settings->setValue ("LogComments", m_comments);
|
|
m_settings->setValue ("LogEQSLComments", m_eqslcomments);
|
|
m_settings->endGroup ();
|
|
}
|
|
|
|
void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString mode,
|
|
QString const& rptSent, QString const& rptRcvd, QString const& distance,
|
|
QString const& name, QDateTime const& dateTimeOn, QDateTime const& dateTimeOff,
|
|
Radio::Frequency dialFreq, bool autologging)
|
|
{
|
|
m_send_to_eqsl=m_config->send_to_eqsl();
|
|
ui->call->setText(hisCall);
|
|
ui->grid->setText(hisGrid);
|
|
ui->name->setText(name);
|
|
ui->txPower->setText("");
|
|
ui->comments->setText("");
|
|
ui->eqslcomments->setText("");
|
|
ui->lab11->setVisible(m_send_to_eqsl);
|
|
ui->eqslcomments->setVisible(m_send_to_eqsl);
|
|
ui->cbEqslComments->setVisible(m_send_to_eqsl);
|
|
if (ui->cbTxPower->isChecked ()) ui->txPower->setText(m_txPower);
|
|
if (ui->cbComments->isChecked ()) ui->comments->setText(m_comments);
|
|
if (ui->cbEqslComments->isChecked ()) ui->eqslcomments->setText(m_eqslcomments);
|
|
QString t="";
|
|
if(m_config->report_in_comments()) {
|
|
t=mode;
|
|
if(rptSent!="") t+=" Sent: " + rptSent;
|
|
if(rptRcvd!="") t+=" Rcvd: " + rptRcvd;
|
|
ui->comments->setText(t);
|
|
}
|
|
if(m_config->distance_in_comments()) {
|
|
if(t.isEmpty()) t="Distance: " + distance;
|
|
else t+=" Distance: " + distance;
|
|
ui->comments->setText(t);
|
|
}
|
|
if(m_config->log_as_RTTY() and mode.left(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=m_config->my_callsign();
|
|
m_myGrid=m_config->my_grid();
|
|
m_tcp_server_name=m_config->tcp_server_name();
|
|
m_tcp_server_port=m_config->tcp_server_port();
|
|
m_enable_tcp_connection=m_config->enable_tcp_connection();
|
|
m_debug=m_config->write_decoded_debug();
|
|
ui->band->setText(m_config->bands ()->find (dialFreq));
|
|
|
|
if(!autologging) {
|
|
show ();
|
|
}
|
|
else {
|
|
accept();
|
|
}
|
|
}
|
|
|
|
void LogQSO::accept()
|
|
{
|
|
QString hisCall,hisGrid,mode,rptSent,rptRcvd,time,band;
|
|
QString comments,eqslcomments,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;
|
|
eqslcomments=ui->eqslcomments->text();
|
|
m_eqslcomments=eqslcomments;
|
|
QString strDialFreq(QString::number(m_dialFreq / 1.e6,'f',6));
|
|
|
|
//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);
|
|
if (!adifile.addQSOToFile(hisCall,hisGrid,mode,rptSent,rptRcvd,m_dateTimeOn,m_dateTimeOff,band,comments,name,strDialFreq,m_myCall,m_myGrid,m_txPower,m_send_to_eqsl))
|
|
{
|
|
JTDXMessageBox::information_message(0,"","Cannot open file \"" + adifilePath + "\".");
|
|
}
|
|
|
|
//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)) {
|
|
JTDXMessageBox::information_message(0,"","Cannot open file \"" + f.fileName () + "\" for append:" + 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 <<
|
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
|
endl;
|
|
#else
|
|
Qt::endl;
|
|
#endif
|
|
|
|
f.close();
|
|
}
|
|
|
|
//Clean up and finish logging
|
|
QString myadif;
|
|
QByteArray myadif2;
|
|
myadif="<BAND:" + QString::number(band.length()) + ">" + band;
|
|
myadif+=" <STATION_CALLSIGN:" + QString::number(m_myCall.length()) + ">" + m_myCall;
|
|
if (m_myGrid.length() > 7) {
|
|
myadif+=" <MY_GRIDSQUARE:8>" + m_myGrid.left(8);
|
|
}
|
|
else if (m_myGrid.length() > 3) {
|
|
myadif+=" <MY_GRIDSQUARE:" + QString::number(m_myGrid.length()) + ">" + m_myGrid;
|
|
}
|
|
myadif+=" <CALL:" + QString::number(hisCall.length()) + ">" + hisCall;
|
|
myadif+=" <FREQ:" + QString::number(strDialFreq.length()) + ">" + strDialFreq;
|
|
if (mode == "FT4") myadif+=" <MODE:4>MFSK <SUBMODE:" + QString::number(mode.length()) + ">" + mode;
|
|
else myadif+=" <MODE:" + QString::number(mode.length()) + ">" + mode;
|
|
myadif+=" <QSO_DATE:8>" + m_dateTimeOn.date().toString("yyyyMMdd");
|
|
myadif+=" <TIME_ON:6>" + m_dateTimeOn.time().toString("hhmmss");
|
|
myadif+=" <QSO_DATE_OFF:8>" + m_dateTimeOff.date().toString("yyyyMMdd");
|
|
myadif+=" <TIME_OFF:6>" + m_dateTimeOff.time().toString("hhmmss");
|
|
myadif+=" <RST_SENT:" + QString::number(rptSent.length()) + ">" + rptSent;
|
|
myadif+=" <RST_RCVD:" + QString::number(rptRcvd.length()) + ">" + rptRcvd;
|
|
if (m_txPower.length() >0) {
|
|
myadif+=" <TX_PWR:" + QString::number(m_txPower.length()) + ">" + m_txPower;
|
|
}
|
|
if (hisGrid.length() > 3) {
|
|
myadif+=" <GRIDSQUARE:" + QString::number(hisGrid.length()) + ">" + hisGrid;
|
|
}
|
|
if (name.length() > 0) {
|
|
myadif+=" <NAME:" + QString::number(name.length()) + ">" + name;
|
|
}
|
|
if (comments.length() > 0) {
|
|
myadif+=" <COMMENT:" + QString::number(comments.length()) + ">" + comments;
|
|
}
|
|
if (m_send_to_eqsl) {
|
|
myadif+=" <EQSL_QSL_SENT:1>Y <EQSL_QSLSDATE:8>" + m_jtdxtime->currentDateTimeUtc2().toString("yyyyMMdd");
|
|
}
|
|
myadif+=" <EOR> ";
|
|
myadif2 = myadif.trimmed().toUtf8();
|
|
|
|
Q_EMIT acceptQSO (m_dateTimeOff, hisCall, hisGrid, m_dialFreq, mode, rptSent, rptRcvd, m_txPower, comments, name, m_dateTimeOn, eqslcomments, myadif2);
|
|
|
|
myadif="<command:3>Log <parameters:" + QString::number(myadif.length()) + "> " + myadif;
|
|
myadif2 = myadif.toUtf8();
|
|
if (m_enable_tcp_connection){
|
|
QTcpSocket socket;
|
|
static QFile f2 {QDir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}.absoluteFilePath ("tcptrace.txt")};
|
|
bool fopen = false;
|
|
if(m_debug) {
|
|
if(f2.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) fopen = true;
|
|
else {
|
|
JTDXMessageBox::warning_message (0, "", " File Open Error "
|
|
, tr ("Cannot open \"%1\" for append: %2")
|
|
.arg (f2.fileName ()).arg (f2.errorString ()));
|
|
}
|
|
}
|
|
if(fopen) { QTextStream out2(&f2); out2 << m_jtdxtime->currentDateTimeUtc2().toString("yyyyMMdd_hhmmss.zzz") << "(" << m_jtdxtime->GetOffset() << ")" << " Connecting to " << m_tcp_server_name << ":" << m_tcp_server_port <<
|
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
|
endl;
|
|
#else
|
|
Qt::endl;
|
|
#endif
|
|
}
|
|
socket.connectToHost(m_tcp_server_name, m_tcp_server_port);
|
|
if (socket.waitForConnected(1000)) {
|
|
socket.write(myadif2);
|
|
if(fopen) { QTextStream out2(&f2); out2 << m_jtdxtime->currentDateTimeUtc2().toString("yyyyMMdd_hhmmss.zzz") << "(" << m_jtdxtime->GetOffset() << ")" << " Host connected, sent message: " << myadif2 <<
|
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
|
endl;
|
|
#else
|
|
Qt::endl;
|
|
#endif
|
|
}
|
|
if (socket.waitForReadyRead(1000)){
|
|
myadif2 = socket.readAll();
|
|
if(fopen) { QTextStream out2(&f2); out2 << m_jtdxtime->currentDateTimeUtc2().toString("yyyyMMdd_hhmmss.zzz") << "(" << m_jtdxtime->GetOffset() << ")" << " Received response from host: " << myadif2 <<
|
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
|
endl;
|
|
#else
|
|
Qt::endl;
|
|
#endif
|
|
}
|
|
if (myadif2.left(3) == "NAK") {
|
|
JTDXMessageBox::critical_message(0, "",myadif2 + " QSO data rejected by external software");
|
|
}
|
|
} else {
|
|
if(fopen) { QTextStream out2(&f2); out2 << m_jtdxtime->currentDateTimeUtc2().toString("yyyyMMdd_hhmmss.zzz") << "(" << m_jtdxtime->GetOffset() << ")" << " Getting response from host is timed out" <<
|
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
|
endl;
|
|
#else
|
|
Qt::endl;
|
|
#endif
|
|
}
|
|
}
|
|
socket.close();
|
|
} else {
|
|
if(fopen) { QTextStream out2(&f2); out2 << m_jtdxtime->currentDateTimeUtc2().toString("yyyyMMdd_hhmmss.zzz") << "(" << m_jtdxtime->GetOffset() << ")" << " Host connection timed out" <<
|
|
#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
|
|
endl;
|
|
#else
|
|
Qt::endl;
|
|
#endif
|
|
}
|
|
JTDXMessageBox::critical_message(0, "", "TCP QSO data transfer: " + socket.errorString());
|
|
}
|
|
if(fopen) f2.close();
|
|
}
|
|
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);
|
|
}
|