172 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			6.1 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 "MaidenheadLocatorValidator.hpp"
 | |
| 
 | |
| #include "ui_logqso.h"
 | |
| #include "moc_logqso.cpp"
 | |
| 
 | |
| LogQSO::LogQSO(QString const& programTitle, QSettings * settings
 | |
|                , Configuration const * config, QWidget *parent)
 | |
|   : QDialog {parent, Qt::WindowStaysOnTopHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint}
 | |
|   , ui(new Ui::LogQSO)
 | |
|   , m_settings (settings)
 | |
|   , m_config {config}
 | |
| {
 | |
|   ui->setupUi(this);
 | |
|   setWindowTitle(programTitle + " - Log QSO");
 | |
|   loadSettings ();
 | |
|   ui->grid->setValidator (new MaidenheadLocatorValidator {this});
 | |
| }
 | |
| 
 | |
| 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 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(toRTTY) mode="DATA";
 | |
|   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 "ft8call_log.adi"
 | |
|   QString filename = "ft8call_log.adi";  // TODO allow user to set
 | |
|   ADIF adifile;
 | |
|   auto adifilePath = QDir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}.absoluteFilePath ("ft8call_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 "ft8call.log"
 | |
|   static QFile f {QDir {QStandardPaths::writableLocation (QStandardPaths::DataLocation)}.absoluteFilePath ("ft8call.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);
 | |
| }
 | 
