mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-09-04 22:27:50 -04:00
read/write QRG files with additional information; support JSON format for human inspection
This commit is contained in:
parent
c3579831ba
commit
9520eb1309
@ -168,6 +168,11 @@
|
|||||||
#include <QHostAddress>
|
#include <QHostAddress>
|
||||||
#include <QStandardItem>
|
#include <QStandardItem>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QDateTimeEdit>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonArray>
|
||||||
|
|
||||||
|
|
||||||
#include "pimpl_impl.hpp"
|
#include "pimpl_impl.hpp"
|
||||||
#include "Logger.hpp"
|
#include "Logger.hpp"
|
||||||
@ -250,7 +255,8 @@ namespace
|
|||||||
|
|
||||||
// Magic numbers for file validation
|
// Magic numbers for file validation
|
||||||
constexpr quint32 qrg_magic {0xadbccbdb};
|
constexpr quint32 qrg_magic {0xadbccbdb};
|
||||||
constexpr quint32 qrg_version {100}; // M.mm
|
constexpr quint32 qrg_version {101}; // M.mm
|
||||||
|
constexpr quint32 qrg_version_100 {100};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -268,8 +274,21 @@ public:
|
|||||||
explicit FrequencyDialog (IARURegions * regions_model, Modes * modes_model, QWidget * parent = nullptr)
|
explicit FrequencyDialog (IARURegions * regions_model, Modes * modes_model, QWidget * parent = nullptr)
|
||||||
: QDialog {parent}
|
: QDialog {parent}
|
||||||
{
|
{
|
||||||
|
start_date_time_edit_ = new QDateTimeEdit(QDateTime(QDate::currentDate(), QTime(0,0,0,0), Qt::UTC), parent);
|
||||||
|
end_date_time_edit_ = new QDateTimeEdit(QDateTime(QDate::currentDate().addDays(2), QTime(0,0,0,0), Qt::UTC), parent);
|
||||||
|
|
||||||
|
enable_dates_checkbox_ = new QCheckBox {tr ("Validity Period")};
|
||||||
|
start_date_time_edit_->setDisplayFormat("yyyy.MM.dd hh:mm:ss 'UTC'");
|
||||||
|
start_date_time_edit_->setTimeSpec(Qt::UTC);
|
||||||
|
start_date_time_edit_->setMinimumDate(QDate::currentDate().addDays(-365));
|
||||||
|
|
||||||
|
end_date_time_edit_->setDisplayFormat("yyyy.MM.dd hh:mm:ss 'UTC'");
|
||||||
|
end_date_time_edit_->setTimeSpec(Qt::UTC);
|
||||||
|
end_date_time_edit_->setMinimumDate(QDate::currentDate().addDays(-365));
|
||||||
|
|
||||||
setWindowTitle (QApplication::applicationName () + " - " +
|
setWindowTitle (QApplication::applicationName () + " - " +
|
||||||
tr ("Add Frequency"));
|
tr ("Add Frequency"));
|
||||||
|
|
||||||
region_combo_box_.setModel (regions_model);
|
region_combo_box_.setModel (regions_model);
|
||||||
mode_combo_box_.setModel (modes_model);
|
mode_combo_box_.setModel (modes_model);
|
||||||
|
|
||||||
@ -277,28 +296,71 @@ public:
|
|||||||
form_layout->addRow (tr ("IARU &Region:"), ®ion_combo_box_);
|
form_layout->addRow (tr ("IARU &Region:"), ®ion_combo_box_);
|
||||||
form_layout->addRow (tr ("&Mode:"), &mode_combo_box_);
|
form_layout->addRow (tr ("&Mode:"), &mode_combo_box_);
|
||||||
form_layout->addRow (tr ("&Frequency (MHz):"), &frequency_line_edit_);
|
form_layout->addRow (tr ("&Frequency (MHz):"), &frequency_line_edit_);
|
||||||
|
form_layout->addRow (tr ("&Enable Date Range"), enable_dates_checkbox_);
|
||||||
|
form_layout->addRow (tr ("S&tart:"), start_date_time_edit_);
|
||||||
|
form_layout->addRow (tr ("&End:"), end_date_time_edit_);
|
||||||
|
form_layout->addRow (tr ("&Description:"), &description_line_edit_);
|
||||||
|
form_layout->addRow (tr ("&Source:"), &source_line_edit_);
|
||||||
|
|
||||||
auto main_layout = new QVBoxLayout (this);
|
auto main_layout = new QVBoxLayout (this);
|
||||||
main_layout->addLayout (form_layout);
|
main_layout->addLayout (form_layout);
|
||||||
|
|
||||||
auto button_box = new QDialogButtonBox {QDialogButtonBox::Ok | QDialogButtonBox::Cancel};
|
button_box = new QDialogButtonBox {QDialogButtonBox::Ok | QDialogButtonBox::Cancel};
|
||||||
main_layout->addWidget (button_box);
|
main_layout->addWidget (button_box);
|
||||||
|
|
||||||
connect (button_box, &QDialogButtonBox::accepted, this, &FrequencyDialog::accept);
|
connect (button_box, &QDialogButtonBox::accepted, this, &FrequencyDialog::accept);
|
||||||
connect (button_box, &QDialogButtonBox::rejected, this, &FrequencyDialog::reject);
|
connect (button_box, &QDialogButtonBox::rejected, this, &FrequencyDialog::reject);
|
||||||
|
connect(start_date_time_edit_, &QDateTimeEdit::dateTimeChanged, this, &FrequencyDialog::checkSaneDates);
|
||||||
|
connect(end_date_time_edit_, &QDateTimeEdit::dateTimeChanged, this, &FrequencyDialog::checkSaneDates);
|
||||||
|
connect(enable_dates_checkbox_, &QCheckBox::stateChanged, this, &FrequencyDialog::toggleValidity);
|
||||||
|
toggleValidity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void toggleValidity()
|
||||||
|
{
|
||||||
|
start_date_time_edit_->setEnabled(enable_dates_checkbox_->isChecked());
|
||||||
|
end_date_time_edit_->setEnabled(enable_dates_checkbox_->isChecked());
|
||||||
|
checkSaneDates();
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkSaneDates()
|
||||||
|
{
|
||||||
|
if (enable_dates_checkbox_->isChecked() && start_date_time_edit_->dateTime().isValid() && end_date_time_edit_->dateTime().isValid())
|
||||||
|
{
|
||||||
|
if (start_date_time_edit_->dateTime() > end_date_time_edit_->dateTime())
|
||||||
|
{
|
||||||
|
QMessageBox::warning(this, tr("Invalid Date Range"), tr("Start date must be before end date"));
|
||||||
|
button_box->button(QDialogButtonBox::Ok)->setEnabled(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
button_box->button(QDialogButtonBox::Ok)->setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
Item item () const
|
Item item () const
|
||||||
{
|
{
|
||||||
return {frequency_line_edit_.frequency ()
|
QDateTime start_time = enable_dates_checkbox_->isChecked() ? start_date_time_edit_->dateTime() : QDateTime();
|
||||||
, Modes::value (mode_combo_box_.currentText ())
|
QDateTime end_time = enable_dates_checkbox_->isChecked() ? end_date_time_edit_->dateTime() : QDateTime();
|
||||||
, IARURegions::value (region_combo_box_.currentText ())};
|
return {
|
||||||
|
frequency_line_edit_.frequency(),
|
||||||
|
Modes::value(mode_combo_box_.currentText()),
|
||||||
|
IARURegions::value(region_combo_box_.currentText()),
|
||||||
|
description_line_edit_.text(), source_line_edit_.text(),
|
||||||
|
start_time,
|
||||||
|
end_time
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QComboBox region_combo_box_;
|
QComboBox region_combo_box_;
|
||||||
QComboBox mode_combo_box_;
|
QComboBox mode_combo_box_;
|
||||||
FrequencyLineEdit frequency_line_edit_;
|
FrequencyLineEdit frequency_line_edit_;
|
||||||
|
QLineEdit description_line_edit_;
|
||||||
|
QLineEdit source_line_edit_;
|
||||||
|
QDialogButtonBox * button_box;
|
||||||
|
QCheckBox *enable_dates_checkbox_;
|
||||||
|
QDateTimeEdit *end_date_time_edit_;
|
||||||
|
QDateTimeEdit *start_date_time_edit_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -477,7 +539,9 @@ private:
|
|||||||
void save_frequencies ();
|
void save_frequencies ();
|
||||||
void reset_frequencies ();
|
void reset_frequencies ();
|
||||||
void insert_frequency ();
|
void insert_frequency ();
|
||||||
FrequencyList_v2::FrequencyItems read_frequencies_file (QString const&);
|
void size_frequency_table_columns();
|
||||||
|
|
||||||
|
FrequencyList_v2::FrequencyItems read_frequencies_file (QString const&);
|
||||||
|
|
||||||
void delete_stations ();
|
void delete_stations ();
|
||||||
void insert_station ();
|
void insert_station ();
|
||||||
@ -1198,6 +1262,7 @@ Configuration::impl::impl (Configuration * self, QNetworkAccessManager * network
|
|||||||
|
|
||||||
ui_->frequencies_table_view->setModel (&next_frequencies_);
|
ui_->frequencies_table_view->setModel (&next_frequencies_);
|
||||||
ui_->frequencies_table_view->horizontalHeader ()->setSectionResizeMode (QHeaderView::ResizeToContents);
|
ui_->frequencies_table_view->horizontalHeader ()->setSectionResizeMode (QHeaderView::ResizeToContents);
|
||||||
|
|
||||||
ui_->frequencies_table_view->horizontalHeader ()->setResizeContentsPrecision (0);
|
ui_->frequencies_table_view->horizontalHeader ()->setResizeContentsPrecision (0);
|
||||||
ui_->frequencies_table_view->verticalHeader ()->setSectionResizeMode (QHeaderView::ResizeToContents);
|
ui_->frequencies_table_view->verticalHeader ()->setSectionResizeMode (QHeaderView::ResizeToContents);
|
||||||
ui_->frequencies_table_view->verticalHeader ()->setResizeContentsPrecision (0);
|
ui_->frequencies_table_view->verticalHeader ()->setResizeContentsPrecision (0);
|
||||||
@ -2508,17 +2573,25 @@ void Configuration::impl::check_multicast (QHostAddress const& ha)
|
|||||||
udp_server_name_edited_ = false;
|
udp_server_name_edited_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Configuration::impl::size_frequency_table_columns()
|
||||||
|
{
|
||||||
|
ui_->frequencies_table_view->setVisible(false);
|
||||||
|
ui_->frequencies_table_view->resizeColumnsToContents();
|
||||||
|
ui_->frequencies_table_view->setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
void Configuration::impl::delete_frequencies ()
|
void Configuration::impl::delete_frequencies ()
|
||||||
{
|
{
|
||||||
auto selection_model = ui_->frequencies_table_view->selectionModel ();
|
auto selection_model = ui_->frequencies_table_view->selectionModel ();
|
||||||
selection_model->select (selection_model->selection (), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
|
selection_model->select (selection_model->selection (), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
|
||||||
next_frequencies_.removeDisjointRows (selection_model->selectedRows ());
|
next_frequencies_.removeDisjointRows (selection_model->selectedRows ());
|
||||||
ui_->frequencies_table_view->resizeColumnToContents (FrequencyList_v2::mode_column);
|
ui_->frequencies_table_view->resizeColumnToContents (FrequencyList_v2::mode_column);
|
||||||
|
size_frequency_table_columns ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Configuration::impl::load_frequencies ()
|
void Configuration::impl::load_frequencies ()
|
||||||
{
|
{
|
||||||
auto file_name = QFileDialog::getOpenFileName (this, tr ("Load Working Frequencies"), writeable_data_dir_.absolutePath (), tr ("Frequency files (*.qrg);;All files (*.*)"));
|
auto file_name = QFileDialog::getOpenFileName (this, tr ("Load Working Frequencies"), writeable_data_dir_.absolutePath (), tr ("Frequency files (*.qrg *.qrg.json);;All files (*.*)"));
|
||||||
if (!file_name.isNull ())
|
if (!file_name.isNull ())
|
||||||
{
|
{
|
||||||
auto const list = read_frequencies_file (file_name);
|
auto const list = read_frequencies_file (file_name);
|
||||||
@ -2532,15 +2605,17 @@ void Configuration::impl::load_frequencies ()
|
|||||||
{
|
{
|
||||||
next_frequencies_.frequency_list (list); // update the model
|
next_frequencies_.frequency_list (list); // update the model
|
||||||
}
|
}
|
||||||
|
size_frequency_table_columns();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Configuration::impl::merge_frequencies ()
|
void Configuration::impl::merge_frequencies ()
|
||||||
{
|
{
|
||||||
auto file_name = QFileDialog::getOpenFileName (this, tr ("Merge Working Frequencies"), writeable_data_dir_.absolutePath (), tr ("Frequency files (*.qrg);;All files (*.*)"));
|
auto file_name = QFileDialog::getOpenFileName (this, tr ("Merge Working Frequencies"), writeable_data_dir_.absolutePath (), tr ("Frequency files (*.qrg *.qrg.json);;All files (*.*)"));
|
||||||
if (!file_name.isNull ())
|
if (!file_name.isNull ())
|
||||||
{
|
{
|
||||||
next_frequencies_.frequency_list_merge (read_frequencies_file (file_name)); // update the model
|
next_frequencies_.frequency_list_merge (read_frequencies_file (file_name)); // update the model
|
||||||
|
size_frequency_table_columns();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2550,6 +2625,62 @@ FrequencyList_v2::FrequencyItems Configuration::impl::read_frequencies_file (QSt
|
|||||||
frequencies_file.open (QFile::ReadOnly);
|
frequencies_file.open (QFile::ReadOnly);
|
||||||
QDataStream ids {&frequencies_file};
|
QDataStream ids {&frequencies_file};
|
||||||
FrequencyList_v2::FrequencyItems list;
|
FrequencyList_v2::FrequencyItems list;
|
||||||
|
FrequencyList_v2_100::FrequencyItems list_v100;
|
||||||
|
|
||||||
|
// read file as json if ends with qrg.json
|
||||||
|
if (file_name.endsWith(".qrg.json", Qt::CaseInsensitive))
|
||||||
|
{
|
||||||
|
QJsonDocument doc = QJsonDocument::fromJson(frequencies_file.readAll());
|
||||||
|
if (doc.isNull())
|
||||||
|
{
|
||||||
|
MessageBox::critical_message (this, tr ("Error reading frequencies file"), tr ("%1 - Invalid Format").arg (file_name));
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
QJsonObject obj = doc.object();
|
||||||
|
if (obj.isEmpty())
|
||||||
|
{
|
||||||
|
MessageBox::critical_message (this, tr ("Error reading frequencies file"), tr ("%1 - Information Missing ").arg (file_name));
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
QJsonArray arr = obj["frequencies"].toArray();
|
||||||
|
if (arr.isEmpty())
|
||||||
|
{
|
||||||
|
MessageBox::critical_message (this, tr ("Error reading frequencies file"), tr ("No Frequencies were found"));
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
int valid_entry_count = 0;
|
||||||
|
int skipped_entry_count = 0;
|
||||||
|
for (auto const &item: arr)
|
||||||
|
{
|
||||||
|
QString mode_s, region_s;
|
||||||
|
QJsonObject obj = item.toObject();
|
||||||
|
FrequencyList_v2::Item freq;
|
||||||
|
region_s = obj["region"].toString();
|
||||||
|
mode_s = obj["mode"].toString();
|
||||||
|
|
||||||
|
freq.frequency_ = obj["frequency"].toString().toDouble() * 1e6;
|
||||||
|
freq.region_ = IARURegions::value(region_s);
|
||||||
|
freq.mode_ = Modes::value(mode_s);
|
||||||
|
freq.description_ = obj["description"].toString();
|
||||||
|
freq.source_ = obj["source"].toString();
|
||||||
|
freq.start_time_ = QDateTime::fromString(obj["start_time"].toString(), Qt::ISODate);
|
||||||
|
freq.end_time_ = QDateTime::fromString(obj["end_time"].toString(), Qt::ISODate);
|
||||||
|
//MessageBox::critical_message (this, tr ("Entry"), tr ("Entry: %1 ").arg(freq.toString()+"[sane:" +freq.isSane() + "] [region:" + obj["region"].toString() + "] [mode:" + obj["mode"].toString()+"] "));
|
||||||
|
if ((freq.mode_ != Modes::ALL || QString::compare("ALL", mode_s)) &&
|
||||||
|
(freq.region_ != IARURegions::ALL || QString::compare("ALL", region_s, Qt::CaseInsensitive)) &&
|
||||||
|
freq.isSane())
|
||||||
|
{
|
||||||
|
list.push_back(freq);
|
||||||
|
valid_entry_count++;
|
||||||
|
} else
|
||||||
|
skipped_entry_count++;
|
||||||
|
}
|
||||||
|
MessageBox::information_message(this, tr("Loaded Frequencies from %1").arg(file_name),
|
||||||
|
tr("Entries Valid/Skipped %1").arg(QString::number(valid_entry_count) + "/" +
|
||||||
|
QString::number(skipped_entry_count)));
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
quint32 magic;
|
quint32 magic;
|
||||||
ids >> magic;
|
ids >> magic;
|
||||||
if (qrg_magic != magic)
|
if (qrg_magic != magic)
|
||||||
@ -2568,8 +2699,19 @@ FrequencyList_v2::FrequencyItems Configuration::impl::read_frequencies_file (QSt
|
|||||||
}
|
}
|
||||||
|
|
||||||
// de-serialize the data using version if necessary to
|
// de-serialize the data using version if necessary to
|
||||||
// handle old schemata
|
// handle old schema
|
||||||
ids >> list;
|
if (version == qrg_version_100)
|
||||||
|
{
|
||||||
|
ids >> list_v100;
|
||||||
|
Q_FOREACH (auto const& item, list_v100)
|
||||||
|
{
|
||||||
|
list << FrequencyList_v2::Item{item.frequency_, item.mode_, item.region_, QString(), QString(), QDateTime(),QDateTime()};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ids >> list;
|
||||||
|
}
|
||||||
|
|
||||||
if (ids.status () != QDataStream::Ok || !ids.atEnd ())
|
if (ids.status () != QDataStream::Ok || !ids.atEnd ())
|
||||||
{
|
{
|
||||||
@ -2577,13 +2719,12 @@ FrequencyList_v2::FrequencyItems Configuration::impl::read_frequencies_file (QSt
|
|||||||
list.clear ();
|
list.clear ();
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Configuration::impl::save_frequencies ()
|
void Configuration::impl::save_frequencies ()
|
||||||
{
|
{
|
||||||
auto file_name = QFileDialog::getSaveFileName (this, tr ("Save Working Frequencies"), writeable_data_dir_.absolutePath (), tr ("Frequency files (*.qrg);;All files (*.*)"));
|
auto file_name = QFileDialog::getSaveFileName (this, tr ("Save Working Frequencies"), writeable_data_dir_.absolutePath (), tr ("Frequency files (*.qrg *.qrg.json);;All files (*.*)"));
|
||||||
if (!file_name.isNull ())
|
if (!file_name.isNull ())
|
||||||
{
|
{
|
||||||
QFile frequencies_file {file_name};
|
QFile frequencies_file {file_name};
|
||||||
@ -2598,11 +2739,28 @@ void Configuration::impl::save_frequencies ()
|
|||||||
"Click No to save all.")))
|
"Click No to save all.")))
|
||||||
{
|
{
|
||||||
selection_model->select (selection_model->selection (), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
|
selection_model->select (selection_model->selection (), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
|
||||||
ods << qrg_magic << qrg_version << next_frequencies_.frequency_list (selection_model->selectedRows ());
|
if (file_name.endsWith(".qrg.json", Qt::CaseInsensitive))
|
||||||
|
{
|
||||||
|
next_frequencies_.to_json_stream(&ods, "0x" + QString::number(qrg_magic, 16).toUpper(),
|
||||||
|
"0x" + QString::number(qrg_version, 16).toUpper(),
|
||||||
|
next_frequencies_.frequency_list(selection_model->selectedRows()));
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
ods << qrg_magic << qrg_version << next_frequencies_.frequency_list(selection_model->selectedRows());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ods << qrg_magic << qrg_version << next_frequencies_.frequency_list ();
|
if (file_name.endsWith(".qrg.json", Qt::CaseInsensitive))
|
||||||
|
{
|
||||||
|
next_frequencies_.to_json_stream(&ods,
|
||||||
|
"0x" + QString::number(qrg_magic, 16).toUpper(),
|
||||||
|
"0x" + QString::number(qrg_version, 16).toUpper(),
|
||||||
|
next_frequencies_.frequency_list());
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
ods << qrg_magic << qrg_version << next_frequencies_.frequency_list();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2616,6 +2774,7 @@ void Configuration::impl::reset_frequencies ()
|
|||||||
{
|
{
|
||||||
next_frequencies_.reset_to_defaults ();
|
next_frequencies_.reset_to_defaults ();
|
||||||
}
|
}
|
||||||
|
size_frequency_table_columns ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Configuration::impl::insert_frequency ()
|
void Configuration::impl::insert_frequency ()
|
||||||
@ -2624,6 +2783,7 @@ void Configuration::impl::insert_frequency ()
|
|||||||
{
|
{
|
||||||
ui_->frequencies_table_view->setCurrentIndex (next_frequencies_.add (frequency_dialog_->item ()));
|
ui_->frequencies_table_view->setCurrentIndex (next_frequencies_.add (frequency_dialog_->item ()));
|
||||||
ui_->frequencies_table_view->resizeColumnToContents (FrequencyList_v2::mode_column);
|
ui_->frequencies_table_view->resizeColumnToContents (FrequencyList_v2::mode_column);
|
||||||
|
size_frequency_table_columns();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <limits>
|
#include <limits>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
#include <QMetaType>
|
#include <QMetaType>
|
||||||
#include <QAbstractTableModel>
|
#include <QAbstractTableModel>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
@ -17,10 +18,16 @@
|
|||||||
#include <QDataStream>
|
#include <QDataStream>
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
#include <QDebugStateSaver>
|
#include <QDebugStateSaver>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonArray>
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QFile>
|
||||||
|
|
||||||
#include "Radio.hpp"
|
#include "Radio.hpp"
|
||||||
#include "Bands.hpp"
|
#include "Bands.hpp"
|
||||||
#include "pimpl_impl.hpp"
|
#include "pimpl_impl.hpp"
|
||||||
|
#include "revision_utils.hpp"
|
||||||
|
|
||||||
#include "moc_FrequencyList.cpp"
|
#include "moc_FrequencyList.cpp"
|
||||||
|
|
||||||
@ -28,40 +35,40 @@ namespace
|
|||||||
{
|
{
|
||||||
FrequencyList_v2::FrequencyItems const default_frequency_list =
|
FrequencyList_v2::FrequencyItems const default_frequency_list =
|
||||||
{
|
{
|
||||||
{198000, Modes::FreqCal, IARURegions::R1}, // BBC Radio 4 Droitwich
|
{198000, Modes::FreqCal, IARURegions::R1, "","", QDateTime(), QDateTime()}, // BBC Radio 4 Droitwich
|
||||||
{4996000, Modes::FreqCal, IARURegions::R1}, // RWM time signal
|
{4996000, Modes::FreqCal, IARURegions::R1, "","", QDateTime(), QDateTime()}, // RWM time signal
|
||||||
{9996000, Modes::FreqCal, IARURegions::R1}, // RWM time signal
|
{9996000, Modes::FreqCal, IARURegions::R1, "","", QDateTime(), QDateTime()}, // RWM time signal
|
||||||
{14996000, Modes::FreqCal, IARURegions::R1}, // RWM time signal
|
{14996000, Modes::FreqCal, IARURegions::R1, "","", QDateTime(), QDateTime()}, // RWM time signal
|
||||||
|
|
||||||
{660000, Modes::FreqCal, IARURegions::R2},
|
{660000, Modes::FreqCal, IARURegions::R2, "","", QDateTime(), QDateTime()},
|
||||||
{880000, Modes::FreqCal, IARURegions::R2},
|
{880000, Modes::FreqCal, IARURegions::R2, "","", QDateTime(), QDateTime()},
|
||||||
{1210000, Modes::FreqCal, IARURegions::R2},
|
{1210000, Modes::FreqCal, IARURegions::R2, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{2500000, Modes::FreqCal, IARURegions::ALL},
|
{2500000, Modes::FreqCal, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{3330000, Modes::FreqCal, IARURegions::ALL},
|
{3330000, Modes::FreqCal, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{5000000, Modes::FreqCal, IARURegions::ALL},
|
{5000000, Modes::FreqCal, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{7850000, Modes::FreqCal, IARURegions::ALL},
|
{7850000, Modes::FreqCal, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{10000000, Modes::FreqCal, IARURegions::ALL},
|
{10000000, Modes::FreqCal, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{14670000, Modes::FreqCal, IARURegions::ALL},
|
{14670000, Modes::FreqCal, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{15000000, Modes::FreqCal, IARURegions::ALL},
|
{15000000, Modes::FreqCal, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{20000000, Modes::FreqCal, IARURegions::ALL},
|
{20000000, Modes::FreqCal, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{136000, Modes::WSPR, IARURegions::ALL},
|
{136000, Modes::WSPR, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{136000, Modes::FST4, IARURegions::ALL},
|
{136000, Modes::FST4, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{136000, Modes::FST4W, IARURegions::ALL},
|
{136000, Modes::FST4W, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{136000, Modes::JT9, IARURegions::ALL},
|
{136000, Modes::JT9, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{474200, Modes::JT9, IARURegions::ALL},
|
{474200, Modes::JT9, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{474200, Modes::FST4, IARURegions::ALL},
|
{474200, Modes::FST4, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{474200, Modes::WSPR, IARURegions::ALL},
|
{474200, Modes::WSPR, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{474200, Modes::FST4W, IARURegions::ALL},
|
{474200, Modes::FST4W, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{1836600, Modes::WSPR, IARURegions::ALL},
|
{1836600, Modes::WSPR, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{1836800, Modes::FST4W, IARURegions::ALL},
|
{1836800, Modes::FST4W, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{1838000, Modes::JT65, IARURegions::ALL}, // squeezed allocations
|
{1838000, Modes::JT65, IARURegions::ALL, "","", QDateTime(), QDateTime()}, // squeezed allocations
|
||||||
{1839000, Modes::JT9, IARURegions::ALL},
|
{1839000, Modes::JT9, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{1839000, Modes::FST4, IARURegions::ALL},
|
{1839000, Modes::FST4, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{1840000, Modes::FT8, IARURegions::ALL},
|
{1840000, Modes::FT8, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
// Band plans (all USB dial unless stated otherwise)
|
// Band plans (all USB dial unless stated otherwise)
|
||||||
//
|
//
|
||||||
@ -90,12 +97,12 @@ namespace
|
|||||||
// 3580 PSK31
|
// 3580 PSK31
|
||||||
// 3600 LSB EMCOMM
|
// 3600 LSB EMCOMM
|
||||||
//
|
//
|
||||||
{3570000, Modes::JT65, IARURegions::ALL}, // JA compatible
|
{3570000, Modes::JT65, IARURegions::ALL, "","", QDateTime(), QDateTime()}, // JA compatible
|
||||||
{3572000, Modes::JT9, IARURegions::ALL},
|
{3572000, Modes::JT9, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{3573000, Modes::FT8, IARURegions::ALL}, // above as below JT65 is out of DM allocation
|
{3573000, Modes::FT8, IARURegions::ALL, "","", QDateTime(), QDateTime()}, // above as below JT65 is out of DM allocation
|
||||||
{3568600, Modes::WSPR, IARURegions::ALL}, // needs guard marker and lock out
|
{3568600, Modes::WSPR, IARURegions::ALL, "","", QDateTime(), QDateTime()}, // needs guard marker and lock out
|
||||||
{3575000, Modes::FT4, IARURegions::ALL}, // provisional
|
{3575000, Modes::FT4, IARURegions::ALL, "","", QDateTime(), QDateTime()}, // provisional
|
||||||
{3568000, Modes::FT4, IARURegions::R3}, // provisional
|
{3568000, Modes::FT4, IARURegions::R3, "","", QDateTime(), QDateTime()}, // provisional
|
||||||
|
|
||||||
// Band plans (all USB dial unless stated otherwise)
|
// Band plans (all USB dial unless stated otherwise)
|
||||||
//
|
//
|
||||||
@ -128,11 +135,11 @@ namespace
|
|||||||
// 7090 LSB QRP CoA
|
// 7090 LSB QRP CoA
|
||||||
// 7110 LSB EMCOMM
|
// 7110 LSB EMCOMM
|
||||||
//
|
//
|
||||||
{7038600, Modes::WSPR, IARURegions::ALL},
|
{7038600, Modes::WSPR, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{7074000, Modes::FT8, IARURegions::ALL},
|
{7074000, Modes::FT8, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{7076000, Modes::JT65, IARURegions::ALL},
|
{7076000, Modes::JT65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{7078000, Modes::JT9, IARURegions::ALL},
|
{7078000, Modes::JT9, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{7047500, Modes::FT4, IARURegions::ALL}, // provisional - moved
|
{7047500, Modes::FT4, IARURegions::ALL, "","", QDateTime(), QDateTime()}, // provisional - moved
|
||||||
// up 500Hz to clear
|
// up 500Hz to clear
|
||||||
// W1AW code practice QRG
|
// W1AW code practice QRG
|
||||||
|
|
||||||
@ -162,11 +169,11 @@ namespace
|
|||||||
// 10142.25 OLIVIA, Contestia, etc.
|
// 10142.25 OLIVIA, Contestia, etc.
|
||||||
// 10143.25 OLIVIA, Contestia, etc. (main QRG)
|
// 10143.25 OLIVIA, Contestia, etc. (main QRG)
|
||||||
//
|
//
|
||||||
{10136000, Modes::FT8, IARURegions::ALL},
|
{10136000, Modes::FT8, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{10138000, Modes::JT65, IARURegions::ALL},
|
{10138000, Modes::JT65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{10138700, Modes::WSPR, IARURegions::ALL},
|
{10138700, Modes::WSPR, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{10140000, Modes::JT9, IARURegions::ALL},
|
{10140000, Modes::JT9, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{10140000, Modes::FT4, IARURegions::ALL}, // provisional
|
{10140000, Modes::FT4, IARURegions::ALL, "","", QDateTime(), QDateTime()}, // provisional
|
||||||
|
|
||||||
// Band plans (all USB dial unless stated otherwise)
|
// Band plans (all USB dial unless stated otherwise)
|
||||||
//
|
//
|
||||||
@ -205,11 +212,11 @@ namespace
|
|||||||
// 14105.5 OLIVIA 1000
|
// 14105.5 OLIVIA 1000
|
||||||
// 14106.5 OLIVIA 1000 (main QRG)
|
// 14106.5 OLIVIA 1000 (main QRG)
|
||||||
//
|
//
|
||||||
{14095600, Modes::WSPR, IARURegions::ALL},
|
{14095600, Modes::WSPR, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{14074000, Modes::FT8, IARURegions::ALL},
|
{14074000, Modes::FT8, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{14076000, Modes::JT65, IARURegions::ALL},
|
{14076000, Modes::JT65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{14078000, Modes::JT9, IARURegions::ALL},
|
{14078000, Modes::JT9, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{14080000, Modes::FT4, IARURegions::ALL}, // provisional
|
{14080000, Modes::FT4, IARURegions::ALL, "","", QDateTime(), QDateTime()}, // provisional
|
||||||
|
|
||||||
// Band plans (all USB dial unless stated otherwise)
|
// Band plans (all USB dial unless stated otherwise)
|
||||||
//
|
//
|
||||||
@ -238,111 +245,111 @@ namespace
|
|||||||
// 18104.4 OLIVIA, Contestia, etc.
|
// 18104.4 OLIVIA, Contestia, etc.
|
||||||
// 18110 NCDXF beacons
|
// 18110 NCDXF beacons
|
||||||
//
|
//
|
||||||
{18100000, Modes::FT8, IARURegions::ALL},
|
{18100000, Modes::FT8, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{18102000, Modes::JT65, IARURegions::ALL},
|
{18102000, Modes::JT65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{18104000, Modes::JT9, IARURegions::ALL},
|
{18104000, Modes::JT9, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{18104000, Modes::FT4, IARURegions::ALL}, // provisional
|
{18104000, Modes::FT4, IARURegions::ALL, "","", QDateTime(), QDateTime()}, // provisional
|
||||||
{18104600, Modes::WSPR, IARURegions::ALL},
|
{18104600, Modes::WSPR, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{21074000, Modes::FT8, IARURegions::ALL},
|
{21074000, Modes::FT8, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{21076000, Modes::JT65, IARURegions::ALL},
|
{21076000, Modes::JT65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{21078000, Modes::JT9, IARURegions::ALL},
|
{21078000, Modes::JT9, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{21094600, Modes::WSPR, IARURegions::ALL},
|
{21094600, Modes::WSPR, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{21140000, Modes::FT4, IARURegions::ALL},
|
{21140000, Modes::FT4, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{24915000, Modes::FT8, IARURegions::ALL},
|
{24915000, Modes::FT8, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{24917000, Modes::JT65, IARURegions::ALL},
|
{24917000, Modes::JT65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{24919000, Modes::JT9, IARURegions::ALL},
|
{24919000, Modes::JT9, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{24919000, Modes::FT4, IARURegions::ALL}, // provisional
|
{24919000, Modes::FT4, IARURegions::ALL, "","", QDateTime(), QDateTime()}, // provisional
|
||||||
{24924600, Modes::WSPR, IARURegions::ALL},
|
{24924600, Modes::WSPR, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{28074000, Modes::FT8, IARURegions::ALL},
|
{28074000, Modes::FT8, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{28076000, Modes::JT65, IARURegions::ALL},
|
{28076000, Modes::JT65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{28078000, Modes::JT9, IARURegions::ALL},
|
{28078000, Modes::JT9, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{28124600, Modes::WSPR, IARURegions::ALL},
|
{28124600, Modes::WSPR, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{28180000, Modes::FT4, IARURegions::ALL},
|
{28180000, Modes::FT4, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{50200000, Modes::Echo, IARURegions::ALL},
|
{50200000, Modes::Echo, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{50211000, Modes::Q65, IARURegions::ALL},
|
{50211000, Modes::Q65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{50275000, Modes::Q65, IARURegions::ALL},
|
{50275000, Modes::Q65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{50276000, Modes::JT65, IARURegions::R2},
|
{50276000, Modes::JT65, IARURegions::R2, "","", QDateTime(), QDateTime()},
|
||||||
{50276000, Modes::JT65, IARURegions::R3},
|
{50276000, Modes::JT65, IARURegions::R3, "","", QDateTime(), QDateTime()},
|
||||||
{50380000, Modes::MSK144, IARURegions::R1},
|
{50380000, Modes::MSK144, IARURegions::R1, "","", QDateTime(), QDateTime()},
|
||||||
{50260000, Modes::MSK144, IARURegions::R2},
|
{50260000, Modes::MSK144, IARURegions::R2, "","", QDateTime(), QDateTime()},
|
||||||
{50260000, Modes::MSK144, IARURegions::R3},
|
{50260000, Modes::MSK144, IARURegions::R3, "","", QDateTime(), QDateTime()},
|
||||||
{50293000, Modes::WSPR, IARURegions::R2},
|
{50293000, Modes::WSPR, IARURegions::R2, "","", QDateTime(), QDateTime()},
|
||||||
{50293000, Modes::WSPR, IARURegions::R3},
|
{50293000, Modes::WSPR, IARURegions::R3, "","", QDateTime(), QDateTime()},
|
||||||
{50310000, Modes::JT65, IARURegions::ALL},
|
{50310000, Modes::JT65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{50312000, Modes::JT9, IARURegions::ALL},
|
{50312000, Modes::JT9, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{50313000, Modes::FT8, IARURegions::ALL},
|
{50313000, Modes::FT8, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{50318000, Modes::FT4, IARURegions::ALL}, // provisional
|
{50318000, Modes::FT4, IARURegions::ALL, "","", QDateTime(), QDateTime()}, // provisional
|
||||||
{50323000, Modes::FT8, IARURegions::ALL},
|
{50323000, Modes::FT8, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{70102000, Modes::JT65, IARURegions::R1},
|
{70102000, Modes::JT65, IARURegions::R1, "","", QDateTime(), QDateTime()},
|
||||||
{70104000, Modes::JT9, IARURegions::R1},
|
{70104000, Modes::JT9, IARURegions::R1, "","", QDateTime(), QDateTime()},
|
||||||
{70091000, Modes::WSPR, IARURegions::R1},
|
{70091000, Modes::WSPR, IARURegions::R1, "","", QDateTime(), QDateTime()},
|
||||||
{70154000, Modes::FT8, IARURegions::R1},
|
{70154000, Modes::FT8, IARURegions::R1, "","", QDateTime(), QDateTime()},
|
||||||
{70230000, Modes::MSK144, IARURegions::R1},
|
{70230000, Modes::MSK144, IARURegions::R1, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{144116000, Modes::Q65, IARURegions::ALL},
|
{144116000, Modes::Q65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{144120000, Modes::JT65, IARURegions::ALL},
|
{144120000, Modes::JT65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{144120000, Modes::Echo, IARURegions::ALL},
|
{144120000, Modes::Echo, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{144170000, Modes::FT4, IARURegions::ALL},
|
{144170000, Modes::FT4, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{144174000, Modes::FT8, IARURegions::ALL},
|
{144174000, Modes::FT8, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{144360000, Modes::MSK144, IARURegions::R1},
|
{144360000, Modes::MSK144, IARURegions::R1, "","", QDateTime(), QDateTime()},
|
||||||
{144150000, Modes::MSK144, IARURegions::R2},
|
{144150000, Modes::MSK144, IARURegions::R2, "","", QDateTime(), QDateTime()},
|
||||||
{144489000, Modes::WSPR, IARURegions::ALL},
|
{144489000, Modes::WSPR, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{222065000, Modes::Echo, IARURegions::R2},
|
{222065000, Modes::Echo, IARURegions::R2, "","", QDateTime(), QDateTime()},
|
||||||
{222065000, Modes::JT65, IARURegions::R2},
|
{222065000, Modes::JT65, IARURegions::R2, "","", QDateTime(), QDateTime()},
|
||||||
{222065000, Modes::Q65, IARURegions::R2},
|
{222065000, Modes::Q65, IARURegions::R2, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{432065000, Modes::Echo, IARURegions::ALL},
|
{432065000, Modes::Echo, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{432065000, Modes::JT65, IARURegions::ALL},
|
{432065000, Modes::JT65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{432300000, Modes::WSPR, IARURegions::ALL},
|
{432300000, Modes::WSPR, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{432360000, Modes::MSK144, IARURegions::ALL},
|
{432360000, Modes::MSK144, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{432065000, Modes::Q65, IARURegions::ALL},
|
{432065000, Modes::Q65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{902065000, Modes::JT65, IARURegions::R2},
|
{902065000, Modes::JT65, IARURegions::R2, "","", QDateTime(), QDateTime()},
|
||||||
{902065000, Modes::Q65, IARURegions::R2},
|
{902065000, Modes::Q65, IARURegions::R2, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{1296065000, Modes::Echo, IARURegions::ALL},
|
{1296065000, Modes::Echo, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{1296065000, Modes::JT65, IARURegions::ALL},
|
{1296065000, Modes::JT65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{1296500000, Modes::WSPR, IARURegions::ALL},
|
{1296500000, Modes::WSPR, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{1296065000, Modes::Q65, IARURegions::ALL},
|
{1296065000, Modes::Q65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{2301000000, Modes::Echo, IARURegions::ALL},
|
{2301000000, Modes::Echo, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{2301065000, Modes::JT4, IARURegions::ALL},
|
{2301065000, Modes::JT4, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{2301065000, Modes::JT65, IARURegions::ALL},
|
{2301065000, Modes::JT65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{2301065000, Modes::Q65, IARURegions::ALL},
|
{2301065000, Modes::Q65, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{2304065000, Modes::Echo, IARURegions::ALL},
|
{2304065000, Modes::Echo, IARURegions::ALL, "","", QDateTime(), QDateTime()},
|
||||||
{2304065000, Modes::JT4, IARURegions::ALL},
|
{2304065000, Modes::JT4, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{2304065000, Modes::JT65, IARURegions::ALL},
|
{2304065000, Modes::JT65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{2304065000, Modes::Q65, IARURegions::ALL},
|
{2304065000, Modes::Q65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{2320065000, Modes::Echo, IARURegions::ALL},
|
{2320065000, Modes::Echo, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{2320065000, Modes::JT4, IARURegions::ALL},
|
{2320065000, Modes::JT4, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{2320065000, Modes::JT65, IARURegions::ALL},
|
{2320065000, Modes::JT65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{2320065000, Modes::Q65, IARURegions::ALL},
|
{2320065000, Modes::Q65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{3400065000, Modes::Echo, IARURegions::ALL},
|
{3400065000, Modes::Echo, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{3400065000, Modes::JT4, IARURegions::ALL},
|
{3400065000, Modes::JT4, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{3400065000, Modes::JT65, IARURegions::ALL},
|
{3400065000, Modes::JT65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{3400065000, Modes::Q65, IARURegions::ALL},
|
{3400065000, Modes::Q65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{5760065000, Modes::Echo, IARURegions::ALL},
|
{5760065000, Modes::Echo, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{5760065000, Modes::JT4, IARURegions::ALL},
|
{5760065000, Modes::JT4, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{5760065000, Modes::JT65, IARURegions::ALL},
|
{5760065000, Modes::JT65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{5760200000, Modes::Q65, IARURegions::ALL},
|
{5760200000, Modes::Q65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{10368100000, Modes::Echo, IARURegions::ALL},
|
{10368100000, Modes::Echo, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{10368200000, Modes::JT4, IARURegions::ALL},
|
{10368200000, Modes::JT4, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{10368200000, Modes::Q65, IARURegions::ALL},
|
{10368200000, Modes::Q65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
|
|
||||||
{24048100000, Modes::Echo, IARURegions::ALL},
|
{24048100000, Modes::Echo, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{24048200000, Modes::JT4, IARURegions::ALL},
|
{24048200000, Modes::JT4, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
{24048200000, Modes::Q65, IARURegions::ALL},
|
{24048200000, Modes::Q65, IARURegions::ALL,"","", QDateTime(), QDateTime()},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,6 +360,11 @@ QDebug operator << (QDebug debug, FrequencyList_v2::Item const& item)
|
|||||||
return debug.nospace () << item.toString ();
|
return debug.nospace () << item.toString ();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
bool FrequencyList_v2::Item::isSane() const
|
||||||
|
{
|
||||||
|
return frequency_ > 0.0 && (!start_time_.isValid() || !end_time_.isValid() || start_time_ < end_time_)
|
||||||
|
&& (region_ == IARURegions::ALL || region_ == IARURegions::R1 || region_ == IARURegions::R2 || region_ == IARURegions::R3);
|
||||||
|
}
|
||||||
|
|
||||||
QString FrequencyList_v2::Item::toString () const
|
QString FrequencyList_v2::Item::toString () const
|
||||||
{
|
{
|
||||||
@ -361,22 +373,45 @@ QString FrequencyList_v2::Item::toString () const
|
|||||||
qts << "FrequencyItem("
|
qts << "FrequencyItem("
|
||||||
<< Radio::frequency_MHz_string (frequency_) << ", "
|
<< Radio::frequency_MHz_string (frequency_) << ", "
|
||||||
<< IARURegions::name (region_) << ", "
|
<< IARURegions::name (region_) << ", "
|
||||||
<< Modes::name (mode_) << ')';
|
<< Modes::name (mode_) << ", "
|
||||||
|
<< start_time_.toString(Qt::ISODate) << ", "
|
||||||
|
<< end_time_.toString(Qt::ISODate) << ", "
|
||||||
|
<< description_ << ", "
|
||||||
|
<< source_ << ')';
|
||||||
|
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QJsonObject FrequencyList_v2::Item::toJson() const {
|
||||||
|
return {{"frequency", Radio::frequency_MHz_string (frequency_) },
|
||||||
|
{"mode", Modes::name (mode_) },
|
||||||
|
{"region", IARURegions::name (region_)},
|
||||||
|
{"description", description_},
|
||||||
|
{"source", source_},
|
||||||
|
{"start_time", start_time_.toString(Qt::ISODate) },
|
||||||
|
{"end_time", end_time_.toString(Qt::ISODate)}};
|
||||||
|
}
|
||||||
|
|
||||||
QDataStream& operator << (QDataStream& os, FrequencyList_v2::Item const& item)
|
QDataStream& operator << (QDataStream& os, FrequencyList_v2::Item const& item)
|
||||||
{
|
{
|
||||||
return os << item.frequency_
|
return os << item.frequency_
|
||||||
<< item.mode_
|
<< item.mode_
|
||||||
<< item.region_;
|
<< item.region_
|
||||||
|
<< item.start_time_
|
||||||
|
<< item.end_time_
|
||||||
|
<< item.description_
|
||||||
|
<< item.source_;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDataStream& operator >> (QDataStream& is, FrequencyList_v2::Item& item)
|
QDataStream& operator >> (QDataStream& is, FrequencyList_v2::Item& item)
|
||||||
{
|
{
|
||||||
return is >> item.frequency_
|
return is >> item.frequency_
|
||||||
>> item.mode_
|
>> item.mode_
|
||||||
>> item.region_;
|
>> item.region_
|
||||||
|
>> item.start_time_
|
||||||
|
>> item.end_time_
|
||||||
|
>> item.description_
|
||||||
|
>> item.source_;
|
||||||
}
|
}
|
||||||
|
|
||||||
class FrequencyList_v2::impl final
|
class FrequencyList_v2::impl final
|
||||||
@ -453,6 +488,7 @@ void FrequencyList_v2::frequency_list_merge (FrequencyItems const& items)
|
|||||||
m_->add (items);
|
m_->add (items);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int FrequencyList_v2::best_working_frequency (Frequency f) const
|
int FrequencyList_v2::best_working_frequency (Frequency f) const
|
||||||
{
|
{
|
||||||
int result {-1};
|
int result {-1};
|
||||||
@ -761,6 +797,93 @@ QVariant FrequencyList_v2::impl::data (QModelIndex const& index, int role) const
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case description_column:
|
||||||
|
switch (role)
|
||||||
|
{
|
||||||
|
case SortRole:
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
case Qt::EditRole:
|
||||||
|
case Qt::AccessibleTextRole:
|
||||||
|
item = frequency_item.description_;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Qt::ToolTipRole:
|
||||||
|
case Qt::AccessibleDescriptionRole:
|
||||||
|
item = tr ("Description");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Qt::TextAlignmentRole:
|
||||||
|
item = Qt::AlignLeft + Qt::AlignVCenter;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case source_column:
|
||||||
|
switch (role)
|
||||||
|
{
|
||||||
|
case SortRole:
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
case Qt::EditRole:
|
||||||
|
case Qt::AccessibleTextRole:
|
||||||
|
item = frequency_item.start_time_ == frequency_item.end_time_
|
||||||
|
? tr ("Equal")
|
||||||
|
: tr ("NOTEQUAL");
|
||||||
|
item = frequency_item.source_;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Qt::ToolTipRole:
|
||||||
|
case Qt::AccessibleDescriptionRole:
|
||||||
|
item = tr ("Source");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Qt::TextAlignmentRole:
|
||||||
|
item = Qt::AlignLeft + Qt::AlignVCenter;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case start_time_column:
|
||||||
|
switch (role)
|
||||||
|
{
|
||||||
|
case SortRole:
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
case Qt::EditRole:
|
||||||
|
case Qt::AccessibleTextRole:
|
||||||
|
item = frequency_item.start_time_.toString(Qt::ISODate);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Qt::ToolTipRole:
|
||||||
|
case Qt::AccessibleDescriptionRole:
|
||||||
|
item = tr ("Start Time");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Qt::TextAlignmentRole:
|
||||||
|
item = Qt::AlignLeft + Qt::AlignVCenter;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case end_time_column:
|
||||||
|
switch (role)
|
||||||
|
{
|
||||||
|
case SortRole:
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
case Qt::EditRole:
|
||||||
|
case Qt::AccessibleTextRole:
|
||||||
|
item = frequency_item.end_time_.toString(Qt::ISODate);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Qt::ToolTipRole:
|
||||||
|
case Qt::AccessibleDescriptionRole:
|
||||||
|
item = tr ("End Time");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Qt::TextAlignmentRole:
|
||||||
|
item = Qt::AlignLeft + Qt::AlignVCenter;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return item;
|
return item;
|
||||||
@ -837,6 +960,10 @@ QVariant FrequencyList_v2::impl::headerData (int section, Qt::Orientation orient
|
|||||||
case mode_column: header = tr ("Mode"); break;
|
case mode_column: header = tr ("Mode"); break;
|
||||||
case frequency_column: header = tr ("Frequency"); break;
|
case frequency_column: header = tr ("Frequency"); break;
|
||||||
case frequency_mhz_column: header = tr ("Frequency (MHz)"); break;
|
case frequency_mhz_column: header = tr ("Frequency (MHz)"); break;
|
||||||
|
case description_column: header = tr ("Description"); break;
|
||||||
|
case source_column: header = tr ("Source"); break;
|
||||||
|
case start_time_column: header = tr ("Start"); break;
|
||||||
|
case end_time_column: header = tr ("End"); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -868,7 +995,7 @@ bool FrequencyList_v2::impl::insertRows (int row, int count, QModelIndex const&
|
|||||||
beginInsertRows (parent, row, row + count - 1);
|
beginInsertRows (parent, row, row + count - 1);
|
||||||
for (auto r = 0; r < count; ++r)
|
for (auto r = 0; r < count; ++r)
|
||||||
{
|
{
|
||||||
frequency_list_.insert (row, Item {0, Mode::ALL, IARURegions::ALL});
|
frequency_list_.insert (row, Item {0, Mode::ALL, IARURegions::ALL, QString(), QString(), QDateTime(), QDateTime()});
|
||||||
}
|
}
|
||||||
endInsertRows ();
|
endInsertRows ();
|
||||||
return true;
|
return true;
|
||||||
@ -977,6 +1104,53 @@ auto FrequencyList_v2::all_bands (Region region, Mode mode) const -> BandSet
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// write JSON format to a file
|
||||||
|
void FrequencyList_v2::to_json_stream(QDataStream *ods, QString magic_s, QString version_s,
|
||||||
|
FrequencyItems const &frequency_items)
|
||||||
|
{
|
||||||
|
QJsonObject jobject{
|
||||||
|
{"wsjtx_file", "qrg"},
|
||||||
|
{"wsjtx_version", QCoreApplication::applicationVersion()+" "+revision()},
|
||||||
|
{"generated_at", QDateTime::currentDateTimeUtc ().toString (Qt::ISODate)},
|
||||||
|
{"wsjtx_filetype", magic_s},
|
||||||
|
{"qrg_version", version_s},
|
||||||
|
{"frequency_count", frequency_items.count()}};
|
||||||
|
|
||||||
|
QJsonArray array;
|
||||||
|
for (auto &item: frequency_items)
|
||||||
|
array.append(item.toJson());
|
||||||
|
jobject["frequencies"] = array;
|
||||||
|
|
||||||
|
QJsonDocument d = QJsonDocument(jobject);
|
||||||
|
ods->writeRawData(d.toJson().data(), d.toJson().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
QTextStream& qStdOut()
|
||||||
|
{
|
||||||
|
static QTextStream ts( stdout );
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
FrequencyList_v2::FrequencyItems FrequencyList_v2::from_json_file(QFile *input_file)
|
||||||
|
{
|
||||||
|
// attempt to read the file as JSON
|
||||||
|
FrequencyList_v2::FrequencyItems list;
|
||||||
|
QByteArray jsonData = input_file->readAll();
|
||||||
|
QJsonDocument jsonDoc(QJsonDocument::fromJson(jsonData));
|
||||||
|
QJsonArray array = jsonDoc.object().value("frequencies").toArray();
|
||||||
|
qStdOut() << "Frequencies read";
|
||||||
|
qStdOut() << array.count();
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
// previous version 100 of the FrequencyList_v2 class
|
||||||
|
QDataStream& operator >> (QDataStream& is, FrequencyList_v2_100::Item& item)
|
||||||
|
{
|
||||||
|
return is >> item.frequency_
|
||||||
|
>> item.mode_
|
||||||
|
>> item.region_;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Obsolete version of FrequencyList no longer used but needed to
|
// Obsolete version of FrequencyList no longer used but needed to
|
||||||
// allow loading and saving of old settings contents without damage
|
// allow loading and saving of old settings contents without damage
|
||||||
|
@ -5,6 +5,10 @@
|
|||||||
|
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QSortFilterProxyModel>
|
#include <QSortFilterProxyModel>
|
||||||
|
#include <QDateTime>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QFile>
|
||||||
|
|
||||||
#include "Radio.hpp"
|
#include "Radio.hpp"
|
||||||
#include "IARURegions.hpp"
|
#include "IARURegions.hpp"
|
||||||
@ -53,11 +57,18 @@ public:
|
|||||||
Mode mode_;
|
Mode mode_;
|
||||||
Region region_;
|
Region region_;
|
||||||
QString toString () const;
|
QString toString () const;
|
||||||
|
bool isSane() const;
|
||||||
|
QJsonObject toJson () const;
|
||||||
|
QString description_;
|
||||||
|
QString source_;
|
||||||
|
QDateTime start_time_;
|
||||||
|
QDateTime end_time_;
|
||||||
|
|
||||||
};
|
};
|
||||||
using FrequencyItems = QList<Item>;
|
using FrequencyItems = QList<Item>;
|
||||||
using BandSet = QSet<QString>;
|
using BandSet = QSet<QString>;
|
||||||
|
|
||||||
enum Column {region_column, mode_column, frequency_column, frequency_mhz_column, SENTINAL};
|
enum Column {region_column, mode_column, frequency_column, frequency_mhz_column, description_column, start_time_column, end_time_column, source_column, SENTINAL};
|
||||||
|
|
||||||
// an iterator that meets the requirements of the C++ for range statement
|
// an iterator that meets the requirements of the C++ for range statement
|
||||||
class const_iterator
|
class const_iterator
|
||||||
@ -78,9 +89,11 @@ public:
|
|||||||
private:
|
private:
|
||||||
FrequencyList_v2 const * parent_;
|
FrequencyList_v2 const * parent_;
|
||||||
int row_;
|
int row_;
|
||||||
|
//qint32 qrg_version_;
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit FrequencyList_v2 (Bands const *, QObject * parent = nullptr);
|
explicit FrequencyList_v2 (Bands const *, QObject * parent = nullptr);
|
||||||
|
|
||||||
~FrequencyList_v2 ();
|
~FrequencyList_v2 ();
|
||||||
|
|
||||||
// Load and store underlying items
|
// Load and store underlying items
|
||||||
@ -88,6 +101,8 @@ public:
|
|||||||
FrequencyItems const& frequency_list () const;
|
FrequencyItems const& frequency_list () const;
|
||||||
FrequencyItems frequency_list (QModelIndexList const&) const;
|
FrequencyItems frequency_list (QModelIndexList const&) const;
|
||||||
void frequency_list_merge (FrequencyItems const&);
|
void frequency_list_merge (FrequencyItems const&);
|
||||||
|
void to_json_stream(QDataStream *, QString, QString, FrequencyItems const&);
|
||||||
|
FrequencyList_v2::FrequencyItems from_json_file(QFile *);
|
||||||
|
|
||||||
// Iterators for the sorted and filtered items
|
// Iterators for the sorted and filtered items
|
||||||
//
|
//
|
||||||
@ -156,6 +171,31 @@ QDebug operator << (QDebug, FrequencyList_v2::Item const&);
|
|||||||
Q_DECLARE_METATYPE (FrequencyList_v2::Item);
|
Q_DECLARE_METATYPE (FrequencyList_v2::Item);
|
||||||
Q_DECLARE_METATYPE (FrequencyList_v2::FrequencyItems);
|
Q_DECLARE_METATYPE (FrequencyList_v2::FrequencyItems);
|
||||||
|
|
||||||
|
class FrequencyList_v2_100 final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using Frequency = Radio::Frequency;
|
||||||
|
using Mode = Modes::Mode;
|
||||||
|
using Region = IARURegions::Region;
|
||||||
|
|
||||||
|
struct Item
|
||||||
|
{
|
||||||
|
Frequency frequency_;
|
||||||
|
Mode mode_;
|
||||||
|
Region region_;
|
||||||
|
QString toString () const;
|
||||||
|
};
|
||||||
|
using FrequencyItems = QList<Item>;
|
||||||
|
|
||||||
|
private:
|
||||||
|
FrequencyItems frequency_list_;
|
||||||
|
};
|
||||||
|
|
||||||
|
QDataStream& operator << (QDataStream&, FrequencyList_v2_100::Item const&);
|
||||||
|
QDataStream& operator >> (QDataStream&, FrequencyList_v2_100::Item&);
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE (FrequencyList_v2_100::Item);
|
||||||
|
Q_DECLARE_METATYPE (FrequencyList_v2_100::FrequencyItems);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Obsolete version of FrequencyList no longer used but needed to
|
// Obsolete version of FrequencyList no longer used but needed to
|
||||||
|
Loading…
x
Reference in New Issue
Block a user