Implemented basic logging of additional fields support based on ADIF

This commit is contained in:
Jordan Sherer 2019-06-04 17:05:33 -04:00
parent ae6dccc183
commit 38ab24ba79
5 changed files with 294 additions and 15 deletions

View File

@ -5,6 +5,164 @@
#include <QDateTime> #include <QDateTime>
#include <QDebug> #include <QDebug>
const QStringList ADIF_FIELDS = {
// ADIF 3.1.0 - pulled from http://www.adif.org/310/adx310.xsd on 2019-06-04
"USERDEF",
"APP",
"ADDRESS",
"ADDRESS_INTL",
"AGE",
"A_INDEX",
"ANT_AZ",
"ANT_EL",
"ANT_PATH",
"ARRL_SECT",
"AWARD_SUBMITTED",
"AWARD_GRANTED",
"BAND",
"BAND_RX",
"CALL",
"CHECK",
"CLASS",
"CLUBLOG_QSO_UPLOAD_DATE",
"CLUBLOG_QSO_UPLOAD_STATUS",
"CNTY",
"COMMENT",
"COMMENT_INTL",
"CONT",
"CONTACTED_OP",
"CONTEST_ID",
"COUNTRY",
"COUNTRY_INTL",
"CQZ",
"CREDIT_SUBMITTED",
"CREDIT_GRANTED",
"DARC_DOK",
"DISTANCE",
"DXCC",
"EMAIL",
"EQ_CALL",
"EQSL_QSLRDATE",
"EQSL_QSLSDATE",
"EQSL_QSL_RCVD",
"EQSL_QSL_SENT",
"FISTS",
"FISTS_CC",
"FORCE_INIT",
"FREQ",
"FREQ_RX",
"GRIDSQUARE",
"GUEST_OP",
"HRDLOG_QSO_UPLOAD_DATE",
"HRDLOG_QSO_UPLOAD_STATUS",
"IOTA",
"IOTA_ISLAND_ID",
"ITUZ",
"K_INDEX",
"LAT",
"LON",
"LOTW_QSLRDATE",
"LOTW_QSLSDATE",
"LOTW_QSL_RCVD",
"LOTW_QSL_SENT",
"MAX_BURSTS",
"MODE",
"MS_SHOWER",
"MY_ANTENNA",
"MY_ANTENNA_INTL",
"MY_CITY",
"MY_CITY_INTL",
"MY_CNTY",
"MY_COUNTRY",
"MY_COUNTRY_INTL",
"MY_CQ_ZONE",
"MY_DXCC",
"MY_FISTS",
"MY_GRIDSQUARE",
"MY_IOTA",
"MY_IOTA_ISLAND_ID",
"MY_ITU_ZONE",
"MY_LAT",
"MY_LON",
"MY_NAME",
"MY_NAME_INTL",
"MY_POSTAL_CODE",
"MY_POSTAL_CODE_INTL",
"MY_RIG",
"MY_RIG_INTL",
"MY_SIG",
"MY_SIG_INTL",
"MY_SIG_INFO",
"MY_SIG_INFO_INTL",
"MY_SOTA_REF",
"MY_STATE",
"MY_STREET",
"MY_STREET_INTL",
"MY_USACA_COUNTIES",
"MY_VUCC_GRIDS",
"NAME",
"NAME_INTL",
"NOTES",
"NOTES_INTL",
"NR_BURSTS",
"NR_PINGS",
"OPERATOR",
"OWNER_CALLSIGN",
"PFX",
"PRECEDENCE",
"PROP_MODE",
"PUBLIC_KEY",
"QRZCOM_QSO_UPLOAD_DATE",
"QRZCOM_QSO_UPLOAD_STATUS",
"QSLMSG",
"QSLMSG_INTL",
"QSLRDATE",
"QSLSDATE",
"QSL_RCVD",
"QSL_RCVD_VIA",
"QSL_SENT",
"QSL_SENT_VIA",
"QSL_VIA",
"QSO_COMPLETE",
"QSO_DATE",
"QSO_DATE_OFF",
"QSO_RANDOM",
"QTH",
"QTH_INTL",
"REGION",
"RIG",
"RIG_INTL",
"RST_RCVD",
"RST_SENT",
"RX_PWR",
"SAT_MODE",
"SAT_NAME",
"SFI",
"SIG",
"SIG_INTL",
"SIG_INFO",
"SIG_INFO_INTL",
"SILENT_KEY",
"SKCC",
"SOTA_REF",
"SRX",
"SRX_STRING",
"STATE",
"STATION_CALLSIGN",
"STX",
"STX_STRING",
"SUBMODE",
"SWL",
"TEN_TEN",
"TIME_OFF",
"TIME_ON",
"TX_PWR",
"UKSMG",
"USACA_COUNTIES",
"VUCC_GRIDS",
"WEB",
};
/* /*
<CALL:4>W1XT<BAND:3>20m<FREQ:6>14.076<GRIDSQUARE:4>DM33<MODE:4>JT65<RST_RCVD:3>-21<RST_SENT:3>-14<QSO_DATE:8>20110422<TIME_ON:6>041712<TIME_OFF:6>042435<TX_PWR:1>4<COMMENT:34>1st JT65A QSO. Him: mag loop 20W<STATION_CALLSIGN:6>VK3ACF<MY_GRIDSQUARE:6>qf22lb<eor> <CALL:4>W1XT<BAND:3>20m<FREQ:6>14.076<GRIDSQUARE:4>DM33<MODE:4>JT65<RST_RCVD:3>-21<RST_SENT:3>-14<QSO_DATE:8>20110422<TIME_ON:6>041712<TIME_OFF:6>042435<TX_PWR:1>4<COMMENT:34>1st JT65A QSO. Him: mag loop 20W<STATION_CALLSIGN:6>VK3ACF<MY_GRIDSQUARE:6>qf22lb<eor>
<CALL:6>IK1SOW<BAND:3>20m<FREQ:6>14.076<GRIDSQUARE:4>JN35<MODE:4>JT65<RST_RCVD:3>-19<RST_SENT:3>-11<QSO_DATE:8>20110422<TIME_ON:6>052501<TIME_OFF:6>053359<TX_PWR:1>3<STATION_CALLSIGN:6>VK3ACF<MY_GRIDSQUARE:6>qf22lb<eor> <CALL:6>IK1SOW<BAND:3>20m<FREQ:6>14.076<GRIDSQUARE:4>JN35<MODE:4>JT65<RST_RCVD:3>-19<RST_SENT:3>-11<QSO_DATE:8>20110422<TIME_ON:6>052501<TIME_OFF:6>053359<TX_PWR:1>3<STATION_CALLSIGN:6>VK3ACF<MY_GRIDSQUARE:6>qf22lb<eor>

View File

@ -11,6 +11,7 @@
#if defined (QT5) #if defined (QT5)
#include <QList> #include <QList>
#include <QString> #include <QString>
#include <QStringList>
#include <QMultiHash> #include <QMultiHash>
#else #else
#include <QtGui> #include <QtGui>
@ -18,6 +19,8 @@
class QDateTime; class QDateTime;
extern const QStringList ADIF_FIELDS;
class ADIF class ADIF
{ {
public: public:
@ -35,18 +38,17 @@ class ADIF
// open ADIF file and append the QSO details. Return true on success // open ADIF file and append the QSO details. Return true on success
bool addQSOToFile(QByteArray const& ADIF_record); bool addQSOToFile(QByteArray const& ADIF_record);
QByteArray QSOToADIF(QString const& hisCall, QString const& hisGrid, QString const& mode, QString const& submode, QString const& rptSent QByteArray QSOToADIF(QString const& hisCall, QString const& hisGrid, QString const& mode, QString const& submode, QString const& rptSent
, QString const& rptRcvd, QDateTime const& dateTimeOn, QDateTime const& dateTimeOff , QString const& rptRcvd, QDateTime const& dateTimeOn, QDateTime const& dateTimeOff
, QString const& band, QString const& comments, QString const& name , QString const& band, QString const& comments, QString const& name
, QString const& strDialFreq, QString const& m_myCall, QString const& m_myGrid , QString const& strDialFreq, QString const& m_myCall, QString const& m_myGrid
, QString const& operator_call); , QString const& operator_call);
struct QSO
struct QSO {
{ QString call,band,mode,submode,date,name,comment;
QString call,band,mode,submode,date,name,comment; };
};
private: private:
QMultiHash<QString, QSO> _data; QMultiHash<QString, QSO> _data;

View File

@ -26,7 +26,6 @@ LogQSO::LogQSO(QString const& programTitle, QSettings * settings
{ {
ui->setupUi(this); ui->setupUi(this);
setWindowTitle(programTitle + " - Log QSO"); setWindowTitle(programTitle + " - Log QSO");
loadSettings ();
ui->grid->setValidator (new MaidenheadLocatorValidator {this}); ui->grid->setValidator (new MaidenheadLocatorValidator {this});
} }
@ -65,12 +64,61 @@ void LogQSO::on_end_now_button_pressed(){
ui->end_date_time->setDateTime(DriftingDateTime::currentDateTimeUtc()); ui->end_date_time->setDateTime(DriftingDateTime::currentDateTimeUtc());
} }
void LogQSO::on_add_new_field_button_pressed(){
createAdditionalField();
}
void LogQSO::createAdditionalField(QString key, QString value){
QLineEdit * l = new QLineEdit(this);
if(!value.isEmpty()){
l->setText(value);
}
QComboBox * c = new QComboBox(this);
c->insertItem(0, "");
c->insertItems(0, ADIF_FIELDS);
c->setEditable(false);
connect(c, &QComboBox::currentTextChanged, this, [this, l](const QString &text){
l->setProperty("fieldKey", QVariant(text));
});
if(!key.isEmpty()){
c->setCurrentText(key);
}
auto layout = static_cast<QFormLayout*>(ui->additionalFields->layout());
layout->removeItem(ui->field_button_layout);
layout->addRow(c, l);
layout->addItem(ui->field_button_layout);
m_additionalFieldsControls.append(l);
}
void LogQSO::resetAdditionalFields(){
if(m_additionalFieldsControls.isEmpty()){
return;
}
auto layout = static_cast<QFormLayout*>(ui->additionalFields->layout());
layout->removeItem(ui->field_button_layout);
for(int i = 0, count = layout->rowCount(); i < count; i++){
layout->removeRow(0);
}
layout->addItem(ui->field_button_layout);
m_additionalFieldsControls.clear();
}
void LogQSO::loadSettings () void LogQSO::loadSettings ()
{ {
m_settings->beginGroup ("LogQSO"); m_settings->beginGroup ("LogQSO");
restoreGeometry (m_settings->value ("geometry", saveGeometry ()).toByteArray ()); restoreGeometry (m_settings->value ("geometry", saveGeometry ()).toByteArray ());
ui->cbComments->setChecked (m_settings->value ("SaveComments", false).toBool ()); ui->cbComments->setChecked (m_settings->value ("SaveComments", false).toBool ());
m_comments = m_settings->value ("LogComments", "").toString(); m_comments = m_settings->value ("LogComments", "").toString();
resetAdditionalFields();
auto additionalFields = QSet<QString>::fromList(m_settings->value("AdditionalFields", {}).toStringList());
foreach(auto key, additionalFields){
createAdditionalField(key);
}
m_settings->endGroup (); m_settings->endGroup ();
} }
@ -80,6 +128,13 @@ void LogQSO::storeSettings () const
m_settings->setValue ("geometry", saveGeometry ()); m_settings->setValue ("geometry", saveGeometry ());
m_settings->setValue ("SaveComments", ui->cbComments->isChecked ()); m_settings->setValue ("SaveComments", ui->cbComments->isChecked ());
m_settings->setValue ("LogComments", m_comments); m_settings->setValue ("LogComments", m_comments);
auto additionalFields = QStringList{};
foreach(auto field, m_additionalFieldsControls){
additionalFields.append(field->property("fieldKey").toString());
}
m_settings->setValue ("AdditionalFields", additionalFields);
m_settings->endGroup (); m_settings->endGroup ();
} }
@ -90,32 +145,43 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString
bool toDATA, bool dBtoComments, bool bFox, QString const& opCall, QString const& comments) bool toDATA, bool dBtoComments, bool bFox, QString const& opCall, QString const& comments)
{ {
if(!isHidden()) return; if(!isHidden()) return;
loadSettings();
ui->call->setFocus(); ui->call->setFocus();
ui->call->setText(hisCall); ui->call->setText(hisCall);
ui->grid->setText(hisGrid); ui->grid->setText(hisGrid);
ui->name->setText(""); ui->name->setText("");
ui->comments->setText(""); ui->comments->setText("");
if (ui->cbComments->isChecked ()) ui->comments->setText(m_comments); if (ui->cbComments->isChecked ()) ui->comments->setText(m_comments);
if(dBtoComments) { if(dBtoComments) {
QString t=mode; QString t=mode;
if(rptSent!="") t+=" Sent: " + rptSent; if(rptSent!="") t+=" Sent: " + rptSent;
if(rptRcvd!="") t+=" Rcvd: " + rptRcvd; if(rptRcvd!="") t+=" Rcvd: " + rptRcvd;
ui->comments->setText(t); ui->comments->setText(t);
} }
if(!comments.isEmpty()){ if(!comments.isEmpty()){
ui->comments->setText(comments); ui->comments->setText(comments);
} }
if(toDATA) mode="DATA"; if(toDATA) mode="DATA";
ui->mode->setText(mode); ui->mode->setText(mode);
ui->sent->setText(rptSent); ui->sent->setText(rptSent);
ui->rcvd->setText(rptRcvd); ui->rcvd->setText(rptRcvd);
ui->start_date_time->setDateTime (dateTimeOn); ui->start_date_time->setDateTime (dateTimeOn);
ui->end_date_time->setDateTime (dateTimeOff); ui->end_date_time->setDateTime (dateTimeOff);
m_dialFreq=dialFreq; m_dialFreq=dialFreq;
m_myCall=myCall; m_myCall=myCall;
m_myGrid=myGrid; m_myGrid=myGrid;
ui->band->setText (m_config->bands ()->find (dialFreq)); ui->band->setText (m_config->bands ()->find (dialFreq));
ui->loggedOperator->setText(opCall); ui->loggedOperator->setText(opCall);
if(bFox) { if(bFox) {
accept(); accept();
} else { } else {

View File

@ -51,6 +51,9 @@ protected:
void hideEvent (QHideEvent *); void hideEvent (QHideEvent *);
private slots: private slots:
void createAdditionalField(QString key={}, QString value={});
void resetAdditionalFields();
void on_add_new_field_button_pressed();
void on_start_now_button_pressed(); void on_start_now_button_pressed();
void on_end_now_button_pressed(); void on_end_now_button_pressed();
@ -67,6 +70,7 @@ private:
QString m_myGrid; QString m_myGrid;
QDateTime m_dateTimeOn; QDateTime m_dateTimeOn;
QDateTime m_dateTimeOff; QDateTime m_dateTimeOff;
QList<QLineEdit*> m_additionalFieldsControls;
}; };
#endif // LogQSO_H #endif // LogQSO_H

View File

@ -42,8 +42,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>582</width> <width>568</width>
<height>401</height> <height>442</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
@ -54,7 +54,7 @@
<number>0</number> <number>0</number>
</property> </property>
<property name="rightMargin"> <property name="rightMargin">
<number>0</number> <number>9</number>
</property> </property>
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
@ -434,7 +434,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="8" column="0"> <item row="9" column="0">
<widget class="QLabel" name="lab9"> <widget class="QLabel" name="lab9">
<property name="enabled"> <property name="enabled">
<bool>true</bool> <bool>true</bool>
@ -452,7 +452,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="8" column="1"> <item row="9" column="1">
<widget class="QLineEdit" name="name"> <widget class="QLineEdit" name="name">
<property name="enabled"> <property name="enabled">
<bool>true</bool> <bool>true</bool>
@ -465,7 +465,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="9" column="0"> <item row="10" column="0">
<widget class="QLabel" name="lab10"> <widget class="QLabel" name="lab10">
<property name="enabled"> <property name="enabled">
<bool>true</bool> <bool>true</bool>
@ -480,14 +480,14 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="9" column="1"> <item row="10" column="1">
<widget class="QLineEdit" name="comments"> <widget class="QLineEdit" name="comments">
<property name="enabled"> <property name="enabled">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="1"> <item row="11" column="1">
<widget class="QCheckBox" name="cbComments"> <widget class="QCheckBox" name="cbComments">
<property name="text"> <property name="text">
<string>Retain Comments</string> <string>Retain Comments</string>
@ -496,6 +496,55 @@
</item> </item>
</layout> </layout>
</item> </item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QGroupBox" name="additionalFields">
<property name="title">
<string>Additional Fields</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="1">
<layout class="QHBoxLayout" name="field_button_layout">
<property name="topMargin">
<number>0</number>
</property>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="add_new_field_button">
<property name="text">
<string>Add New Field</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>