2020-02-21 11:05:07 +02:00
# include "logqso.h"
# include <QTcpSocket>
# include <QString>
# include <QSettings>
# include <QStandardPaths>
# include <QDir>
# include <QDebug>
2020-04-06 23:35:48 +03:00
2020-04-08 08:42:11 +03:00
# include "JTDXMessageBox.hpp"
2020-02-21 11:05:07 +02:00
# include "logbook/adif.h"
# include "Configuration.hpp"
# include "Bands.hpp"
# include "ui_logqso.h"
# include "moc_logqso.cpp"
2020-04-11 13:39:03 +03:00
LogQSO : : LogQSO ( QSettings * settings , Configuration const * config , JTDXDateTime * jtdxtime , QWidget * parent )
2020-02-21 11:05:07 +02:00
: QDialog ( parent )
, ui ( new Ui : : LogQSO )
, m_settings ( settings )
, m_config { config }
2020-04-11 13:39:03 +03:00
, m_jtdxtime { jtdxtime }
2020-02-21 11:05:07 +02:00
{
ui - > setupUi ( this ) ;
2020-03-21 23:16:03 +02:00
ui - > buttonBox - > button ( QDialogButtonBox : : Ok ) - > setText ( tr ( " &OK " ) ) ;
ui - > buttonBox - > button ( QDialogButtonBox : : Cancel ) - > setText ( tr ( " &Cancel " ) ) ;
2020-02-21 11:05:07 +02:00
// 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 ,
2020-12-15 16:44:09 +03:00
QString const & rptSent , QString const & rptRcvd , QString const & distance ,
QString const & name , QDateTime const & dateTimeOn , QDateTime const & dateTimeOff ,
2020-02-21 11:05:07 +02:00
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 ) ;
2021-01-06 21:47:06 +03:00
QString t = " " ;
2020-02-21 11:05:07 +02:00
if ( m_config - > report_in_comments ( ) ) {
2021-01-06 21:47:06 +03:00
t = mode ;
2020-02-21 11:05:07 +02:00
if ( rptSent ! = " " ) t + = " Sent: " + rptSent ;
if ( rptRcvd ! = " " ) t + = " Rcvd: " + rptRcvd ;
ui - > comments - > setText ( t ) ;
}
2020-12-15 16:44:09 +03:00
if ( m_config - > distance_in_comments ( ) ) {
if ( t . isEmpty ( ) ) t = " Distance: " + distance ;
else t + = " Distance: " + distance ;
ui - > comments - > setText ( t ) ;
}
2020-02-21 11:05:07 +02:00
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 ( )
{
2020-07-16 10:48:18 +03:00
QString hisCall , hisGrid , mode , rptSent , rptRcvd , time , band ;
2020-02-21 11:05:07 +02:00
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 ) )
{
2020-04-08 08:42:11 +03:00
JTDXMessageBox : : information_message ( 0 , " " , " Cannot open file \" " + adifilePath + " \" . " ) ;
2020-02-21 11:05:07 +02:00
}
//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 ) ) {
2020-04-08 08:42:11 +03:00
JTDXMessageBox : : information_message ( 0 , " " , " Cannot open file \" " + f . fileName ( ) + " \" for append: " + f . errorString ( ) ) ;
2020-02-21 11:05:07 +02:00
} 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 ) ;
2020-10-20 14:16:01 +03:00
out < < logEntry < <
# if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
endl ;
# else
Qt : : endl ;
# endif
2020-02-21 11:05:07 +02:00
f . close ( ) ;
}
//Clean up and finish logging
QString myadif ;
QByteArray myadif2 ;
myadif = " <BAND: " + QString : : number ( band . length ( ) ) + " > " + band ;
2021-12-22 18:33:38 +03:00
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 ;
}
2020-02-21 11:05:07 +02:00
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 " ) ;
2020-05-07 10:58:56 +03:00
myadif + = " <QSO_DATE_OFF:8> " + m_dateTimeOff . date ( ) . toString ( " yyyyMMdd " ) ;
myadif + = " <TIME_OFF:6> " + m_dateTimeOff . time ( ) . toString ( " hhmmss " ) ;
2020-02-21 11:05:07 +02:00
myadif + = " <RST_SENT: " + QString : : number ( rptSent . length ( ) ) + " > " + rptSent ;
myadif + = " <RST_RCVD: " + QString : : number ( rptRcvd . length ( ) ) + " > " + rptRcvd ;
2020-10-20 07:47:53 +03:00
if ( m_txPower . length ( ) > 0 ) {
myadif + = " <TX_PWR: " + QString : : number ( m_txPower . length ( ) ) + " > " + m_txPower ;
}
2020-02-21 11:05:07 +02:00
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 ) {
2020-07-16 10:48:18 +03:00
myadif + = " <EQSL_QSL_SENT:1>Y <EQSL_QSLSDATE:8> " + m_jtdxtime - > currentDateTimeUtc2 ( ) . toString ( " yyyyMMdd " ) ;
2020-02-21 11:05:07 +02:00
}
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 {
2020-04-08 08:42:11 +03:00
JTDXMessageBox : : warning_message ( 0 , " " , " File Open Error "
2020-02-21 11:05:07 +02:00
, tr ( " Cannot open \" %1 \" for append: %2 " )
. arg ( f2 . fileName ( ) ) . arg ( f2 . errorString ( ) ) ) ;
}
}
2020-10-20 14:16:01 +03:00
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
}
2020-02-21 11:05:07 +02:00
socket . connectToHost ( m_tcp_server_name , m_tcp_server_port ) ;
if ( socket . waitForConnected ( 1000 ) ) {
socket . write ( myadif2 ) ;
2020-10-20 14:16:01 +03:00
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
}
2020-02-21 11:05:07 +02:00
if ( socket . waitForReadyRead ( 1000 ) ) {
myadif2 = socket . readAll ( ) ;
2020-10-20 14:16:01 +03:00
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
}
2020-02-21 11:05:07 +02:00
if ( myadif2 . left ( 3 ) = = " NAK " ) {
2020-04-08 08:42:11 +03:00
JTDXMessageBox : : critical_message ( 0 , " " , myadif2 + " QSO data rejected by external software " ) ;
2020-02-21 11:05:07 +02:00
}
} else {
2020-10-20 14:16:01 +03:00
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
}
2020-02-21 11:05:07 +02:00
}
socket . close ( ) ;
} else {
2020-10-20 14:16:01 +03:00
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
}
2020-04-08 08:42:11 +03:00
JTDXMessageBox : : critical_message ( 0 , " " , " TCP QSO data transfer: " + socket . errorString ( ) ) ;
2020-02-21 11:05:07 +02:00
}
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 ) ;
}