Implemented basic logging of additional fields support based on ADIF
This commit is contained in:
parent
ae6dccc183
commit
38ab24ba79
158
logbook/adif.cpp
158
logbook/adif.cpp
@ -5,6 +5,164 @@
|
||||
#include <QDateTime>
|
||||
#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: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>
|
||||
|
@ -11,6 +11,7 @@
|
||||
#if defined (QT5)
|
||||
#include <QList>
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <QMultiHash>
|
||||
#else
|
||||
#include <QtGui>
|
||||
@ -18,6 +19,8 @@
|
||||
|
||||
class QDateTime;
|
||||
|
||||
extern const QStringList ADIF_FIELDS;
|
||||
|
||||
class ADIF
|
||||
{
|
||||
public:
|
||||
@ -35,18 +38,17 @@ class ADIF
|
||||
// open ADIF file and append the QSO details. Return true on success
|
||||
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& band, QString const& comments, QString const& name
|
||||
, QString const& strDialFreq, QString const& m_myCall, QString const& m_myGrid
|
||||
, QString const& operator_call);
|
||||
|
||||
|
||||
|
||||
struct QSO
|
||||
{
|
||||
QString call,band,mode,submode,date,name,comment;
|
||||
};
|
||||
struct QSO
|
||||
{
|
||||
QString call,band,mode,submode,date,name,comment;
|
||||
};
|
||||
|
||||
private:
|
||||
QMultiHash<QString, QSO> _data;
|
||||
|
68
logqso.cpp
68
logqso.cpp
@ -26,7 +26,6 @@ LogQSO::LogQSO(QString const& programTitle, QSettings * settings
|
||||
{
|
||||
ui->setupUi(this);
|
||||
setWindowTitle(programTitle + " - Log QSO");
|
||||
loadSettings ();
|
||||
ui->grid->setValidator (new MaidenheadLocatorValidator {this});
|
||||
}
|
||||
|
||||
@ -65,12 +64,61 @@ void LogQSO::on_end_now_button_pressed(){
|
||||
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 ()
|
||||
{
|
||||
m_settings->beginGroup ("LogQSO");
|
||||
restoreGeometry (m_settings->value ("geometry", saveGeometry ()).toByteArray ());
|
||||
ui->cbComments->setChecked (m_settings->value ("SaveComments", false).toBool ());
|
||||
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 ();
|
||||
}
|
||||
|
||||
@ -80,6 +128,13 @@ void LogQSO::storeSettings () const
|
||||
m_settings->setValue ("geometry", saveGeometry ());
|
||||
m_settings->setValue ("SaveComments", ui->cbComments->isChecked ());
|
||||
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 ();
|
||||
}
|
||||
|
||||
@ -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)
|
||||
{
|
||||
if(!isHidden()) return;
|
||||
|
||||
loadSettings();
|
||||
|
||||
ui->call->setFocus();
|
||||
ui->call->setText(hisCall);
|
||||
ui->grid->setText(hisGrid);
|
||||
ui->name->setText("");
|
||||
ui->comments->setText("");
|
||||
|
||||
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(!comments.isEmpty()){
|
||||
ui->comments->setText(comments);
|
||||
}
|
||||
|
||||
if(toDATA) 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 {
|
||||
|
4
logqso.h
4
logqso.h
@ -51,6 +51,9 @@ protected:
|
||||
void hideEvent (QHideEvent *);
|
||||
|
||||
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_end_now_button_pressed();
|
||||
|
||||
@ -67,6 +70,7 @@ private:
|
||||
QString m_myGrid;
|
||||
QDateTime m_dateTimeOn;
|
||||
QDateTime m_dateTimeOff;
|
||||
QList<QLineEdit*> m_additionalFieldsControls;
|
||||
};
|
||||
|
||||
#endif // LogQSO_H
|
||||
|
65
logqso.ui
65
logqso.ui
@ -42,8 +42,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>582</width>
|
||||
<height>401</height>
|
||||
<width>568</width>
|
||||
<height>442</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
@ -54,7 +54,7 @@
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
@ -434,7 +434,7 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<item row="9" column="0">
|
||||
<widget class="QLabel" name="lab9">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
@ -452,7 +452,7 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="1">
|
||||
<item row="9" column="1">
|
||||
<widget class="QLineEdit" name="name">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
@ -465,7 +465,7 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="0">
|
||||
<item row="10" column="0">
|
||||
<widget class="QLabel" name="lab10">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
@ -480,14 +480,14 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="1">
|
||||
<item row="10" column="1">
|
||||
<widget class="QLineEdit" name="comments">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="10" column="1">
|
||||
<item row="11" column="1">
|
||||
<widget class="QCheckBox" name="cbComments">
|
||||
<property name="text">
|
||||
<string>Retain Comments</string>
|
||||
@ -496,6 +496,55 @@
|
||||
</item>
|
||||
</layout>
|
||||
</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>
|
||||
</widget>
|
||||
</widget>
|
||||
|
Loading…
Reference in New Issue
Block a user