Compare commits
85 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9423640e52 | |||
| 952cc0b844 | |||
| 0bd7a74103 | |||
| 82a0cdd0cf | |||
| 7f187f4cf8 | |||
| f2ba541f09 | |||
| e9d2d59842 | |||
| bda9a5202e | |||
| 40e1bfab0e | |||
| b031a2cdbe | |||
| a2c6451b47 | |||
| 3f6c87b200 | |||
| fa4c39495d | |||
| 5f3b74338c | |||
| d1ccbc599b | |||
| 6e036b7d58 | |||
| 1629415dc1 | |||
| 08cf869125 | |||
| 03bd44ae39 | |||
| 14626978c0 | |||
| dd43f0db84 | |||
| 5646268faf | |||
| 5d21fdf1dc | |||
| 5d2ba76c17 | |||
| 7bd86ca177 | |||
| 59b1a3b011 | |||
| ce2c045458 | |||
| 218c5b3d47 | |||
| 27ae28a889 | |||
| 1a2596224a | |||
| 82915540b4 | |||
| 73c6dd50fb | |||
| ee48d8fd86 | |||
| d8a16f4a42 | |||
| 5ef440faf6 | |||
| 9d9ae62526 | |||
| 6b9c9b4ceb | |||
| 1febb18495 | |||
| 43401c3c26 | |||
| 55928be661 | |||
| a5f8593b3d | |||
| 07f1594d0a | |||
| b6dd6aadc8 | |||
| b9b334c6cf | |||
| fec45aa0ad | |||
| 2ef4e90710 | |||
| a0dc7bc013 | |||
| 84a3ef6046 | |||
| 5565a7731e | |||
| 1c1c5bf50a | |||
| b34c0fd2e4 | |||
| fddb618fa2 | |||
| 7101aec331 | |||
| 7b3bc259c6 | |||
| f7ebd8d783 | |||
| 8b3b34d876 | |||
| 538c70d158 | |||
| 35be0fcc29 | |||
| ee339431c7 | |||
| 8186348abe | |||
| f0ceb0f7f4 | |||
| bb4b79d797 | |||
| f1ed44f9e9 | |||
| 0b9f75a9c8 | |||
| c011b80a5a | |||
| 5446c979e9 | |||
| eca6813d8f | |||
| ea718b0fc1 | |||
| 4f243b1e1a | |||
| ee350524fa | |||
| c4656fcada | |||
| ce66e86b48 | |||
| 0664704eaf | |||
| a95bc26e3e | |||
| 8da2f9f8d7 | |||
| dd78a9fe70 | |||
| 81af627836 | |||
| 35cfbbc2e5 | |||
| bb348763fb | |||
| 4e666fed67 | |||
| c8739a1fd6 | |||
| 0b2107402e | |||
| c31ea332d9 | |||
| 4c0c932238 | |||
| 3584fa4b5e |
@@ -243,6 +243,7 @@ set (wsjtx_CXXSRCS
|
|||||||
messagereplydialog.cpp
|
messagereplydialog.cpp
|
||||||
keyeater.cpp
|
keyeater.cpp
|
||||||
APRSISClient.cpp
|
APRSISClient.cpp
|
||||||
|
SpotClient.cpp
|
||||||
Inbox.cpp
|
Inbox.cpp
|
||||||
messagewindow.cpp
|
messagewindow.cpp
|
||||||
mainwindow.cpp
|
mainwindow.cpp
|
||||||
|
|||||||
+36
-23
@@ -455,7 +455,7 @@ private:
|
|||||||
Q_SLOT void on_delete_macro_push_button_clicked (bool = false);
|
Q_SLOT void on_delete_macro_push_button_clicked (bool = false);
|
||||||
Q_SLOT void on_PTT_method_button_group_buttonClicked (int);
|
Q_SLOT void on_PTT_method_button_group_buttonClicked (int);
|
||||||
Q_SLOT void on_groups_line_edit_textChanged(QString const&);
|
Q_SLOT void on_groups_line_edit_textChanged(QString const&);
|
||||||
Q_SLOT void on_qth_message_line_edit_textChanged(QString const&);
|
Q_SLOT void on_info_message_line_edit_textChanged(QString const&);
|
||||||
Q_SLOT void on_cq_message_line_edit_textChanged(QString const&);
|
Q_SLOT void on_cq_message_line_edit_textChanged(QString const&);
|
||||||
Q_SLOT void on_reply_message_line_edit_textChanged(QString const&);
|
Q_SLOT void on_reply_message_line_edit_textChanged(QString const&);
|
||||||
Q_SLOT void on_add_macro_line_edit_editingFinished ();
|
Q_SLOT void on_add_macro_line_edit_editingFinished ();
|
||||||
@@ -582,7 +582,7 @@ private:
|
|||||||
bool frequency_calibration_disabled_; // not persistent
|
bool frequency_calibration_disabled_; // not persistent
|
||||||
unsigned transceiver_command_number_;
|
unsigned transceiver_command_number_;
|
||||||
QString dynamic_grid_;
|
QString dynamic_grid_;
|
||||||
QString dynamic_qth_;
|
QString dynamic_info_;
|
||||||
|
|
||||||
// configuration fields that we publish
|
// configuration fields that we publish
|
||||||
bool auto_switch_bands_;
|
bool auto_switch_bands_;
|
||||||
@@ -591,7 +591,7 @@ private:
|
|||||||
QStringList my_groups_;
|
QStringList my_groups_;
|
||||||
QStringList auto_whitelist_;
|
QStringList auto_whitelist_;
|
||||||
QStringList auto_blacklist_;
|
QStringList auto_blacklist_;
|
||||||
QString my_qth_;
|
QString my_info_;
|
||||||
QString cq_;
|
QString cq_;
|
||||||
QString reply_;
|
QString reply_;
|
||||||
int callsign_aging_;
|
int callsign_aging_;
|
||||||
@@ -628,12 +628,14 @@ private:
|
|||||||
qint32 RxBandwidth_;
|
qint32 RxBandwidth_;
|
||||||
double degrade_;
|
double degrade_;
|
||||||
double txDelay_;
|
double txDelay_;
|
||||||
|
bool check_for_updates_;
|
||||||
bool id_after_73_;
|
bool id_after_73_;
|
||||||
bool tx_qsy_allowed_;
|
bool tx_qsy_allowed_;
|
||||||
bool spot_to_reporting_networks_;
|
bool spot_to_reporting_networks_;
|
||||||
bool transmit_directed_;
|
bool transmit_directed_;
|
||||||
bool autoreply_off_at_startup_;
|
bool autoreply_off_at_startup_;
|
||||||
bool heartbeat_anywhere_;
|
bool heartbeat_anywhere_;
|
||||||
|
bool heartbeat_qso_pause_;
|
||||||
bool relay_disabled_;
|
bool relay_disabled_;
|
||||||
bool monitor_off_at_startup_;
|
bool monitor_off_at_startup_;
|
||||||
bool monitor_last_used_;
|
bool monitor_last_used_;
|
||||||
@@ -749,6 +751,7 @@ qint32 Configuration::aggressive() const {return m_->aggressive_;}
|
|||||||
double Configuration::degrade() const {return m_->degrade_;}
|
double Configuration::degrade() const {return m_->degrade_;}
|
||||||
double Configuration::txDelay() const {return m_->txDelay_;}
|
double Configuration::txDelay() const {return m_->txDelay_;}
|
||||||
qint32 Configuration::RxBandwidth() const {return m_->RxBandwidth_;}
|
qint32 Configuration::RxBandwidth() const {return m_->RxBandwidth_;}
|
||||||
|
bool Configuration::check_for_updates() const { return m_->check_for_updates_; }
|
||||||
bool Configuration::id_after_73 () const {return m_->id_after_73_;}
|
bool Configuration::id_after_73 () const {return m_->id_after_73_;}
|
||||||
bool Configuration::tx_qsy_allowed () const {return m_->tx_qsy_allowed_;}
|
bool Configuration::tx_qsy_allowed () const {return m_->tx_qsy_allowed_;}
|
||||||
bool Configuration::spot_to_reporting_networks () const
|
bool Configuration::spot_to_reporting_networks () const
|
||||||
@@ -767,10 +770,11 @@ void Configuration::set_spot_to_reporting_networks (bool spot)
|
|||||||
bool Configuration::transmit_directed() const { return m_->transmit_directed_; }
|
bool Configuration::transmit_directed() const { return m_->transmit_directed_; }
|
||||||
bool Configuration::autoreply_off_at_startup () const {return m_->autoreply_off_at_startup_;}
|
bool Configuration::autoreply_off_at_startup () const {return m_->autoreply_off_at_startup_;}
|
||||||
bool Configuration::heartbeat_anywhere() const { return m_->heartbeat_anywhere_;}
|
bool Configuration::heartbeat_anywhere() const { return m_->heartbeat_anywhere_;}
|
||||||
|
bool Configuration::heartbeat_qso_pause() const { return m_->heartbeat_qso_pause_;}
|
||||||
bool Configuration::relay_off() const { return m_->relay_disabled_; }
|
bool Configuration::relay_off() const { return m_->relay_disabled_; }
|
||||||
bool Configuration::monitor_off_at_startup () const {return m_->monitor_off_at_startup_;}
|
bool Configuration::monitor_off_at_startup () const {return m_->monitor_off_at_startup_;}
|
||||||
bool Configuration::monitor_last_used () const {return m_->rig_is_dummy_ || m_->monitor_last_used_;}
|
bool Configuration::monitor_last_used () const {return m_->rig_is_dummy_ || m_->monitor_last_used_;}
|
||||||
bool Configuration::log_as_DATA () const {return m_->log_as_DATA_;}
|
bool Configuration::log_as_DATA () const { return false; }
|
||||||
bool Configuration::report_in_comments () const {return m_->report_in_comments_;}
|
bool Configuration::report_in_comments () const {return m_->report_in_comments_;}
|
||||||
bool Configuration::prompt_to_log () const {return m_->prompt_to_log_;}
|
bool Configuration::prompt_to_log () const {return m_->prompt_to_log_;}
|
||||||
bool Configuration::insert_blank () const {return m_->insert_blank_;}
|
bool Configuration::insert_blank () const {return m_->insert_blank_;}
|
||||||
@@ -779,6 +783,12 @@ bool Configuration::ppfx() const {return m_->ppfx_;}
|
|||||||
bool Configuration::clear_callsign () const {return m_->clear_callsign_;}
|
bool Configuration::clear_callsign () const {return m_->clear_callsign_;}
|
||||||
bool Configuration::miles () const {return m_->miles_;}
|
bool Configuration::miles () const {return m_->miles_;}
|
||||||
bool Configuration::avoid_allcall () const {return m_->avoid_allcall_;}
|
bool Configuration::avoid_allcall () const {return m_->avoid_allcall_;}
|
||||||
|
bool Configuration::set_avoid_allcall(bool avoid) {
|
||||||
|
if(m_->avoid_allcall_ != avoid){
|
||||||
|
m_->avoid_allcall_ = avoid;
|
||||||
|
m_->write_settings();
|
||||||
|
}
|
||||||
|
}
|
||||||
bool Configuration::spellcheck () const {return m_->spellcheck_;}
|
bool Configuration::spellcheck () const {return m_->spellcheck_;}
|
||||||
bool Configuration::quick_call () const {return m_->quick_call_;}
|
bool Configuration::quick_call () const {return m_->quick_call_;}
|
||||||
bool Configuration::disable_TX_on_73 () const {return m_->disable_TX_on_73_;}
|
bool Configuration::disable_TX_on_73 () const {return m_->disable_TX_on_73_;}
|
||||||
@@ -976,14 +986,14 @@ QSet<QString> Configuration::auto_blacklist() const {
|
|||||||
return QSet<QString>::fromList(m_->auto_blacklist_);
|
return QSet<QString>::fromList(m_->auto_blacklist_);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Configuration::my_qth() const
|
QString Configuration::my_info() const
|
||||||
{
|
{
|
||||||
auto qth = m_->my_qth_;
|
auto info = m_->my_info_;
|
||||||
if(m_->use_dynamic_info_ && !m_->dynamic_qth_.isEmpty()){
|
if(m_->use_dynamic_info_ && !m_->dynamic_info_.isEmpty()){
|
||||||
qth = m_->dynamic_qth_;
|
info = m_->dynamic_info_;
|
||||||
}
|
}
|
||||||
|
|
||||||
return qth.trimmed();
|
return info.trimmed();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Configuration::cq_message() const
|
QString Configuration::cq_message() const
|
||||||
@@ -1011,9 +1021,9 @@ void Configuration::set_dynamic_location (QString const& grid_descriptor)
|
|||||||
m_->dynamic_grid_ = grid_descriptor.trimmed ();
|
m_->dynamic_grid_ = grid_descriptor.trimmed ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Configuration::set_dynamic_station_qth(QString const& qth)
|
void Configuration::set_dynamic_station_info(QString const& info)
|
||||||
{
|
{
|
||||||
m_->dynamic_qth_ = qth.trimmed ();
|
m_->dynamic_info_ = info.trimmed ();
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@@ -1161,7 +1171,7 @@ Configuration::impl::impl (Configuration * self, QDir const& temp_directory,
|
|||||||
ui_->callsign_line_edit->setValidator (new CallsignValidator {this});
|
ui_->callsign_line_edit->setValidator (new CallsignValidator {this});
|
||||||
ui_->grid_line_edit->setValidator (new MaidenheadLocatorValidator {this, MaidenheadLocatorValidator::Length::doubleextended});
|
ui_->grid_line_edit->setValidator (new MaidenheadLocatorValidator {this, MaidenheadLocatorValidator::Length::doubleextended});
|
||||||
ui_->add_macro_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
|
ui_->add_macro_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
|
||||||
ui_->qth_message_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
|
ui_->info_message_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
|
||||||
ui_->reply_message_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
|
ui_->reply_message_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
|
||||||
ui_->cq_message_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
|
ui_->cq_message_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
|
||||||
ui_->groups_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
|
ui_->groups_line_edit->setValidator (new QRegExpValidator {message_alphabet, this});
|
||||||
@@ -1169,7 +1179,7 @@ Configuration::impl::impl (Configuration * self, QDir const& temp_directory,
|
|||||||
setUppercase(ui_->callsign_line_edit);
|
setUppercase(ui_->callsign_line_edit);
|
||||||
setUppercase(ui_->grid_line_edit);
|
setUppercase(ui_->grid_line_edit);
|
||||||
setUppercase(ui_->add_macro_line_edit);
|
setUppercase(ui_->add_macro_line_edit);
|
||||||
setUppercase(ui_->qth_message_line_edit);
|
setUppercase(ui_->info_message_line_edit);
|
||||||
setUppercase(ui_->reply_message_line_edit);
|
setUppercase(ui_->reply_message_line_edit);
|
||||||
setUppercase(ui_->cq_message_line_edit);
|
setUppercase(ui_->cq_message_line_edit);
|
||||||
setUppercase(ui_->groups_line_edit);
|
setUppercase(ui_->groups_line_edit);
|
||||||
@@ -1365,7 +1375,7 @@ void Configuration::impl::initialize_models ()
|
|||||||
ui_->groups_line_edit->setText(my_groups_.join(", "));
|
ui_->groups_line_edit->setText(my_groups_.join(", "));
|
||||||
ui_->auto_whitelist_line_edit->setText(auto_whitelist_.join(", "));
|
ui_->auto_whitelist_line_edit->setText(auto_whitelist_.join(", "));
|
||||||
ui_->auto_blacklist_line_edit->setText(auto_blacklist_.join(", "));
|
ui_->auto_blacklist_line_edit->setText(auto_blacklist_.join(", "));
|
||||||
ui_->qth_message_line_edit->setText (my_qth_.toUpper());
|
ui_->info_message_line_edit->setText (my_info_.toUpper());
|
||||||
ui_->cq_message_line_edit->setText(cq_.toUpper());
|
ui_->cq_message_line_edit->setText(cq_.toUpper());
|
||||||
ui_->reply_message_line_edit->setText (reply_.toUpper());
|
ui_->reply_message_line_edit->setText (reply_.toUpper());
|
||||||
ui_->use_dynamic_grid->setChecked(use_dynamic_info_);
|
ui_->use_dynamic_grid->setChecked(use_dynamic_info_);
|
||||||
@@ -1392,12 +1402,14 @@ void Configuration::impl::initialize_models ()
|
|||||||
ui_->sound_cq_path_display_label->setText(sound_cq_path_);
|
ui_->sound_cq_path_display_label->setText(sound_cq_path_);
|
||||||
ui_->sound_dm_path_display_label->setText(sound_dm_path_);
|
ui_->sound_dm_path_display_label->setText(sound_dm_path_);
|
||||||
ui_->sound_am_path_display_label->setText(sound_am_path_);
|
ui_->sound_am_path_display_label->setText(sound_am_path_);
|
||||||
|
ui_->checkForUpdates_checkBox->setChecked (check_for_updates_);
|
||||||
ui_->CW_id_after_73_check_box->setChecked (id_after_73_);
|
ui_->CW_id_after_73_check_box->setChecked (id_after_73_);
|
||||||
ui_->tx_qsy_check_box->setChecked (tx_qsy_allowed_);
|
ui_->tx_qsy_check_box->setChecked (tx_qsy_allowed_);
|
||||||
ui_->psk_reporter_check_box->setChecked (spot_to_reporting_networks_);
|
ui_->psk_reporter_check_box->setChecked (spot_to_reporting_networks_);
|
||||||
ui_->transmit_directed_check_box->setChecked(transmit_directed_);
|
ui_->transmit_directed_check_box->setChecked(transmit_directed_);
|
||||||
ui_->autoreply_off_check_box->setChecked (autoreply_off_at_startup_);
|
ui_->autoreply_off_check_box->setChecked (autoreply_off_at_startup_);
|
||||||
ui_->heartbeat_anywhere_check_box->setChecked(heartbeat_anywhere_);
|
ui_->heartbeat_anywhere_check_box->setChecked(heartbeat_anywhere_);
|
||||||
|
ui_->heartbeat_qso_pause_check_box->setChecked(heartbeat_qso_pause_);
|
||||||
ui_->relay_disabled_check_box->setChecked(relay_disabled_);
|
ui_->relay_disabled_check_box->setChecked(relay_disabled_);
|
||||||
ui_->monitor_off_check_box->setChecked (monitor_off_at_startup_);
|
ui_->monitor_off_check_box->setChecked (monitor_off_at_startup_);
|
||||||
ui_->monitor_last_used_check_box->setChecked (monitor_last_used_);
|
ui_->monitor_last_used_check_box->setChecked (monitor_last_used_);
|
||||||
@@ -1512,7 +1524,7 @@ void Configuration::impl::read_settings ()
|
|||||||
auto_blacklist_ = settings_->value("AutoBlacklist", QStringList{}).toStringList();
|
auto_blacklist_ = settings_->value("AutoBlacklist", QStringList{}).toStringList();
|
||||||
callsign_aging_ = settings_->value ("CallsignAging", 0).toInt ();
|
callsign_aging_ = settings_->value ("CallsignAging", 0).toInt ();
|
||||||
activity_aging_ = settings_->value ("ActivityAging", 2).toInt ();
|
activity_aging_ = settings_->value ("ActivityAging", 2).toInt ();
|
||||||
my_qth_ = settings_->value("MyQTH", QString {}).toString();
|
my_info_ = settings_->value("MyInfo", QString {}).toString();
|
||||||
cq_ = settings_->value("CQMessage", QString {"CQCQCQ <MYGRID4>"}).toString();
|
cq_ = settings_->value("CQMessage", QString {"CQCQCQ <MYGRID4>"}).toString();
|
||||||
reply_ = settings_->value("Reply", QString {"HW CPY?"}).toString();
|
reply_ = settings_->value("Reply", QString {"HW CPY?"}).toString();
|
||||||
next_color_cq_ = color_cq_ = settings_->value("colorCQ","#66ff66").toString();
|
next_color_cq_ = color_cq_ = settings_->value("colorCQ","#66ff66").toString();
|
||||||
@@ -1663,10 +1675,12 @@ void Configuration::impl::read_settings ()
|
|||||||
transmit_directed_ = settings_->value ("TransmitDirected", true).toBool();
|
transmit_directed_ = settings_->value ("TransmitDirected", true).toBool();
|
||||||
autoreply_off_at_startup_ = settings_->value ("AutoreplyOFF", false).toBool ();
|
autoreply_off_at_startup_ = settings_->value ("AutoreplyOFF", false).toBool ();
|
||||||
heartbeat_anywhere_ = settings_->value("BeaconAnywhere", false).toBool();
|
heartbeat_anywhere_ = settings_->value("BeaconAnywhere", false).toBool();
|
||||||
|
heartbeat_qso_pause_ = settings_->value("HeartbeatQSOPause", true).toBool();
|
||||||
relay_disabled_ = settings_->value ("RelayOFF", false).toBool ();
|
relay_disabled_ = settings_->value ("RelayOFF", false).toBool ();
|
||||||
monitor_off_at_startup_ = settings_->value ("MonitorOFF", false).toBool ();
|
monitor_off_at_startup_ = settings_->value ("MonitorOFF", false).toBool ();
|
||||||
monitor_last_used_ = settings_->value ("MonitorLastUsed", false).toBool ();
|
monitor_last_used_ = settings_->value ("MonitorLastUsed", false).toBool ();
|
||||||
spot_to_reporting_networks_ = settings_->value ("PSKReporter", true).toBool ();
|
spot_to_reporting_networks_ = settings_->value ("PSKReporter", true).toBool ();
|
||||||
|
check_for_updates_ = settings_->value("CheckForUpdates", true).toBool();
|
||||||
id_after_73_ = settings_->value ("After73", false).toBool ();
|
id_after_73_ = settings_->value ("After73", false).toBool ();
|
||||||
tx_qsy_allowed_ = settings_->value ("TxQSYAllowed", false).toBool ();
|
tx_qsy_allowed_ = settings_->value ("TxQSYAllowed", false).toBool ();
|
||||||
use_dynamic_info_ = settings_->value ("AutoGrid", false).toBool ();
|
use_dynamic_info_ = settings_->value ("AutoGrid", false).toBool ();
|
||||||
@@ -1771,7 +1785,7 @@ void Configuration::impl::write_settings ()
|
|||||||
settings_->setValue ("MyGroups", my_groups_);
|
settings_->setValue ("MyGroups", my_groups_);
|
||||||
settings_->setValue ("AutoWhitelist", auto_whitelist_);
|
settings_->setValue ("AutoWhitelist", auto_whitelist_);
|
||||||
settings_->setValue ("AutoBlacklist", auto_blacklist_);
|
settings_->setValue ("AutoBlacklist", auto_blacklist_);
|
||||||
settings_->setValue ("MyQTH", my_qth_);
|
settings_->setValue ("MyInfo", my_info_);
|
||||||
settings_->setValue ("CQMessage", cq_);
|
settings_->setValue ("CQMessage", cq_);
|
||||||
settings_->setValue ("Reply", reply_);
|
settings_->setValue ("Reply", reply_);
|
||||||
settings_->setValue ("CallsignAging", callsign_aging_);
|
settings_->setValue ("CallsignAging", callsign_aging_);
|
||||||
@@ -1834,10 +1848,12 @@ void Configuration::impl::write_settings ()
|
|||||||
settings_->setValue ("TransmitDirected", transmit_directed_);
|
settings_->setValue ("TransmitDirected", transmit_directed_);
|
||||||
settings_->setValue ("AutoreplyOFF", autoreply_off_at_startup_);
|
settings_->setValue ("AutoreplyOFF", autoreply_off_at_startup_);
|
||||||
settings_->setValue ("BeaconAnywhere", heartbeat_anywhere_);
|
settings_->setValue ("BeaconAnywhere", heartbeat_anywhere_);
|
||||||
|
settings_->setValue ("HeartbeatQSOPause", heartbeat_qso_pause_);
|
||||||
settings_->setValue ("RelayOFF", relay_disabled_);
|
settings_->setValue ("RelayOFF", relay_disabled_);
|
||||||
settings_->setValue ("MonitorOFF", monitor_off_at_startup_);
|
settings_->setValue ("MonitorOFF", monitor_off_at_startup_);
|
||||||
settings_->setValue ("MonitorLastUsed", monitor_last_used_);
|
settings_->setValue ("MonitorLastUsed", monitor_last_used_);
|
||||||
settings_->setValue ("PSKReporter", spot_to_reporting_networks_);
|
settings_->setValue ("PSKReporter", spot_to_reporting_networks_);
|
||||||
|
settings_->setValue ("CheckForUpdates", check_for_updates_);
|
||||||
settings_->setValue ("After73", id_after_73_);
|
settings_->setValue ("After73", id_after_73_);
|
||||||
settings_->setValue ("TxQSYAllowed", tx_qsy_allowed_);
|
settings_->setValue ("TxQSYAllowed", tx_qsy_allowed_);
|
||||||
settings_->setValue ("Macros", macros_.stringList ());
|
settings_->setValue ("Macros", macros_.stringList ());
|
||||||
@@ -1929,11 +1945,6 @@ void Configuration::impl::set_rig_invariants ()
|
|||||||
// only enable CAT option if transceiver has CAT PTT
|
// only enable CAT option if transceiver has CAT PTT
|
||||||
ui_->PTT_CAT_radio_button->setEnabled (CAT_PTT_enabled);
|
ui_->PTT_CAT_radio_button->setEnabled (CAT_PTT_enabled);
|
||||||
|
|
||||||
// if CAT PTT is not enabled, select VOX instead
|
|
||||||
if(!CAT_PTT_enabled){
|
|
||||||
ui_->PTT_VOX_radio_button->setChecked(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto enable_ptt_port = TransceiverFactory::PTT_method_CAT != ptt_method && TransceiverFactory::PTT_method_VOX != ptt_method;
|
auto enable_ptt_port = TransceiverFactory::PTT_method_CAT != ptt_method && TransceiverFactory::PTT_method_VOX != ptt_method;
|
||||||
ui_->PTT_port_combo_box->setEnabled (enable_ptt_port);
|
ui_->PTT_port_combo_box->setEnabled (enable_ptt_port);
|
||||||
// if PTT port is not enabled, fill it with the text of the CAT port
|
// if PTT port is not enabled, fill it with the text of the CAT port
|
||||||
@@ -2365,7 +2376,7 @@ void Configuration::impl::accept ()
|
|||||||
auto_blacklist_ = splitCalls(ui_->auto_blacklist_line_edit->text().toUpper().trimmed());
|
auto_blacklist_ = splitCalls(ui_->auto_blacklist_line_edit->text().toUpper().trimmed());
|
||||||
cq_ = ui_->cq_message_line_edit->text().toUpper();
|
cq_ = ui_->cq_message_line_edit->text().toUpper();
|
||||||
reply_ = ui_->reply_message_line_edit->text().toUpper();
|
reply_ = ui_->reply_message_line_edit->text().toUpper();
|
||||||
my_qth_ = ui_->qth_message_line_edit->text().toUpper();
|
my_info_ = ui_->info_message_line_edit->text().toUpper();
|
||||||
callsign_aging_ = ui_->callsign_aging_spin_box->value();
|
callsign_aging_ = ui_->callsign_aging_spin_box->value();
|
||||||
activity_aging_ = ui_->activity_aging_spin_box->value();
|
activity_aging_ = ui_->activity_aging_spin_box->value();
|
||||||
spot_to_reporting_networks_ = ui_->psk_reporter_check_box->isChecked ();
|
spot_to_reporting_networks_ = ui_->psk_reporter_check_box->isChecked ();
|
||||||
@@ -2375,11 +2386,13 @@ void Configuration::impl::accept ()
|
|||||||
aggressive_ = ui_->sbAggressive->value ();
|
aggressive_ = ui_->sbAggressive->value ();
|
||||||
degrade_ = ui_->sbDegrade->value ();
|
degrade_ = ui_->sbDegrade->value ();
|
||||||
RxBandwidth_ = ui_->sbBandwidth->value ();
|
RxBandwidth_ = ui_->sbBandwidth->value ();
|
||||||
|
check_for_updates_ = ui_->checkForUpdates_checkBox->isChecked();
|
||||||
id_after_73_ = ui_->CW_id_after_73_check_box->isChecked ();
|
id_after_73_ = ui_->CW_id_after_73_check_box->isChecked ();
|
||||||
tx_qsy_allowed_ = ui_->tx_qsy_check_box->isChecked ();
|
tx_qsy_allowed_ = ui_->tx_qsy_check_box->isChecked ();
|
||||||
transmit_directed_ = ui_->transmit_directed_check_box->isChecked();
|
transmit_directed_ = ui_->transmit_directed_check_box->isChecked();
|
||||||
autoreply_off_at_startup_ = ui_->autoreply_off_check_box->isChecked ();
|
autoreply_off_at_startup_ = ui_->autoreply_off_check_box->isChecked ();
|
||||||
heartbeat_anywhere_ = ui_->heartbeat_anywhere_check_box->isChecked();
|
heartbeat_anywhere_ = ui_->heartbeat_anywhere_check_box->isChecked();
|
||||||
|
heartbeat_qso_pause_ = ui_->heartbeat_qso_pause_check_box->isChecked();
|
||||||
relay_disabled_ = ui_->relay_disabled_check_box->isChecked();
|
relay_disabled_ = ui_->relay_disabled_check_box->isChecked();
|
||||||
monitor_off_at_startup_ = ui_->monitor_off_check_box->isChecked ();
|
monitor_off_at_startup_ = ui_->monitor_off_check_box->isChecked ();
|
||||||
monitor_last_used_ = ui_->monitor_last_used_check_box->isChecked ();
|
monitor_last_used_ = ui_->monitor_last_used_check_box->isChecked ();
|
||||||
@@ -2792,7 +2805,7 @@ void Configuration::impl::on_groups_line_edit_textChanged(QString const &text)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void Configuration::impl::on_qth_message_line_edit_textChanged(QString const &text)
|
void Configuration::impl::on_info_message_line_edit_textChanged(QString const &text)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -104,7 +104,7 @@ public:
|
|||||||
QSet<QString> auto_blacklist() const;
|
QSet<QString> auto_blacklist() const;
|
||||||
int activity_aging() const;
|
int activity_aging() const;
|
||||||
int callsign_aging() const;
|
int callsign_aging() const;
|
||||||
QString my_qth () const;
|
QString my_info () const;
|
||||||
QString cq_message () const;
|
QString cq_message () const;
|
||||||
QString reply_message () const;
|
QString reply_message () const;
|
||||||
QFont table_font() const;
|
QFont table_font() const;
|
||||||
@@ -118,6 +118,7 @@ public:
|
|||||||
qint32 RxBandwidth() const;
|
qint32 RxBandwidth() const;
|
||||||
double degrade() const;
|
double degrade() const;
|
||||||
double txDelay() const;
|
double txDelay() const;
|
||||||
|
bool check_for_updates() const;
|
||||||
bool id_after_73 () const;
|
bool id_after_73 () const;
|
||||||
bool tx_qsy_allowed () const;
|
bool tx_qsy_allowed () const;
|
||||||
bool spot_to_reporting_networks () const;
|
bool spot_to_reporting_networks () const;
|
||||||
@@ -125,6 +126,7 @@ public:
|
|||||||
bool transmit_directed() const;
|
bool transmit_directed() const;
|
||||||
bool autoreply_off_at_startup () const;
|
bool autoreply_off_at_startup () const;
|
||||||
bool heartbeat_anywhere() const;
|
bool heartbeat_anywhere() const;
|
||||||
|
bool heartbeat_qso_pause() const;
|
||||||
bool relay_off() const;
|
bool relay_off() const;
|
||||||
bool monitor_off_at_startup () const;
|
bool monitor_off_at_startup () const;
|
||||||
bool monitor_last_used () const;
|
bool monitor_last_used () const;
|
||||||
@@ -137,6 +139,7 @@ public:
|
|||||||
bool clear_callsign () const;
|
bool clear_callsign () const;
|
||||||
bool miles () const;
|
bool miles () const;
|
||||||
bool avoid_allcall () const;
|
bool avoid_allcall () const;
|
||||||
|
bool set_avoid_allcall (bool avoid);
|
||||||
bool spellcheck() const;
|
bool spellcheck() const;
|
||||||
bool quick_call () const;
|
bool quick_call () const;
|
||||||
bool disable_TX_on_73 () const;
|
bool disable_TX_on_73 () const;
|
||||||
@@ -234,7 +237,7 @@ public:
|
|||||||
void set_dynamic_location (QString const&);
|
void set_dynamic_location (QString const&);
|
||||||
|
|
||||||
// Set the dynamic station qth message which is only used if configuration setting is enabled.
|
// Set the dynamic station qth message which is only used if configuration setting is enabled.
|
||||||
void set_dynamic_station_qth(QString const& qth);
|
void set_dynamic_station_info(QString const& info);
|
||||||
|
|
||||||
|
|
||||||
// This method queries if a CAT and PTT connection is operational.
|
// This method queries if a CAT and PTT connection is operational.
|
||||||
|
|||||||
+153
-67
@@ -36,7 +36,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QTabWidget" name="tabWidget_2">
|
<widget class="QTabWidget" name="tabWidget_2">
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>1</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="stationTab">
|
<widget class="QWidget" name="stationTab">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>738</width>
|
<width>738</width>
|
||||||
<height>453</height>
|
<height>448</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
@@ -88,6 +88,16 @@
|
|||||||
<string>Station Details</string>
|
<string>Station Details</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_13">
|
<layout class="QGridLayout" name="gridLayout_13">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="callsign_label">
|
||||||
|
<property name="text">
|
||||||
|
<string>My Callsign:</string>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>callsign_line_edit</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="grid_label">
|
<widget class="QLabel" name="grid_label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -121,16 +131,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QLabel" name="callsign_label">
|
|
||||||
<property name="text">
|
|
||||||
<string>My Callsign:</string>
|
|
||||||
</property>
|
|
||||||
<property name="buddy">
|
|
||||||
<cstring>callsign_line_edit</cstring>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="3" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QLabel" name="groups_label">
|
<widget class="QLabel" name="groups_label">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -216,7 +216,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="2" column="1">
|
||||||
<widget class="QLineEdit" name="qth_message_line_edit">
|
<widget class="QLineEdit" name="info_message_line_edit">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Station location message that is transmitted in response to &quot;@&quot; directed queries.</p></body></html></string>
|
<string><html><head/><body><p>Station location message that is transmitted in response to &quot;@&quot; directed queries.</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
@@ -228,7 +228,7 @@
|
|||||||
<string><html><head/><body><p>Station location message</p></body></html></string>
|
<string><html><head/><body><p>Station location message</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Station Message (QTH & Equipment):</string>
|
<string>Station Info (Rig, Antenna, Location, etc):</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -278,8 +278,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>724</width>
|
<width>726</width>
|
||||||
<height>617</height>
|
<height>631</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_26">
|
<layout class="QVBoxLayout" name="verticalLayout_26">
|
||||||
@@ -369,7 +369,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="transmit_directed_check_box">
|
<widget class="QCheckBox" name="transmit_directed_check_box">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Immediately transmit CQ, Reply, QTH, Saved, and Directed messages from the menu</string>
|
<string>Immediately transmit CQ, Reply, Info, Saved, and Directed messages from the menu</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -380,6 +380,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="heartbeat_qso_pause_check_box">
|
||||||
|
<property name="text">
|
||||||
|
<string>Pause heartbeat transmissions while in a QSO (i.e., callsign is selected)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="spellcheck_check_box">
|
<widget class="QCheckBox" name="spellcheck_check_box">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -387,6 +394,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="checkForUpdates_checkBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>Check for software updates at startup</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
||||||
<item>
|
<item>
|
||||||
@@ -911,8 +925,8 @@ text message.</string>
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>718</width>
|
<width>285</width>
|
||||||
<height>435</height>
|
<height>397</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_27">
|
<layout class="QVBoxLayout" name="verticalLayout_27">
|
||||||
@@ -1332,8 +1346,8 @@ a few, particularly some Kenwood rigs, require it).</string>
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>237</width>
|
<width>257</width>
|
||||||
<height>467</height>
|
<height>427</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_28">
|
<layout class="QVBoxLayout" name="verticalLayout_28">
|
||||||
@@ -1760,8 +1774,8 @@ radio interface behave as expected.</string>
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>760</width>
|
<width>267</width>
|
||||||
<height>502</height>
|
<height>302</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_29">
|
<layout class="QVBoxLayout" name="verticalLayout_29">
|
||||||
@@ -2073,8 +2087,8 @@ both here.</string>
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>746</width>
|
<width>572</width>
|
||||||
<height>525</height>
|
<height>498</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_30">
|
<layout class="QVBoxLayout" name="verticalLayout_30">
|
||||||
@@ -2101,7 +2115,7 @@ both here.</string>
|
|||||||
<item row="0" column="3">
|
<item row="0" column="3">
|
||||||
<widget class="QLabel" name="label_13">
|
<widget class="QLabel" name="label_13">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Op Call:</string>
|
<string>Operator Callsign (if different than Station Callsign):</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -2146,6 +2160,9 @@ both here.</string>
|
|||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
<widget class="QCheckBox" name="log_as_RTTY_check_box">
|
<widget class="QCheckBox" name="log_as_RTTY_check_box">
|
||||||
|
<property name="visible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Some logging programs will not accept JT-65 or JT9 as a recognized mode.</string>
|
<string>Some logging programs will not accept JT-65 or JT9 as a recognized mode.</string>
|
||||||
</property>
|
</property>
|
||||||
@@ -2175,6 +2192,9 @@ comments field.</string>
|
|||||||
</item>
|
</item>
|
||||||
<item row="0" column="2">
|
<item row="0" column="2">
|
||||||
<spacer name="horizontalSpacer">
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="visible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
@@ -2332,7 +2352,7 @@ This is used for reverse ping analysis which is very useful
|
|||||||
for assessing propagation and system performance.</string>
|
for assessing propagation and system performance.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Enable spotting to reporting networks (PSKReporter && APRS-IS)</string>
|
<string>Enable spotting to reporting networks (JS8NET, PSKReporter, APRS-IS, etc)</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked">
|
<property name="checked">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -2530,8 +2550,8 @@ for assessing propagation and system performance.</string>
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>760</width>
|
<width>498</width>
|
||||||
<height>502</height>
|
<height>321</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_31">
|
<layout class="QVBoxLayout" name="verticalLayout_31">
|
||||||
@@ -3108,8 +3128,8 @@ QListView::item:hover {
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>738</width>
|
<width>280</width>
|
||||||
<height>378</height>
|
<height>201</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_15">
|
<layout class="QGridLayout" name="gridLayout_15">
|
||||||
@@ -3363,8 +3383,8 @@ QListView::item:hover {
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>233</width>
|
<width>236</width>
|
||||||
<height>253</height>
|
<height>258</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_5">
|
<layout class="QGridLayout" name="gridLayout_5">
|
||||||
@@ -3567,8 +3587,8 @@ QListView::item:hover {
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>277</width>
|
<width>288</width>
|
||||||
<height>93</height>
|
<height>96</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_8">
|
<layout class="QGridLayout" name="gridLayout_8">
|
||||||
@@ -3976,71 +3996,137 @@ soundcard changes</string>
|
|||||||
</widget>
|
</widget>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
<tabstop>configuration_tabs</tabstop>
|
<tabstop>configuration_tabs</tabstop>
|
||||||
<tabstop>use_dynamic_grid</tabstop>
|
<tabstop>tabWidget_2</tabstop>
|
||||||
<tabstop>type_2_msg_gen_combo_box</tabstop>
|
<tabstop>callsign_line_edit</tabstop>
|
||||||
<tabstop>monitor_last_used_check_box</tabstop>
|
<tabstop>grid_line_edit</tabstop>
|
||||||
<tabstop>quick_call_check_box</tabstop>
|
<tabstop>groups_line_edit</tabstop>
|
||||||
<tabstop>CW_id_after_73_check_box</tabstop>
|
<tabstop>avoid_allcall_checkbox</tabstop>
|
||||||
<tabstop>enable_VHF_features_check_box</tabstop>
|
<tabstop>cq_message_line_edit</tabstop>
|
||||||
<tabstop>single_decode_check_box</tabstop>
|
<tabstop>reply_message_line_edit</tabstop>
|
||||||
<tabstop>decode_at_52s_check_box</tabstop>
|
<tabstop>info_message_line_edit</tabstop>
|
||||||
<tabstop>CW_id_interval_spin_box</tabstop>
|
<tabstop>scrollArea_2</tabstop>
|
||||||
|
<tabstop>miles_check_box</tabstop>
|
||||||
|
<tabstop>monitor_off_check_box</tabstop>
|
||||||
|
<tabstop>tx_qsy_check_box</tabstop>
|
||||||
|
<tabstop>transmit_directed_check_box</tabstop>
|
||||||
|
<tabstop>heartbeat_anywhere_check_box</tabstop>
|
||||||
|
<tabstop>heartbeat_qso_pause_check_box</tabstop>
|
||||||
|
<tabstop>spellcheck_check_box</tabstop>
|
||||||
|
<tabstop>autoreply_off_check_box</tabstop>
|
||||||
|
<tabstop>relay_disabled_check_box</tabstop>
|
||||||
|
<tabstop>auto_whitelist_line_edit</tabstop>
|
||||||
|
<tabstop>auto_blacklist_line_edit</tabstop>
|
||||||
|
<tabstop>scrollArea</tabstop>
|
||||||
|
<tabstop>callsign_aging_spin_box</tabstop>
|
||||||
|
<tabstop>activity_aging_spin_box</tabstop>
|
||||||
|
<tabstop>tx_watchdog_spin_box</tabstop>
|
||||||
<tabstop>rig_combo_box</tabstop>
|
<tabstop>rig_combo_box</tabstop>
|
||||||
<tabstop>CAT_poll_interval_spin_box</tabstop>
|
<tabstop>CAT_poll_interval_spin_box</tabstop>
|
||||||
|
<tabstop>tabWidget_3</tabstop>
|
||||||
|
<tabstop>scrollArea_3</tabstop>
|
||||||
<tabstop>CAT_port_combo_box</tabstop>
|
<tabstop>CAT_port_combo_box</tabstop>
|
||||||
|
<tabstop>CAT_serial_baud_combo_box</tabstop>
|
||||||
|
<tabstop>CAT_default_bit_radio_button</tabstop>
|
||||||
<tabstop>CAT_7_bit_radio_button</tabstop>
|
<tabstop>CAT_7_bit_radio_button</tabstop>
|
||||||
<tabstop>CAT_8_bit_radio_button</tabstop>
|
<tabstop>CAT_8_bit_radio_button</tabstop>
|
||||||
|
<tabstop>CAT_default_stop_bit_radio_button</tabstop>
|
||||||
<tabstop>CAT_one_stop_bit_radio_button</tabstop>
|
<tabstop>CAT_one_stop_bit_radio_button</tabstop>
|
||||||
<tabstop>CAT_two_stop_bit_radio_button</tabstop>
|
<tabstop>CAT_two_stop_bit_radio_button</tabstop>
|
||||||
|
<tabstop>CAT_handshake_default_radio_button</tabstop>
|
||||||
<tabstop>CAT_handshake_none_radio_button</tabstop>
|
<tabstop>CAT_handshake_none_radio_button</tabstop>
|
||||||
<tabstop>CAT_handshake_xon_radio_button</tabstop>
|
<tabstop>CAT_handshake_xon_radio_button</tabstop>
|
||||||
<tabstop>CAT_handshake_hardware_radio_button</tabstop>
|
<tabstop>CAT_handshake_hardware_radio_button</tabstop>
|
||||||
<tabstop>force_DTR_combo_box</tabstop>
|
<tabstop>force_DTR_combo_box</tabstop>
|
||||||
<tabstop>force_RTS_combo_box</tabstop>
|
<tabstop>force_RTS_combo_box</tabstop>
|
||||||
|
<tabstop>scrollArea_4</tabstop>
|
||||||
<tabstop>PTT_VOX_radio_button</tabstop>
|
<tabstop>PTT_VOX_radio_button</tabstop>
|
||||||
<tabstop>PTT_CAT_radio_button</tabstop>
|
|
||||||
<tabstop>PTT_DTR_radio_button</tabstop>
|
<tabstop>PTT_DTR_radio_button</tabstop>
|
||||||
|
<tabstop>PTT_CAT_radio_button</tabstop>
|
||||||
<tabstop>PTT_RTS_radio_button</tabstop>
|
<tabstop>PTT_RTS_radio_button</tabstop>
|
||||||
<tabstop>PTT_port_combo_box</tabstop>
|
<tabstop>PTT_port_combo_box</tabstop>
|
||||||
|
<tabstop>mode_USB_radio_button</tabstop>
|
||||||
|
<tabstop>mode_none_radio_button</tabstop>
|
||||||
|
<tabstop>mode_data_radio_button</tabstop>
|
||||||
<tabstop>TX_source_data_radio_button</tabstop>
|
<tabstop>TX_source_data_radio_button</tabstop>
|
||||||
<tabstop>TX_source_mic_radio_button</tabstop>
|
<tabstop>TX_source_mic_radio_button</tabstop>
|
||||||
<tabstop>mode_none_radio_button</tabstop>
|
|
||||||
<tabstop>mode_USB_radio_button</tabstop>
|
|
||||||
<tabstop>mode_data_radio_button</tabstop>
|
|
||||||
<tabstop>split_none_radio_button</tabstop>
|
|
||||||
<tabstop>split_rig_radio_button</tabstop>
|
|
||||||
<tabstop>split_emulate_radio_button</tabstop>
|
<tabstop>split_emulate_radio_button</tabstop>
|
||||||
|
<tabstop>split_rig_radio_button</tabstop>
|
||||||
|
<tabstop>split_none_radio_button</tabstop>
|
||||||
|
<tabstop>sbTxDelay</tabstop>
|
||||||
|
<tabstop>ptt_command_line_edit</tabstop>
|
||||||
<tabstop>test_CAT_push_button</tabstop>
|
<tabstop>test_CAT_push_button</tabstop>
|
||||||
<tabstop>test_PTT_push_button</tabstop>
|
<tabstop>test_PTT_push_button</tabstop>
|
||||||
|
<tabstop>scrollArea_5</tabstop>
|
||||||
|
<tabstop>sound_output_combo_box</tabstop>
|
||||||
<tabstop>sound_input_combo_box</tabstop>
|
<tabstop>sound_input_combo_box</tabstop>
|
||||||
<tabstop>sound_input_channel_combo_box</tabstop>
|
<tabstop>sound_input_channel_combo_box</tabstop>
|
||||||
<tabstop>sound_output_combo_box</tabstop>
|
|
||||||
<tabstop>sound_output_channel_combo_box</tabstop>
|
<tabstop>sound_output_channel_combo_box</tabstop>
|
||||||
<tabstop>save_path_select_push_button</tabstop>
|
<tabstop>save_path_select_push_button</tabstop>
|
||||||
<tabstop>azel_path_select_push_button</tabstop>
|
<tabstop>azel_path_select_push_button</tabstop>
|
||||||
<tabstop>checkBoxPwrBandTxMemory</tabstop>
|
<tabstop>checkBoxPwrBandTxMemory</tabstop>
|
||||||
<tabstop>checkBoxPwrBandTuneMemory</tabstop>
|
<tabstop>checkBoxPwrBandTuneMemory</tabstop>
|
||||||
<tabstop>add_macro_line_edit</tabstop>
|
<tabstop>scrollArea_6</tabstop>
|
||||||
<tabstop>add_macro_push_button</tabstop>
|
<tabstop>opCallEntry</tabstop>
|
||||||
<tabstop>delete_macro_push_button</tabstop>
|
<tabstop>log_as_RTTY_check_box</tabstop>
|
||||||
<tabstop>macros_list_view</tabstop>
|
|
||||||
<tabstop>prompt_to_log_check_box</tabstop>
|
|
||||||
<tabstop>udp_server_line_edit</tabstop>
|
<tabstop>udp_server_line_edit</tabstop>
|
||||||
<tabstop>udp_server_port_spin_box</tabstop>
|
<tabstop>udp_server_port_spin_box</tabstop>
|
||||||
|
<tabstop>udpEnable</tabstop>
|
||||||
<tabstop>accept_udp_requests_check_box</tabstop>
|
<tabstop>accept_udp_requests_check_box</tabstop>
|
||||||
<tabstop>udpWindowToFront</tabstop>
|
<tabstop>use_dynamic_grid</tabstop>
|
||||||
<tabstop>udpWindowRestore</tabstop>
|
<tabstop>psk_reporter_check_box</tabstop>
|
||||||
|
<tabstop>aprs_server_line_edit</tabstop>
|
||||||
|
<tabstop>aprs_server_port_spin_box</tabstop>
|
||||||
|
<tabstop>aprs_passcode_line_edit</tabstop>
|
||||||
|
<tabstop>enable_n1mm_broadcast_check_box</tabstop>
|
||||||
|
<tabstop>n1mm_server_name_line_edit</tabstop>
|
||||||
|
<tabstop>n1mm_server_port_spin_box</tabstop>
|
||||||
|
<tabstop>scrollArea_7</tabstop>
|
||||||
<tabstop>calibration_slope_ppm_spin_box</tabstop>
|
<tabstop>calibration_slope_ppm_spin_box</tabstop>
|
||||||
<tabstop>calibration_intercept_spin_box</tabstop>
|
<tabstop>calibration_intercept_spin_box</tabstop>
|
||||||
<tabstop>frequencies_table_view</tabstop>
|
<tabstop>frequencies_table_view</tabstop>
|
||||||
|
<tabstop>auto_switch_bands_check_box</tabstop>
|
||||||
<tabstop>stations_table_view</tabstop>
|
<tabstop>stations_table_view</tabstop>
|
||||||
<tabstop>sbNtrials</tabstop>
|
<tabstop>add_macro_push_button</tabstop>
|
||||||
<tabstop>sbAggressive</tabstop>
|
<tabstop>add_macro_line_edit</tabstop>
|
||||||
<tabstop>cbTwoPass</tabstop>
|
<tabstop>delete_macro_push_button</tabstop>
|
||||||
|
<tabstop>macros_list_view</tabstop>
|
||||||
|
<tabstop>sound_am_path_test_push_button</tabstop>
|
||||||
|
<tabstop>sound_dm_path_reset_push_button</tabstop>
|
||||||
|
<tabstop>sound_am_path_reset_push_button</tabstop>
|
||||||
|
<tabstop>sound_dm_path_select_push_button</tabstop>
|
||||||
|
<tabstop>sound_am_path_select_push_button</tabstop>
|
||||||
|
<tabstop>sound_dm_path_test_push_button</tabstop>
|
||||||
|
<tabstop>sound_cq_path_select_push_button</tabstop>
|
||||||
|
<tabstop>sound_cq_path_test_push_button</tabstop>
|
||||||
|
<tabstop>sound_cq_path_reset_push_button</tabstop>
|
||||||
|
<tabstop>font_push_button</tabstop>
|
||||||
|
<tabstop>tabWidget</tabstop>
|
||||||
|
<tabstop>scrollArea_8</tabstop>
|
||||||
|
<tabstop>tableForegroundButton</tabstop>
|
||||||
|
<tabstop>pbCQmsg</tabstop>
|
||||||
|
<tabstop>tableFontButton</tabstop>
|
||||||
|
<tabstop>pbMyCall</tabstop>
|
||||||
|
<tabstop>tableSelectedRowBackgroundButton</tabstop>
|
||||||
|
<tabstop>tableBackgroundButton</tabstop>
|
||||||
|
<tabstop>scrollArea_9</tabstop>
|
||||||
|
<tabstop>txFontButton</tabstop>
|
||||||
|
<tabstop>rxFontButton</tabstop>
|
||||||
|
<tabstop>txForegroundButton</tabstop>
|
||||||
|
<tabstop>rxBackgroundButton</tabstop>
|
||||||
|
<tabstop>rxForegroundButton</tabstop>
|
||||||
|
<tabstop>scrollArea_10</tabstop>
|
||||||
|
<tabstop>composeBackgroundButton</tabstop>
|
||||||
|
<tabstop>composeForegroundButton</tabstop>
|
||||||
|
<tabstop>composeFontButton</tabstop>
|
||||||
<tabstop>sbDegrade</tabstop>
|
<tabstop>sbDegrade</tabstop>
|
||||||
<tabstop>sbBandwidth</tabstop>
|
<tabstop>sbBandwidth</tabstop>
|
||||||
<tabstop>cbx2ToneSpacing</tabstop>
|
<tabstop>cbx2ToneSpacing</tabstop>
|
||||||
<tabstop>cbx4ToneSpacing</tabstop>
|
<tabstop>cbx4ToneSpacing</tabstop>
|
||||||
|
<tabstop>sbNtrials</tabstop>
|
||||||
|
<tabstop>sbAggressive</tabstop>
|
||||||
|
<tabstop>cbTwoPass</tabstop>
|
||||||
|
<tabstop>cbFox</tabstop>
|
||||||
|
<tabstop>cbHound</tabstop>
|
||||||
</tabstops>
|
</tabstops>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -4110,12 +4196,12 @@ soundcard changes</string>
|
|||||||
</connection>
|
</connection>
|
||||||
</connections>
|
</connections>
|
||||||
<buttongroups>
|
<buttongroups>
|
||||||
<buttongroup name="CAT_data_bits_button_group"/>
|
|
||||||
<buttongroup name="CAT_handshake_button_group"/>
|
|
||||||
<buttongroup name="TX_mode_button_group"/>
|
|
||||||
<buttongroup name="PTT_method_button_group"/>
|
|
||||||
<buttongroup name="split_mode_button_group"/>
|
|
||||||
<buttongroup name="TX_audio_source_button_group"/>
|
|
||||||
<buttongroup name="CAT_stop_bits_button_group"/>
|
<buttongroup name="CAT_stop_bits_button_group"/>
|
||||||
|
<buttongroup name="CAT_data_bits_button_group"/>
|
||||||
|
<buttongroup name="TX_mode_button_group"/>
|
||||||
|
<buttongroup name="CAT_handshake_button_group"/>
|
||||||
|
<buttongroup name="split_mode_button_group"/>
|
||||||
|
<buttongroup name="PTT_method_button_group"/>
|
||||||
|
<buttongroup name="TX_audio_source_button_group"/>
|
||||||
</buttongroups>
|
</buttongroups>
|
||||||
</ui>
|
</ui>
|
||||||
|
|||||||
+11
-10
@@ -26,16 +26,17 @@ namespace
|
|||||||
{
|
{
|
||||||
FrequencyList_v2::FrequencyItems const default_frequency_list =
|
FrequencyList_v2::FrequencyItems const default_frequency_list =
|
||||||
{
|
{
|
||||||
{ 1842000, Modes::JS8, IARURegions::ALL}, // 2 above
|
{ 1842000, Modes::JS8, IARURegions::ALL}, // 2 above
|
||||||
{ 3578000, Modes::JS8, IARURegions::ALL}, // 5 above
|
{ 3578000, Modes::JS8, IARURegions::ALL}, // 5 above
|
||||||
{ 7078000, Modes::JS8, IARURegions::ALL}, // 4 above
|
{ 7078000, Modes::JS8, IARURegions::ALL}, // 4 above
|
||||||
{10130000, Modes::JS8, IARURegions::ALL}, // 6 below
|
{ 10130000, Modes::JS8, IARURegions::ALL}, // 6 below
|
||||||
{14078000, Modes::JS8, IARURegions::ALL}, // 4 above
|
{ 14078000, Modes::JS8, IARURegions::ALL}, // 4 above
|
||||||
{18104000, Modes::JS8, IARURegions::ALL}, // 4 above
|
{ 18104000, Modes::JS8, IARURegions::ALL}, // 4 above
|
||||||
{21078000, Modes::JS8, IARURegions::ALL}, // 4 above
|
{ 21078000, Modes::JS8, IARURegions::ALL}, // 4 above
|
||||||
{24922000, Modes::JS8, IARURegions::ALL}, // 9 above
|
{ 24922000, Modes::JS8, IARURegions::ALL}, // 9 above
|
||||||
{28078000, Modes::JS8, IARURegions::ALL}, // 4 above
|
{ 28078000, Modes::JS8, IARURegions::ALL}, // 4 above
|
||||||
{50318000, Modes::JS8, IARURegions::ALL}, // 5 above
|
{ 50318000, Modes::JS8, IARURegions::ALL}, // 5 above
|
||||||
|
{144178000, Modes::JS8, IARURegions::ALL}, // 4 above
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+124
@@ -0,0 +1,124 @@
|
|||||||
|
#include "SpotClient.h"
|
||||||
|
#include "Message.h"
|
||||||
|
|
||||||
|
#include "moc_SpotClient.cpp"
|
||||||
|
|
||||||
|
SpotClient::SpotClient(MessageClient *client, QObject *parent):
|
||||||
|
QObject(parent),
|
||||||
|
m_client { client }
|
||||||
|
{
|
||||||
|
prepare();
|
||||||
|
|
||||||
|
connect(&m_timer, &QTimer::timeout, this, &SpotClient::processSpots);
|
||||||
|
m_timer.setInterval(60 * 1000);
|
||||||
|
m_timer.setSingleShot(false);
|
||||||
|
m_timer.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpotClient::prepare(){
|
||||||
|
QHostInfo::lookupHost("spot.js8call.com", this, SLOT(dnsLookupResult(QHostInfo)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpotClient::dnsLookupResult(QHostInfo info){
|
||||||
|
if (info.addresses().isEmpty()) {
|
||||||
|
qDebug() << "SpotClient Error:" << info.errorString();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_address = info.addresses().at(0);
|
||||||
|
qDebug() << "SpotClient Resolve:" << m_address.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpotClient::setLocalStation(QString callsign, QString grid, QString info, QString version){
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
|
if(m_call != callsign){
|
||||||
|
m_call = callsign;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(m_grid != grid){
|
||||||
|
m_grid = grid;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(m_info != info){
|
||||||
|
m_info = info;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(m_version != version){
|
||||||
|
m_version = version;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// send local information to network on change, or once every 15 minutes
|
||||||
|
if(changed || m_seq % 15 == 0){
|
||||||
|
enqueueLocalSpot(callsign, grid, info, version);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpotClient::enqueueLocalSpot(QString callsign, QString grid, QString info, QString version){
|
||||||
|
auto m = Message("RX.LOCAL", "", {
|
||||||
|
{"CALLSIGN", QVariant(callsign)},
|
||||||
|
{"GRID", QVariant(grid)},
|
||||||
|
{"INFO", QVariant(info)},
|
||||||
|
{"VERSION", QVariant(version)},
|
||||||
|
});
|
||||||
|
|
||||||
|
m_queue.enqueue(m.toJson());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpotClient::enqueueSpot(QString callsign, QString grid, int frequency, int snr){
|
||||||
|
auto m = Message("RX.SPOT", "", {
|
||||||
|
{"BY", QVariant(QMap<QString, QVariant>{
|
||||||
|
{"CALLSIGN", QVariant(m_call)},
|
||||||
|
{"GRID", QVariant(m_grid)},
|
||||||
|
})},
|
||||||
|
{"CALLSIGN", QVariant(callsign)},
|
||||||
|
{"GRID", QVariant(grid)},
|
||||||
|
{"FREQ", QVariant(frequency)},
|
||||||
|
{"SNR", QVariant(snr)},
|
||||||
|
});
|
||||||
|
|
||||||
|
m_queue.enqueue(m.toJson());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpotClient::enqueueCmd(QString cmd, QString from, QString to, QString relayPath, QString text, QString grid, QString extra, int frequency, int snr){
|
||||||
|
auto m = Message("RX.DIRECTED", "", {
|
||||||
|
{"BY", QVariant(QMap<QString, QVariant>{
|
||||||
|
{"CALLSIGN", QVariant(m_call)},
|
||||||
|
{"GRID", QVariant(m_grid)},
|
||||||
|
})},
|
||||||
|
{"CMD", QVariant(cmd)},
|
||||||
|
{"FROM", QVariant(from)},
|
||||||
|
{"TO", QVariant(to)},
|
||||||
|
{"PATH", QVariant(relayPath)},
|
||||||
|
{"TEXT", QVariant(text)},
|
||||||
|
{"GRID", QVariant(grid)},
|
||||||
|
{"EXTRA", QVariant(extra)},
|
||||||
|
{"FREQ", QVariant(frequency)},
|
||||||
|
{"SNR", QVariant(snr)},
|
||||||
|
});
|
||||||
|
|
||||||
|
m_queue.enqueue(m.toJson());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpotClient::processSpots(){
|
||||||
|
if(m_address.isNull()){
|
||||||
|
prepare();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(!m_queue.isEmpty()){
|
||||||
|
sendRawSpot(m_queue.dequeue());
|
||||||
|
}
|
||||||
|
|
||||||
|
m_seq++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpotClient::sendRawSpot(QByteArray payload){
|
||||||
|
if(!m_address.isNull()){
|
||||||
|
m_client->send_raw_datagram(payload, m_address, 50000);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
#ifndef JS8SPOTCLIENT_H
|
||||||
|
#define JS8SPOTCLIENT_H
|
||||||
|
|
||||||
|
#include "MessageClient.hpp"
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QHostInfo>
|
||||||
|
#include <QQueue>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
class SpotClient : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
SpotClient(MessageClient *client, QObject *parent = nullptr);
|
||||||
|
|
||||||
|
void prepare();
|
||||||
|
void setLocalStation(QString callsign, QString grid, QString info, QString version);
|
||||||
|
void enqueueLocalSpot(QString callsign, QString grid, QString info, QString version);
|
||||||
|
void enqueueCmd(QString cmd, QString from, QString to, QString relayPath, QString text, QString grid, QString extra, int frequency, int snr);
|
||||||
|
void enqueueSpot(QString callsign, QString grid, int frequency, int snr);
|
||||||
|
void sendRawSpot(QByteArray payload);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void processSpots();
|
||||||
|
void dnsLookupResult(QHostInfo);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_seq;
|
||||||
|
QString m_call;
|
||||||
|
QString m_grid;
|
||||||
|
QString m_info;
|
||||||
|
QString m_version;
|
||||||
|
|
||||||
|
QHostAddress m_address;
|
||||||
|
MessageClient *m_client;
|
||||||
|
QTimer m_timer;
|
||||||
|
QQueue<QByteArray> m_queue;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // JS8SPOTCLIENT_H
|
||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
# Version number components
|
# Version number components
|
||||||
set (WSJTX_VERSION_MAJOR 0)
|
set (WSJTX_VERSION_MAJOR 1)
|
||||||
set (WSJTX_VERSION_MINOR 14)
|
set (WSJTX_VERSION_MINOR 0)
|
||||||
set (WSJTX_VERSION_PATCH 0)
|
set (WSJTX_VERSION_PATCH 0)
|
||||||
set (WSJTX_RC 0) # release candidate number, comment out or zero for development versions
|
set (WSJTX_RC 0) # release candidate number, comment out or zero for development versions
|
||||||
set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build
|
set (WSJTX_VERSION_IS_RELEASE 0) # set to 1 for final release build
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ CAboutDlg::CAboutDlg(QWidget *parent) :
|
|||||||
"development group. <br/>JS8Call is "
|
"development group. <br/>JS8Call is "
|
||||||
"licensed under and in accordance with the terms "
|
"licensed under and in accordance with the terms "
|
||||||
"of the <a href=\"https://www.gnu.org/licenses/gpl-3.0.txt\">GPLv3 license</a>.<br/>"
|
"of the <a href=\"https://www.gnu.org/licenses/gpl-3.0.txt\">GPLv3 license</a>.<br/>"
|
||||||
"The source code modifications are public and can be found in <a href=\"https://bitbucket.org/widefido/wsjtx/\">this repository</a>.<br/><br/>"
|
"The source code modifications are public and can be found in <a href=\"https://bitbucket.org/widefido/js8call/\">this repository</a>.<br/><br/>"
|
||||||
|
|
||||||
"JS8Call is heavily inspired by WSJT-X, Fldigi, "
|
"JS8Call is heavily inspired by WSJT-X, Fldigi, "
|
||||||
"and FSQCall <br/>and would not exist without the hard work and "
|
"and FSQCall <br/>and would not exist without the hard work and "
|
||||||
|
|||||||
@@ -81,7 +81,8 @@ SOURCES += \
|
|||||||
jsc_checker.cpp \
|
jsc_checker.cpp \
|
||||||
Message.cpp \
|
Message.cpp \
|
||||||
Inbox.cpp \
|
Inbox.cpp \
|
||||||
messagewindow.cpp
|
messagewindow.cpp \
|
||||||
|
SpotClient.cpp
|
||||||
|
|
||||||
HEADERS += qt_helpers.hpp \
|
HEADERS += qt_helpers.hpp \
|
||||||
pimpl_h.hpp pimpl_impl.hpp \
|
pimpl_h.hpp pimpl_impl.hpp \
|
||||||
@@ -113,7 +114,8 @@ HEADERS += qt_helpers.hpp \
|
|||||||
jsc_checker.h \
|
jsc_checker.h \
|
||||||
Message.h \
|
Message.h \
|
||||||
Inbox.h \
|
Inbox.h \
|
||||||
messagewindow.h
|
messagewindow.h \
|
||||||
|
SpotClient.h
|
||||||
|
|
||||||
|
|
||||||
INCLUDEPATH += qmake_only
|
INCLUDEPATH += qmake_only
|
||||||
@@ -15,7 +15,7 @@ subroutine extractmessage144(decoded,msgreceived,nhashflag,recent_calls,nrecent)
|
|||||||
do ibyte=1,10
|
do ibyte=1,10
|
||||||
itmp=0
|
itmp=0
|
||||||
do ibit=1,8
|
do ibit=1,8
|
||||||
itmp=ishft(itmp,1)+iand(1,decoded((ibyte-1)*8+ibit))
|
itmp=ishft(itmp,1)+iand(1_1,decoded((ibyte-1)*8+ibit))
|
||||||
enddo
|
enddo
|
||||||
i1Dec8BitBytes(ibyte)=itmp
|
i1Dec8BitBytes(ibyte)=itmp
|
||||||
enddo
|
enddo
|
||||||
@@ -31,7 +31,7 @@ subroutine extractmessage144(decoded,msgreceived,nhashflag,recent_calls,nrecent)
|
|||||||
do ibyte=1,12
|
do ibyte=1,12
|
||||||
itmp=0
|
itmp=0
|
||||||
do ibit=1,6
|
do ibit=1,6
|
||||||
itmp=ishft(itmp,1)+iand(1,decoded((ibyte-1)*6+ibit))
|
itmp=ishft(itmp,1)+iand(1_1,decoded((ibyte-1)*6+ibit))
|
||||||
enddo
|
enddo
|
||||||
i4Dec6BitWords(ibyte)=itmp
|
i4Dec6BitWords(ibyte)=itmp
|
||||||
enddo
|
enddo
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ subroutine chkcrc12a(decoded,nbadcrc)
|
|||||||
read(cbits,1002) ncrc12 !Received CRC12
|
read(cbits,1002) ncrc12 !Received CRC12
|
||||||
1002 format(75x,b12)
|
1002 format(75x,b12)
|
||||||
|
|
||||||
i1Dec8BitBytes(10)=iand(i1Dec8BitBytes(10),128+64+32)
|
i1Dec8BitBytes(10)=iand(i1Dec8BitBytes(10),transfer(128+64+32,0_1))
|
||||||
i1Dec8BitBytes(11)=0
|
i1Dec8BitBytes(11)=0
|
||||||
icrc12=crc12(c_loc(i1Dec8BitBytes),11) !CRC12 computed from 75 msg bits
|
icrc12=crc12(c_loc(i1Dec8BitBytes),11) !CRC12 computed from 75 msg bits
|
||||||
icrc12=xor(icrc12, 42) ! TODO: jsherer - could change the crc here
|
icrc12=xor(icrc12, 42) ! TODO: jsherer - could change the crc here
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ subroutine extractmessage174(decoded,msgreceived,ncrcflag)
|
|||||||
read(cbits,1002) ncrc12 !Received CRC12
|
read(cbits,1002) ncrc12 !Received CRC12
|
||||||
1002 format(75x,b12)
|
1002 format(75x,b12)
|
||||||
|
|
||||||
i1Dec8BitBytes(10)=iand(i1Dec8BitBytes(10),128+64+32)
|
i1Dec8BitBytes(10)=iand(i1Dec8BitBytes(10),transfer(128+64+32,0_1))
|
||||||
i1Dec8BitBytes(11)=0
|
i1Dec8BitBytes(11)=0
|
||||||
icrc12=crc12(c_loc(i1Dec8BitBytes),11) !CRC12 computed from 75 msg bits
|
icrc12=crc12(c_loc(i1Dec8BitBytes),11) !CRC12 computed from 75 msg bits
|
||||||
icrc12=xor(icrc12, 42) ! TODO: jsherer - could change the crc here
|
icrc12=xor(icrc12, 42) ! TODO: jsherer - could change the crc here
|
||||||
@@ -29,7 +29,7 @@ subroutine extractmessage174(decoded,msgreceived,ncrcflag)
|
|||||||
do ibyte=1,12
|
do ibyte=1,12
|
||||||
itmp=0
|
itmp=0
|
||||||
do ibit=1,6
|
do ibit=1,6
|
||||||
itmp=ishft(itmp,1)+iand(1,decoded((ibyte-1)*6+ibit))
|
itmp=ishft(itmp,1)+iand(1_1,decoded((ibyte-1)*6+ibit))
|
||||||
enddo
|
enddo
|
||||||
i4Dec6BitWords(ibyte)=itmp
|
i4Dec6BitWords(ibyte)=itmp
|
||||||
enddo
|
enddo
|
||||||
|
|||||||
+1
-1
@@ -35,7 +35,7 @@ subroutine genft8(msg,mygrid,bcontest,i3bit,msgsent,msgbits,itone)
|
|||||||
1000 format(12b6.6,b8.8)
|
1000 format(12b6.6,b8.8)
|
||||||
read(cbits,1001) i1Msg8BitBytes(1:10)
|
read(cbits,1001) i1Msg8BitBytes(1:10)
|
||||||
1001 format(10b8)
|
1001 format(10b8)
|
||||||
i1Msg8BitBytes(10)=iand(i1Msg8BitBytes(10),128+64+32)
|
i1Msg8BitBytes(10)=iand(i1Msg8BitBytes(10),transfer(128+64+32,0_1))
|
||||||
i1Msg8BitBytes(11)=0
|
i1Msg8BitBytes(11)=0
|
||||||
icrc12=crc12(c_loc(i1Msg8BitBytes),11)
|
icrc12=crc12(c_loc(i1Msg8BitBytes),11)
|
||||||
icrc12=xor(icrc12, 42) ! TODO: jsherer - could change the crc here
|
icrc12=xor(icrc12, 42) ! TODO: jsherer - could change the crc here
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ allocate ( rxdata(N), llr(N) )
|
|||||||
checksum = xor(checksum, 42) ! TODO: jsherer - could change the crc here
|
checksum = xor(checksum, 42) ! TODO: jsherer - could change the crc here
|
||||||
! For reference, the next 3 lines show how to check the CRC
|
! For reference, the next 3 lines show how to check the CRC
|
||||||
i1Msg8BitBytes(10)=checksum/256
|
i1Msg8BitBytes(10)=checksum/256
|
||||||
i1Msg8BitBytes(11)=iand (checksum,255)
|
i1Msg8BitBytes(11)=iand(checksum,transfer(255,0_2))
|
||||||
checksumok = crc12_check(c_loc (i1Msg8BitBytes), 11)
|
checksumok = crc12_check(c_loc (i1Msg8BitBytes), 11)
|
||||||
if( checksumok ) write(*,*) 'Good checksum'
|
if( checksumok ) write(*,*) 'Good checksum'
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -95,7 +95,7 @@ do idb = 0, 30
|
|||||||
nhashflag=0
|
nhashflag=0
|
||||||
imsg=0
|
imsg=0
|
||||||
do i=1,16
|
do i=1,16
|
||||||
imsg=ishft(imsg,1)+iand(1,decoded(17-i))
|
imsg=ishft(imsg,1)+iand(1_1,decoded(17-i))
|
||||||
enddo
|
enddo
|
||||||
nrxrpt=iand(imsg,15)
|
nrxrpt=iand(imsg,15)
|
||||||
nrxhash=(imsg-nrxrpt)/16
|
nrxhash=(imsg-nrxrpt)/16
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ subroutine msk40decodeframe(c,mycall,hiscall,xsnr,bswl,nhasharray, &
|
|||||||
|
|
||||||
imsg=0
|
imsg=0
|
||||||
do i=1,16
|
do i=1,16
|
||||||
imsg=ishft(imsg,1)+iand(1,decoded(17-i))
|
imsg=ishft(imsg,1)+iand(1_1,decoded(17-i))
|
||||||
enddo
|
enddo
|
||||||
nrxrpt=iand(imsg,15)
|
nrxrpt=iand(imsg,15)
|
||||||
nrxhash=(imsg-nrxrpt)/16
|
nrxhash=(imsg-nrxrpt)/16
|
||||||
|
|||||||
+16
-10
@@ -101,14 +101,17 @@ void ADIF::load()
|
|||||||
, extractField (record, "BAND")
|
, extractField (record, "BAND")
|
||||||
, extractField (record, "MODE")
|
, extractField (record, "MODE")
|
||||||
, extractField (record, "SUBMODE")
|
, extractField (record, "SUBMODE")
|
||||||
, extractField (record, "QSO_DATE"));
|
, extractField (record, "QSO_DATE")
|
||||||
|
, extractField (record, "NAME")
|
||||||
|
, extractField (record, "COMMENT")
|
||||||
|
);
|
||||||
}
|
}
|
||||||
inputFile.close ();
|
inputFile.close ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ADIF::add(QString const& call, QString const& band, QString const& mode, QString const& submode, QString const& date)
|
void ADIF::add(QString const& call, QString const& band, QString const& mode, QString const& submode, QString const& date, QString const& name, QString const& comment)
|
||||||
{
|
{
|
||||||
QSO q;
|
QSO q;
|
||||||
q.call = call;
|
q.call = call;
|
||||||
@@ -116,6 +119,9 @@ void ADIF::add(QString const& call, QString const& band, QString const& mode, QS
|
|||||||
q.mode = mode;
|
q.mode = mode;
|
||||||
q.submode = submode;
|
q.submode = submode;
|
||||||
q.date = date;
|
q.date = date;
|
||||||
|
q.name = name;
|
||||||
|
q.comment = comment;
|
||||||
|
|
||||||
if (q.call.size ())
|
if (q.call.size ())
|
||||||
{
|
{
|
||||||
_data.insert(q.call,q);
|
_data.insert(q.call,q);
|
||||||
@@ -135,13 +141,18 @@ bool ADIF::match(QString const& call, QString const& band) const
|
|||||||
if ( (band.compare(q.band,Qt::CaseInsensitive) == 0)
|
if ( (band.compare(q.band,Qt::CaseInsensitive) == 0)
|
||||||
|| (band=="")
|
|| (band=="")
|
||||||
|| (q.band==""))
|
|| (q.band==""))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<ADIF::QSO> ADIF::find(QString const& call) const
|
||||||
|
{
|
||||||
|
return _data.values(call);
|
||||||
|
}
|
||||||
|
|
||||||
QList<QString> ADIF::getCallList() const
|
QList<QString> ADIF::getCallList() const
|
||||||
{
|
{
|
||||||
@@ -154,8 +165,6 @@ QList<QString> ADIF::getCallList() const
|
|||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int ADIF::getCount() const
|
int ADIF::getCount() const
|
||||||
{
|
{
|
||||||
@@ -166,7 +175,7 @@ QByteArray ADIF::QSOToADIF(QString const& hisCall, QString const& hisGrid, QStri
|
|||||||
, QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn
|
, QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn
|
||||||
, QDateTime const& dateTimeOff, QString const& band, QString const& comments
|
, QDateTime const& dateTimeOff, QString const& band, QString const& comments
|
||||||
, QString const& name, QString const& strDialFreq, QString const& m_myCall
|
, QString const& name, QString const& strDialFreq, QString const& m_myCall
|
||||||
, QString const& m_myGrid, QString const& m_txPower, QString const& operator_call)
|
, QString const& m_myGrid, QString const& operator_call)
|
||||||
{
|
{
|
||||||
QString t;
|
QString t;
|
||||||
t = "<call:" + QString::number(hisCall.length()) + ">" + hisCall;
|
t = "<call:" + QString::number(hisCall.length()) + ">" + hisCall;
|
||||||
@@ -187,9 +196,6 @@ QByteArray ADIF::QSOToADIF(QString const& hisCall, QString const& hisGrid, QStri
|
|||||||
m_myCall;
|
m_myCall;
|
||||||
t += " <my_gridsquare:" + QString::number(m_myGrid.length()) + ">" +
|
t += " <my_gridsquare:" + QString::number(m_myGrid.length()) + ">" +
|
||||||
m_myGrid;
|
m_myGrid;
|
||||||
if (m_txPower != "")
|
|
||||||
t += " <tx_pwr:" + QString::number(m_txPower.length()) +
|
|
||||||
">" + m_txPower;
|
|
||||||
if (comments != "")
|
if (comments != "")
|
||||||
t += " <comment:" + QString::number(comments.length()) +
|
t += " <comment:" + QString::number(comments.length()) +
|
||||||
">" + comments;
|
">" + comments;
|
||||||
|
|||||||
+12
-7
@@ -21,10 +21,14 @@ class QDateTime;
|
|||||||
class ADIF
|
class ADIF
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
struct QSO;
|
||||||
|
|
||||||
void init(QString const& filename);
|
void init(QString const& filename);
|
||||||
void load();
|
void load();
|
||||||
void add(QString const& call, QString const& band, QString const& mode, const QString &submode, QString const& date);
|
void add(QString const& call, QString const& band, QString const& mode, const QString &submode, QString const& date, const QString &name, const QString &comment);
|
||||||
bool match(QString const& call, QString const& band) const;
|
bool match(QString const& call, QString const& band) const;
|
||||||
|
QList<ADIF::QSO> find(QString const& call) const;
|
||||||
QList<QString> getCallList() const;
|
QList<QString> getCallList() const;
|
||||||
int getCount() const;
|
int getCount() const;
|
||||||
|
|
||||||
@@ -32,18 +36,19 @@ class ADIF
|
|||||||
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& m_txPower, QString const& operator_call);
|
, QString const& operator_call);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct QSO
|
struct QSO
|
||||||
{
|
{
|
||||||
QString call,band,mode,submode,date;
|
QString call,band,mode,submode,date,name,comment;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
QMultiHash<QString, QSO> _data;
|
QMultiHash<QString, QSO> _data;
|
||||||
QString _filename;
|
QString _filename;
|
||||||
|
|
||||||
|
|||||||
+39
-13
@@ -59,25 +59,51 @@ void LogBook::match(/*in*/const QString call,
|
|||||||
bool &callWorkedBefore,
|
bool &callWorkedBefore,
|
||||||
bool &countryWorkedBefore) const
|
bool &countryWorkedBefore) const
|
||||||
{
|
{
|
||||||
if (call.length() > 0)
|
if(call.isEmpty()){
|
||||||
{
|
return;
|
||||||
QString currentBand = ""; // match any band
|
}
|
||||||
callWorkedBefore = _log.match(call,currentBand);
|
|
||||||
countryName = _countries.find(call);
|
|
||||||
|
|
||||||
if (countryName.length() > 0) // country was found
|
QString currentBand = ""; // match any band
|
||||||
|
callWorkedBefore = _log.match(call, currentBand);
|
||||||
|
countryName = _countries.find(call);
|
||||||
|
|
||||||
|
if (countryName.length() > 0){ // country was found
|
||||||
countryWorkedBefore = _worked.getHasWorked(countryName);
|
countryWorkedBefore = _worked.getHasWorked(countryName);
|
||||||
else
|
} else {
|
||||||
{
|
countryName = "where?"; //error: prefix not found
|
||||||
countryName = "where?"; //error: prefix not found
|
countryWorkedBefore = false;
|
||||||
countryWorkedBefore = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LogBook::addAsWorked(const QString call, const QString band, const QString mode, const QString submode, const QString date)
|
bool LogBook::findCallDetails(
|
||||||
|
/*in*/
|
||||||
|
const QString call,
|
||||||
|
/*out*/
|
||||||
|
QString &date,
|
||||||
|
QString &name,
|
||||||
|
QString &comment) const
|
||||||
{
|
{
|
||||||
_log.add(call,band,mode,submode,date);
|
if(call.isEmpty()){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto qsos = _log.find(call);
|
||||||
|
if(qsos.isEmpty()){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(auto qso, qsos){
|
||||||
|
if(date.isEmpty() && !qso.date.isEmpty()) date = qso.date;
|
||||||
|
if(name.isEmpty() && !qso.name.isEmpty()) name = qso.name;
|
||||||
|
if(comment.isEmpty() && !qso.comment.isEmpty()) comment = qso.comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogBook::addAsWorked(const QString call, const QString band, const QString mode, const QString submode, const QString date, const QString name, const QString comment)
|
||||||
|
{
|
||||||
|
_log.add(call,band,mode,submode,date,name,comment);
|
||||||
QString countryName = _countries.find(call);
|
QString countryName = _countries.find(call);
|
||||||
if (countryName.length() > 0)
|
if (countryName.length() > 0)
|
||||||
_worked.setAsWorked(countryName);
|
_worked.setAsWorked(countryName);
|
||||||
|
|||||||
+8
-1
@@ -25,7 +25,14 @@ public:
|
|||||||
/*out*/ QString &countryName,
|
/*out*/ QString &countryName,
|
||||||
bool &callWorkedBefore,
|
bool &callWorkedBefore,
|
||||||
bool &countryWorkedBefore) const;
|
bool &countryWorkedBefore) const;
|
||||||
void addAsWorked(const QString call, const QString band, const QString mode, const QString submode, const QString date);
|
bool findCallDetails(
|
||||||
|
/*in*/
|
||||||
|
const QString call,
|
||||||
|
/*out*/
|
||||||
|
QString &date,
|
||||||
|
QString &name,
|
||||||
|
QString &comment) const;
|
||||||
|
void addAsWorked(const QString call, const QString band, const QString mode, const QString submode, const QString date, const QString name, const QString comment);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CountryDat _countries;
|
CountryDat _countries;
|
||||||
|
|||||||
+5
-12
@@ -37,9 +37,7 @@ 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->cbTxPower->setChecked (m_settings->value ("SaveTxPower", false).toBool ());
|
|
||||||
ui->cbComments->setChecked (m_settings->value ("SaveComments", false).toBool ());
|
ui->cbComments->setChecked (m_settings->value ("SaveComments", false).toBool ());
|
||||||
m_txPower = m_settings->value ("TxPower", "").toString ();
|
|
||||||
m_comments = m_settings->value ("LogComments", "").toString();
|
m_comments = m_settings->value ("LogComments", "").toString();
|
||||||
m_settings->endGroup ();
|
m_settings->endGroup ();
|
||||||
}
|
}
|
||||||
@@ -48,9 +46,7 @@ void LogQSO::storeSettings () const
|
|||||||
{
|
{
|
||||||
m_settings->beginGroup ("LogQSO");
|
m_settings->beginGroup ("LogQSO");
|
||||||
m_settings->setValue ("geometry", saveGeometry ());
|
m_settings->setValue ("geometry", saveGeometry ());
|
||||||
m_settings->setValue ("SaveTxPower", ui->cbTxPower->isChecked ());
|
|
||||||
m_settings->setValue ("SaveComments", ui->cbComments->isChecked ());
|
m_settings->setValue ("SaveComments", ui->cbComments->isChecked ());
|
||||||
m_settings->setValue ("TxPower", m_txPower);
|
|
||||||
m_settings->setValue ("LogComments", m_comments);
|
m_settings->setValue ("LogComments", m_comments);
|
||||||
m_settings->endGroup ();
|
m_settings->endGroup ();
|
||||||
}
|
}
|
||||||
@@ -59,15 +55,13 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString
|
|||||||
QString const& rptSent, QString const& rptRcvd,
|
QString const& rptSent, QString const& rptRcvd,
|
||||||
QDateTime const& dateTimeOn, QDateTime const& dateTimeOff,
|
QDateTime const& dateTimeOn, QDateTime const& dateTimeOff,
|
||||||
Radio::Frequency dialFreq, QString const& myCall, QString const& myGrid,
|
Radio::Frequency dialFreq, QString const& myCall, QString const& myGrid,
|
||||||
bool toRTTY, bool dBtoComments, bool bFox, QString const& opCall)
|
bool toDATA, bool dBtoComments, bool bFox, QString const& opCall)
|
||||||
{
|
{
|
||||||
if(!isHidden()) return;
|
if(!isHidden()) return;
|
||||||
ui->call->setText(hisCall);
|
ui->call->setText(hisCall);
|
||||||
ui->grid->setText(hisGrid);
|
ui->grid->setText(hisGrid);
|
||||||
ui->name->setText("");
|
ui->name->setText("");
|
||||||
ui->txPower->setText("");
|
|
||||||
ui->comments->setText("");
|
ui->comments->setText("");
|
||||||
if (ui->cbTxPower->isChecked ()) ui->txPower->setText(m_txPower);
|
|
||||||
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;
|
||||||
@@ -75,7 +69,7 @@ void LogQSO::initLogQSO(QString const& hisCall, QString const& hisGrid, QString
|
|||||||
if(rptRcvd!="") t+=" Rcvd: " + rptRcvd;
|
if(rptRcvd!="") t+=" Rcvd: " + rptRcvd;
|
||||||
ui->comments->setText(t);
|
ui->comments->setText(t);
|
||||||
}
|
}
|
||||||
if(toRTTY) 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);
|
||||||
@@ -111,7 +105,6 @@ void LogQSO::accept()
|
|||||||
m_dateTimeOff = ui->end_date_time->dateTime ();
|
m_dateTimeOff = ui->end_date_time->dateTime ();
|
||||||
band=ui->band->text();
|
band=ui->band->text();
|
||||||
name=ui->name->text();
|
name=ui->name->text();
|
||||||
m_txPower=ui->txPower->text();
|
|
||||||
comments=ui->comments->text();
|
comments=ui->comments->text();
|
||||||
m_comments=comments;
|
m_comments=comments;
|
||||||
QString strDialFreq(QString::number(m_dialFreq / 1.e6,'f',6));
|
QString strDialFreq(QString::number(m_dialFreq / 1.e6,'f',6));
|
||||||
@@ -123,7 +116,7 @@ void LogQSO::accept()
|
|||||||
adifile.init(adifilePath);
|
adifile.init(adifilePath);
|
||||||
|
|
||||||
QByteArray ADIF {adifile.QSOToADIF (hisCall, hisGrid, mode, submode, rptSent, rptRcvd, m_dateTimeOn, m_dateTimeOff, band
|
QByteArray ADIF {adifile.QSOToADIF (hisCall, hisGrid, mode, submode, rptSent, rptRcvd, m_dateTimeOn, m_dateTimeOff, band
|
||||||
, comments, name, strDialFreq, m_myCall, m_myGrid, m_txPower, operator_call)};
|
, comments, name, strDialFreq, m_myCall, m_myGrid, operator_call)};
|
||||||
if (!adifile.addQSOToFile (ADIF))
|
if (!adifile.addQSOToFile (ADIF))
|
||||||
{
|
{
|
||||||
MessageBox::warning_message (this, tr ("Log file error"),
|
MessageBox::warning_message (this, tr ("Log file error"),
|
||||||
@@ -153,7 +146,7 @@ void LogQSO::accept()
|
|||||||
m_dateTimeOff.date().toString("yyyy-MM-dd,") +
|
m_dateTimeOff.date().toString("yyyy-MM-dd,") +
|
||||||
m_dateTimeOff.time().toString("hh:mm:ss,") + hisCall + "," +
|
m_dateTimeOff.time().toString("hh:mm:ss,") + hisCall + "," +
|
||||||
hisGrid + "," + strDialFreq + "," + (mode == "MFSK" ? "JS8" : mode) +
|
hisGrid + "," + strDialFreq + "," + (mode == "MFSK" ? "JS8" : mode) +
|
||||||
"," + rptSent + "," + rptRcvd + "," + m_txPower +
|
"," + rptSent + "," + rptRcvd +
|
||||||
"," + comments + "," + name;
|
"," + comments + "," + name;
|
||||||
QTextStream out(&f);
|
QTextStream out(&f);
|
||||||
out << logEntry << endl;
|
out << logEntry << endl;
|
||||||
@@ -161,7 +154,7 @@ void LogQSO::accept()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Clean up and finish logging
|
//Clean up and finish logging
|
||||||
Q_EMIT acceptQSO (m_dateTimeOff, hisCall, hisGrid, m_dialFreq, mode, submode, rptSent, rptRcvd, m_txPower, comments, name,m_dateTimeOn, operator_call, m_myCall, m_myGrid, ADIF);
|
Q_EMIT acceptQSO (m_dateTimeOff, hisCall, hisGrid, m_dialFreq, mode, submode, rptSent, rptRcvd, comments, name,m_dateTimeOn, operator_call, m_myCall, m_myGrid, ADIF);
|
||||||
QDialog::accept();
|
QDialog::accept();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public:
|
|||||||
QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn,
|
QString const& rptSent, QString const& rptRcvd, QDateTime const& dateTimeOn,
|
||||||
QDateTime const& dateTimeOff,
|
QDateTime const& dateTimeOff,
|
||||||
Radio::Frequency dialFreq, QString const& myCall, QString const& myGrid,
|
Radio::Frequency dialFreq, QString const& myCall, QString const& myGrid,
|
||||||
bool toRTTY, bool dBtoComments, bool bFox, QString const& opCall);
|
bool toDATA, bool dBtoComments, bool bFox, QString const& opCall);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void accept();
|
void accept();
|
||||||
@@ -42,7 +42,7 @@ signals:
|
|||||||
void acceptQSO (QDateTime const& QSO_date_off, QString const& call, QString const& grid
|
void acceptQSO (QDateTime const& QSO_date_off, QString const& call, QString const& grid
|
||||||
, Radio::Frequency dial_freq, QString const& mode, QString const& submode
|
, Radio::Frequency dial_freq, QString const& mode, QString const& submode
|
||||||
, QString const& rpt_sent, QString const& rpt_received
|
, QString const& rpt_sent, QString const& rpt_received
|
||||||
, QString const& tx_power, QString const& comments
|
, QString const& comments
|
||||||
, QString const& name, QDateTime const& QSO_date_on, QString const& operator_call
|
, QString const& name, QDateTime const& QSO_date_on, QString const& operator_call
|
||||||
, QString const& my_call, QString const& my_grid, QByteArray const& ADIF);
|
, QString const& my_call, QString const& my_grid, QByteArray const& ADIF);
|
||||||
|
|
||||||
@@ -56,7 +56,6 @@ private:
|
|||||||
QScopedPointer<Ui::LogQSO> ui;
|
QScopedPointer<Ui::LogQSO> ui;
|
||||||
QSettings * m_settings;
|
QSettings * m_settings;
|
||||||
Configuration const * m_config;
|
Configuration const * m_config;
|
||||||
QString m_txPower;
|
|
||||||
QString m_comments;
|
QString m_comments;
|
||||||
Radio::Frequency m_dialFreq;
|
Radio::Frequency m_dialFreq;
|
||||||
QString m_myCall;
|
QString m_myCall;
|
||||||
|
|||||||
@@ -125,6 +125,19 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer_3">
|
||||||
|
<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>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||||
<item>
|
<item>
|
||||||
@@ -307,25 +320,17 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_6">
|
<spacer name="verticalSpacer_2">
|
||||||
<item>
|
<property name="orientation">
|
||||||
<widget class="QLabel" name="label_2">
|
<enum>Qt::Vertical</enum>
|
||||||
<property name="text">
|
</property>
|
||||||
<string>Tx power</string>
|
<property name="sizeHint" stdset="0">
|
||||||
</property>
|
<size>
|
||||||
</widget>
|
<width>20</width>
|
||||||
</item>
|
<height>40</height>
|
||||||
<item>
|
</size>
|
||||||
<widget class="QLineEdit" name="txPower"/>
|
</property>
|
||||||
</item>
|
</spacer>
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="cbTxPower">
|
|
||||||
<property name="text">
|
|
||||||
<string>Retain</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
@@ -434,8 +439,6 @@
|
|||||||
<tabstop>rcvd</tabstop>
|
<tabstop>rcvd</tabstop>
|
||||||
<tabstop>grid</tabstop>
|
<tabstop>grid</tabstop>
|
||||||
<tabstop>name</tabstop>
|
<tabstop>name</tabstop>
|
||||||
<tabstop>txPower</tabstop>
|
|
||||||
<tabstop>cbTxPower</tabstop>
|
|
||||||
<tabstop>comments</tabstop>
|
<tabstop>comments</tabstop>
|
||||||
<tabstop>cbComments</tabstop>
|
<tabstop>cbComments</tabstop>
|
||||||
</tabstops>
|
</tabstops>
|
||||||
|
|||||||
+699
-216
File diff suppressed because it is too large
Load Diff
+24
-8
@@ -44,6 +44,7 @@
|
|||||||
#include "qpriorityqueue.h"
|
#include "qpriorityqueue.h"
|
||||||
#include "varicode.h"
|
#include "varicode.h"
|
||||||
#include "MessageClient.hpp"
|
#include "MessageClient.hpp"
|
||||||
|
#include "SpotClient.h"
|
||||||
#include "APRSISClient.h"
|
#include "APRSISClient.h"
|
||||||
#include "keyeater.h"
|
#include "keyeater.h"
|
||||||
|
|
||||||
@@ -176,6 +177,7 @@ private slots:
|
|||||||
void on_tx5_currentTextChanged (QString const&);
|
void on_tx5_currentTextChanged (QString const&);
|
||||||
void on_tx6_editingFinished();
|
void on_tx6_editingFinished();
|
||||||
void on_menuControl_aboutToShow();
|
void on_menuControl_aboutToShow();
|
||||||
|
void on_actionCheck_for_Updates_triggered();
|
||||||
void on_actionEnable_Spotting_toggled(bool checked);
|
void on_actionEnable_Spotting_toggled(bool checked);
|
||||||
void on_actionEnable_Auto_Reply_toggled(bool checked);
|
void on_actionEnable_Auto_Reply_toggled(bool checked);
|
||||||
void on_menuWindow_aboutToShow();
|
void on_menuWindow_aboutToShow();
|
||||||
@@ -282,7 +284,7 @@ private slots:
|
|||||||
void buildFrequencyMenu(QMenu *menu);
|
void buildFrequencyMenu(QMenu *menu);
|
||||||
void buildHeartbeatMenu(QMenu *menu);
|
void buildHeartbeatMenu(QMenu *menu);
|
||||||
void buildCQMenu(QMenu *menu);
|
void buildCQMenu(QMenu *menu);
|
||||||
void buildRepeatMenu(QMenu *menu, QPushButton * button, int * interval);
|
void buildRepeatMenu(QMenu *menu, QPushButton * button, bool isLowInterval, int * interval);
|
||||||
void sendHeartbeat();
|
void sendHeartbeat();
|
||||||
void sendHeartbeatAck(QString to, int snr, QString extra);
|
void sendHeartbeatAck(QString to, int snr, QString extra);
|
||||||
void on_hbMacroButton_toggled(bool checked);
|
void on_hbMacroButton_toggled(bool checked);
|
||||||
@@ -292,7 +294,7 @@ private slots:
|
|||||||
void on_cqMacroButton_clicked();
|
void on_cqMacroButton_clicked();
|
||||||
void on_replyMacroButton_clicked();
|
void on_replyMacroButton_clicked();
|
||||||
void on_snrMacroButton_clicked();
|
void on_snrMacroButton_clicked();
|
||||||
void on_qthMacroButton_clicked();
|
void on_infoMacroButton_clicked();
|
||||||
void setShowColumn(QString tableKey, QString columnKey, bool value);
|
void setShowColumn(QString tableKey, QString columnKey, bool value);
|
||||||
bool showColumn(QString tableKey, QString columnKey, bool default_=true);
|
bool showColumn(QString tableKey, QString columnKey, bool default_=true);
|
||||||
void buildShowColumnsMenu(QMenu *menu, QString tableKey);
|
void buildShowColumnsMenu(QMenu *menu, QString tableKey);
|
||||||
@@ -343,7 +345,7 @@ private slots:
|
|||||||
void acceptQSO (QDateTime const&, QString const& call, QString const& grid
|
void acceptQSO (QDateTime const&, QString const& call, QString const& grid
|
||||||
, Frequency dial_freq, QString const& mode, QString const& submode
|
, Frequency dial_freq, QString const& mode, QString const& submode
|
||||||
, QString const& rpt_sent, QString const& rpt_received
|
, QString const& rpt_sent, QString const& rpt_received
|
||||||
, QString const& tx_power, QString const& comments
|
, QString const& comments
|
||||||
, QString const& name, QDateTime const& QSO_date_on, QString const& operator_call
|
, QString const& name, QDateTime const& QSO_date_on, QString const& operator_call
|
||||||
, QString const& my_call, QString const& my_grid, QByteArray const& ADIF);
|
, QString const& my_call, QString const& my_grid, QByteArray const& ADIF);
|
||||||
void on_bandComboBox_currentIndexChanged (int index);
|
void on_bandComboBox_currentIndexChanged (int index);
|
||||||
@@ -383,6 +385,7 @@ private slots:
|
|||||||
void on_cbFirst_toggled(bool b);
|
void on_cbFirst_toggled(bool b);
|
||||||
void on_cbAutoSeq_toggled(bool b);
|
void on_cbAutoSeq_toggled(bool b);
|
||||||
void emitPTT(bool on);
|
void emitPTT(bool on);
|
||||||
|
void emitTones();
|
||||||
void networkMessage(Message const &message);
|
void networkMessage(Message const &message);
|
||||||
void sendNetworkMessage(QString const &type, QString const &message);
|
void sendNetworkMessage(QString const &type, QString const &message);
|
||||||
void sendNetworkMessage(QString const &type, QString const &message, const QMap<QString, QVariant> ¶ms);
|
void sendNetworkMessage(QString const &type, QString const &message, const QMap<QString, QVariant> ¶ms);
|
||||||
@@ -411,7 +414,7 @@ private slots:
|
|||||||
void on_cbCQTx_toggled(bool b);
|
void on_cbCQTx_toggled(bool b);
|
||||||
void splash_done ();
|
void splash_done ();
|
||||||
void on_measure_check_box_stateChanged (int);
|
void on_measure_check_box_stateChanged (int);
|
||||||
void checkExpiryWarningMessage ();
|
void checkVersion(bool alertOnUpToDate);
|
||||||
void checkStartupWarnings ();
|
void checkStartupWarnings ();
|
||||||
void clearCallsignSelected();
|
void clearCallsignSelected();
|
||||||
void refreshTextDisplay();
|
void refreshTextDisplay();
|
||||||
@@ -712,6 +715,7 @@ private:
|
|||||||
QString through;
|
QString through;
|
||||||
QString grid;
|
QString grid;
|
||||||
int freq;
|
int freq;
|
||||||
|
QDateTime cqTimestamp;
|
||||||
QDateTime ackTimestamp;
|
QDateTime ackTimestamp;
|
||||||
QDateTime utcTimestamp;
|
QDateTime utcTimestamp;
|
||||||
int snr;
|
int snr;
|
||||||
@@ -759,6 +763,7 @@ private:
|
|||||||
QList<ActivityDetail> msgs;
|
QList<ActivityDetail> msgs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
QString m_prevSelectedCallsign;
|
||||||
int m_bandActivityWidth;
|
int m_bandActivityWidth;
|
||||||
int m_callActivityWidth;
|
int m_callActivityWidth;
|
||||||
int m_textActivityWidth;
|
int m_textActivityWidth;
|
||||||
@@ -826,12 +831,15 @@ private:
|
|||||||
|
|
||||||
QMap<QString, int> m_rxInboxCountCache; // call -> count
|
QMap<QString, int> m_rxInboxCountCache; // call -> count
|
||||||
|
|
||||||
QMap<QString, QMap<QString, CallDetail>> m_callActivityCache; // band -> call activity
|
QMap<QString, QMap<QString, CallDetail>> m_callActivityBandCache; // band -> call activity
|
||||||
QMap<QString, QMap<int, QList<ActivityDetail>>> m_bandActivityCache; // band -> band activity
|
QMap<QString, QMap<int, QList<ActivityDetail>>> m_bandActivityBandCache; // band -> band activity
|
||||||
QMap<QString, QString> m_rxTextCache; // band -> rx text
|
QMap<QString, QString> m_rxTextBandCache; // band -> rx text
|
||||||
|
QMap<QString, QMap<QString, QSet<QString>>> m_heardGraphOutgoingBandCache; // band -> heard in
|
||||||
|
QMap<QString, QMap<QString, QSet<QString>>> m_heardGraphIncomingBandCache; // band -> heard out
|
||||||
|
|
||||||
JSCChecker * m_checker;
|
JSCChecker * m_checker;
|
||||||
|
|
||||||
|
QMap<QString, QDateTime> m_callSelectedTime; // call -> timestamp when callsign was last selected
|
||||||
QSet<QString> m_callSeenHeartbeat; // call
|
QSet<QString> m_callSeenHeartbeat; // call
|
||||||
int m_previousFreq;
|
int m_previousFreq;
|
||||||
bool m_shouldRestoreFreq;
|
bool m_shouldRestoreFreq;
|
||||||
@@ -856,9 +864,12 @@ private:
|
|||||||
QQueue<QString> m_foxQSOinProgress; //QSOs in progress: Fox has sent a report
|
QQueue<QString> m_foxQSOinProgress; //QSOs in progress: Fox has sent a report
|
||||||
QQueue<qint64> m_foxRateQueue;
|
QQueue<qint64> m_foxRateQueue;
|
||||||
|
|
||||||
|
bool m_hbAutoAck;
|
||||||
bool m_hbHidden;
|
bool m_hbHidden;
|
||||||
int m_hbInterval;
|
int m_hbInterval;
|
||||||
int m_cqInterval;
|
int m_cqInterval;
|
||||||
|
bool m_hbPaused;
|
||||||
|
bool m_cqPaused;
|
||||||
QDateTime m_nextHeartbeat;
|
QDateTime m_nextHeartbeat;
|
||||||
QDateTime m_nextCQ;
|
QDateTime m_nextCQ;
|
||||||
QDateTime m_dateTimeQSOOn;
|
QDateTime m_dateTimeQSOOn;
|
||||||
@@ -889,6 +900,7 @@ private:
|
|||||||
QProgressDialog m_optimizingProgress;
|
QProgressDialog m_optimizingProgress;
|
||||||
MessageClient * m_messageClient;
|
MessageClient * m_messageClient;
|
||||||
PSK_Reporter *psk_Reporter;
|
PSK_Reporter *psk_Reporter;
|
||||||
|
SpotClient *m_spotClient;
|
||||||
APRSISClient * m_aprsClient;
|
APRSISClient * m_aprsClient;
|
||||||
DisplayManual m_manual;
|
DisplayManual m_manual;
|
||||||
QHash<QString, QVariant> m_pwrBandTxMemory; // Remembers power level by band
|
QHash<QString, QVariant> m_pwrBandTxMemory; // Remembers power level by band
|
||||||
@@ -913,8 +925,11 @@ private:
|
|||||||
bool shortList(QString callsign);
|
bool shortList(QString callsign);
|
||||||
void transmit (double snr = 99.);
|
void transmit (double snr = 99.);
|
||||||
void rigFailure (QString const& reason);
|
void rigFailure (QString const& reason);
|
||||||
|
void spotSetLocal();
|
||||||
void pskSetLocal ();
|
void pskSetLocal ();
|
||||||
void aprsSetLocal ();
|
void aprsSetLocal ();
|
||||||
|
void spotReport(int offset, int snr, QString callsign, QString grid);
|
||||||
|
void spotCmd(CommandDetail cmd);
|
||||||
void pskLogReport(QString mode, int offset, int snr, QString callsign, QString grid);
|
void pskLogReport(QString mode, int offset, int snr, QString callsign, QString grid);
|
||||||
void aprsLogReport(int offset, int snr, QString callsign, QString grid);
|
void aprsLogReport(int offset, int snr, QString callsign, QString grid);
|
||||||
Radio::Frequency dialFrequency();
|
Radio::Frequency dialFrequency();
|
||||||
@@ -935,6 +950,7 @@ private:
|
|||||||
bool isAllCallIncluded(QString const &text);
|
bool isAllCallIncluded(QString const &text);
|
||||||
bool isGroupCallIncluded(const QString &text);
|
bool isGroupCallIncluded(const QString &text);
|
||||||
QString callsignSelected(bool useInputText=false);
|
QString callsignSelected(bool useInputText=false);
|
||||||
|
void callsignSelectedChanged(QString old, QString current);
|
||||||
bool isRecentOffset(int offset);
|
bool isRecentOffset(int offset);
|
||||||
void markOffsetRecent(int offset);
|
void markOffsetRecent(int offset);
|
||||||
bool isDirectedOffset(int offset, bool *pIsAllCall);
|
bool isDirectedOffset(int offset, bool *pIsAllCall);
|
||||||
@@ -954,7 +970,7 @@ private:
|
|||||||
void refreshInboxCounts();
|
void refreshInboxCounts();
|
||||||
bool hasMessageHistory(QString call);
|
bool hasMessageHistory(QString call);
|
||||||
int addCommandToMyInbox(CommandDetail d);
|
int addCommandToMyInbox(CommandDetail d);
|
||||||
int addCommandToInboxStorage(QString type, CommandDetail d);
|
int addCommandToStorage(QString type, CommandDetail d);
|
||||||
int getNextMessageIdForCallsign(QString callsign);
|
int getNextMessageIdForCallsign(QString callsign);
|
||||||
QStringList parseRelayPathCallsigns(QString from, QString text);
|
QStringList parseRelayPathCallsigns(QString from, QString text);
|
||||||
void processAlertReplyForCommand(CommandDetail d, QString from, QString cmd);
|
void processAlertReplyForCommand(CommandDetail d, QString from, QString cmd);
|
||||||
|
|||||||
+190
-145
@@ -203,7 +203,7 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Current Frequency</string>
|
<string>Set Current Frequency</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="frameShape">
|
<property name="frameShape">
|
||||||
<enum>QFrame::NoFrame</enum>
|
<enum>QFrame::NoFrame</enum>
|
||||||
@@ -297,7 +297,7 @@ QPushButton[oob="true"] {
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>Current frequency offset</string>
|
<string>Set Current Frequency Offset</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QLabel {
|
<string notr="true">QLabel {
|
||||||
@@ -401,6 +401,12 @@ color : white;
|
|||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="mouseTracking">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Set Callsign and Grid</string>
|
||||||
|
</property>
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">QLabel {
|
<string notr="true">QLabel {
|
||||||
font-family: MS Shell Dlg 2;
|
font-family: MS Shell Dlg 2;
|
||||||
@@ -1242,14 +1248,6 @@ QTextEdit[transmitting="true"] {
|
|||||||
<string>Callsigns</string>
|
<string>Callsigns</string>
|
||||||
</property>
|
</property>
|
||||||
</column>
|
</column>
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>✓</string>
|
|
||||||
</property>
|
|
||||||
<property name="textAlignment">
|
|
||||||
<set>AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
<column>
|
<column>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Age</string>
|
<string>Age</string>
|
||||||
@@ -1280,6 +1278,24 @@ QTextEdit[transmitting="true"] {
|
|||||||
<string>Distance</string>
|
<string>Distance</string>
|
||||||
</property>
|
</property>
|
||||||
</column>
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>✓</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Worked Before</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Name</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Comment</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -1315,71 +1331,7 @@ QTextEdit[transmitting="true"] {
|
|||||||
<property name="bottomMargin">
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="1" column="14">
|
<item row="1" column="17">
|
||||||
<spacer name="horizontalSpacer_5">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeType">
|
|
||||||
<enum>QSizePolicy::Preferred</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>10</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="6">
|
|
||||||
<widget class="QPushButton" name="macrosMacroButton">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>30</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Send a saved message</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Saved</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="3">
|
|
||||||
<widget class="QPushButton" name="replyMacroButton">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>30</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Reply to a CQ</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Reply</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="4">
|
|
||||||
<widget class="QPushButton" name="snrMacroButton">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>30</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Send an SNR message</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>SNR</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="16">
|
|
||||||
<widget class="QPushButton" name="stopTxButton">
|
<widget class="QPushButton" name="stopTxButton">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
@@ -1395,8 +1347,8 @@ QTextEdit[transmitting="true"] {
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="5">
|
<item row="1" column="1">
|
||||||
<widget class="QPushButton" name="qthMacroButton">
|
<widget class="QPushButton" name="cqMacroButton">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
@@ -1404,23 +1356,7 @@ QTextEdit[transmitting="true"] {
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Send your station location message</p></body></html></string>
|
<string><html><head/><body><p>Send a CQ message</p></body></html></string>
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>QTH</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QPushButton" name="hbMacroButton">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>30</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p align="justify">Send a Heartbeat message</p></body></html></string>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="autoFillBackground">
|
<property name="autoFillBackground">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -1432,14 +1368,33 @@ QTextEdit[transmitting="true"] {
|
|||||||
}</string>
|
}</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>HB</string>
|
<string>CQ</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checkable">
|
<property name="checkable">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="flat">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="15">
|
<item row="1" column="15">
|
||||||
|
<spacer name="horizontalSpacer_5">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeType">
|
||||||
|
<enum>QSizePolicy::Preferred</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>10</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="16">
|
||||||
<widget class="QPushButton" name="startTxButton">
|
<widget class="QPushButton" name="startTxButton">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
@@ -1475,6 +1430,130 @@ color:#222;
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="12">
|
<item row="1" column="12">
|
||||||
|
<widget class="QPushButton" name="queryButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>30</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Send a directed message to another station</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Directed</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="5">
|
||||||
|
<widget class="QPushButton" name="infoMacroButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>30</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Send your station information</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>INFO</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="7">
|
||||||
|
<widget class="QPushButton" name="macrosMacroButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>30</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Send a saved message</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Saved</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="3">
|
||||||
|
<widget class="QPushButton" name="replyMacroButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>30</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Reply to a CQ</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>REPLY</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QPushButton" name="hbMacroButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>30</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p align="justify">Send a Heartbeat message</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="autoFillBackground">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">QPushButton:checked {
|
||||||
|
font-weight:bold;
|
||||||
|
color:black;
|
||||||
|
}</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>HB</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="8">
|
||||||
|
<spacer name="horizontalSpacer_8">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeType">
|
||||||
|
<enum>QSizePolicy::Preferred</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>10</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="4">
|
||||||
|
<widget class="QPushButton" name="snrMacroButton">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>30</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string><html><head/><body><p>Send an signal report</p></body></html></string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>SNR</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="13">
|
||||||
<widget class="QPushButton" name="deselectButton">
|
<widget class="QPushButton" name="deselectButton">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||||
@@ -1496,24 +1575,8 @@ color:#222;
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="11">
|
<item row="1" column="6">
|
||||||
<widget class="QPushButton" name="queryButton">
|
<spacer name="horizontalSpacer_11">
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>30</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Send a directed message to another station</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Directed</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="7">
|
|
||||||
<spacer name="horizontalSpacer_8">
|
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
@@ -1528,37 +1591,6 @@ color:#222;
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QPushButton" name="cqMacroButton">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>30</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string><html><head/><body><p>Send a CQ message</p></body></html></string>
|
|
||||||
</property>
|
|
||||||
<property name="autoFillBackground">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">QPushButton:checked {
|
|
||||||
font-weight:bold;
|
|
||||||
color:black;
|
|
||||||
}</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>CQ</string>
|
|
||||||
</property>
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="flat">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QFrame" name="frame_5">
|
<widget class="QFrame" name="frame_5">
|
||||||
@@ -4581,7 +4613,7 @@ list. The list can be maintained in Settings (F2).</string>
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>994</width>
|
<width>994</width>
|
||||||
<height>22</height>
|
<height>25</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menuFile">
|
<widget class="QMenu" name="menuFile">
|
||||||
@@ -4656,6 +4688,7 @@ list. The list can be maintained in Settings (F2).</string>
|
|||||||
<addaction name="actionShort_list_of_add_on_prefixes_and_suffixes"/>
|
<addaction name="actionShort_list_of_add_on_prefixes_and_suffixes"/>
|
||||||
<addaction name="actionCopyright_Notice"/>
|
<addaction name="actionCopyright_Notice"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
|
<addaction name="actionCheck_for_Updates"/>
|
||||||
<addaction name="actionAbout"/>
|
<addaction name="actionAbout"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menuMode">
|
<widget class="QMenu" name="menuMode">
|
||||||
@@ -4723,6 +4756,8 @@ list. The list can be maintained in Settings (F2).</string>
|
|||||||
<addaction name="actionShow_Statusbar"/>
|
<addaction name="actionShow_Statusbar"/>
|
||||||
<addaction name="actionShow_Tooltips"/>
|
<addaction name="actionShow_Tooltips"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
|
<addaction name="actionShow_Message_Inbox"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
<addaction name="actionReset_Window_Sizes"/>
|
<addaction name="actionReset_Window_Sizes"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_Log">
|
<widget class="QMenu" name="menu_Log">
|
||||||
@@ -5638,6 +5673,16 @@ list. The list can be maintained in Settings (F2).</string>
|
|||||||
<string>Set Offset...</string>
|
<string>Set Offset...</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionShow_Message_Inbox">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show Message Inbox...</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionCheck_for_Updates">
|
||||||
|
<property name="text">
|
||||||
|
<string>Check for Updates</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11"/>
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
|
|||||||
+33
-1
@@ -3,6 +3,7 @@
|
|||||||
#include "moc_messagewindow.cpp"
|
#include "moc_messagewindow.cpp"
|
||||||
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
#include <QMenu>
|
||||||
|
|
||||||
#include "Radio.hpp"
|
#include "Radio.hpp"
|
||||||
#include "keyeater.h"
|
#include "keyeater.h"
|
||||||
@@ -41,6 +42,30 @@ MessageWindow::MessageWindow(QWidget *parent) :
|
|||||||
|
|
||||||
ui->messageTableWidget->horizontalHeader()->setVisible(true);
|
ui->messageTableWidget->horizontalHeader()->setVisible(true);
|
||||||
ui->messageTableWidget->resizeColumnsToContents();
|
ui->messageTableWidget->resizeColumnsToContents();
|
||||||
|
|
||||||
|
ui->messageTableWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
|
||||||
|
auto deleteAction = new QAction("Delete", ui->messageTableWidget);
|
||||||
|
connect(deleteAction, &QAction::triggered, this, [this](){
|
||||||
|
auto items = ui->messageTableWidget->selectedItems();
|
||||||
|
if(items.isEmpty()){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto item = items.first();
|
||||||
|
auto col = ui->messageTableWidget->item(item->row(), 1);
|
||||||
|
if(!col){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bool ok = false;
|
||||||
|
auto mid = col->data(Qt::UserRole).toInt(&ok);
|
||||||
|
if(!ok){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->messageTableWidget->removeRow(item->row());
|
||||||
|
|
||||||
|
emit this->deleteMessage(mid);
|
||||||
|
});
|
||||||
|
ui->messageTableWidget->addAction(deleteAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageWindow::~MessageWindow()
|
MessageWindow::~MessageWindow()
|
||||||
@@ -49,7 +74,7 @@ MessageWindow::~MessageWindow()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MessageWindow::setCall(const QString &call){
|
void MessageWindow::setCall(const QString &call){
|
||||||
setWindowTitle(QString("Message History: %1").arg(call));
|
setWindowTitle(QString("Messages: %1").arg(call == "%" ? "All" : call));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageWindow::populateMessages(QList<QPair<int, Message> > msgs){
|
void MessageWindow::populateMessages(QList<QPair<int, Message> > msgs){
|
||||||
@@ -99,6 +124,12 @@ void MessageWindow::populateMessages(QList<QPair<int, Message> > msgs){
|
|||||||
fromItem->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
fromItem->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
||||||
ui->messageTableWidget->setItem(row, col++, fromItem);
|
ui->messageTableWidget->setItem(row, col++, fromItem);
|
||||||
|
|
||||||
|
auto to = params.value("TO").toString();
|
||||||
|
auto toItem = new QTableWidgetItem(to);
|
||||||
|
toItem->setData(Qt::UserRole, to);
|
||||||
|
toItem->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
|
||||||
|
ui->messageTableWidget->setItem(row, col++, toItem);
|
||||||
|
|
||||||
auto text = params.value("TEXT").toString();
|
auto text = params.value("TEXT").toString();
|
||||||
auto textItem = new QTableWidgetItem(text);
|
auto textItem = new QTableWidgetItem(text);
|
||||||
textItem->setData(Qt::UserRole, text);
|
textItem->setData(Qt::UserRole, text);
|
||||||
@@ -111,6 +142,7 @@ void MessageWindow::populateMessages(QList<QPair<int, Message> > msgs){
|
|||||||
ui->messageTableWidget->resizeColumnToContents(2);
|
ui->messageTableWidget->resizeColumnToContents(2);
|
||||||
ui->messageTableWidget->resizeColumnToContents(3);
|
ui->messageTableWidget->resizeColumnToContents(3);
|
||||||
ui->messageTableWidget->resizeColumnToContents(4);
|
ui->messageTableWidget->resizeColumnToContents(4);
|
||||||
|
ui->messageTableWidget->resizeColumnToContents(5);
|
||||||
}
|
}
|
||||||
ui->messageTableWidget->setUpdatesEnabled(true);
|
ui->messageTableWidget->setUpdatesEnabled(true);
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ public:
|
|||||||
~MessageWindow();
|
~MessageWindow();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
void deleteMessage(int id);
|
||||||
void replyMessage(const QString &call);
|
void replyMessage(const QString &call);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|||||||
@@ -137,6 +137,11 @@
|
|||||||
<string>From</string>
|
<string>From</string>
|
||||||
</property>
|
</property>
|
||||||
</column>
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>To</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
<column>
|
<column>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Message</string>
|
<string>Message</string>
|
||||||
|
|||||||
+79
-24
@@ -36,7 +36,7 @@ QString alphabet = {"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+-./?"}; // alphabet to
|
|||||||
QString alphabet72 = {"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+/?."};
|
QString alphabet72 = {"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-+/?."};
|
||||||
QString grid_pattern = {R"((?<grid>[A-X]{2}[0-9]{2}(?:[A-X]{2}(?:[0-9]{2})?)*)+)"};
|
QString grid_pattern = {R"((?<grid>[A-X]{2}[0-9]{2}(?:[A-X]{2}(?:[0-9]{2})?)*)+)"};
|
||||||
QString orig_compound_callsign_pattern = {R"((?<callsign>(\d|[A-Z])+\/?((\d|[A-Z]){2,})(\/(\d|[A-Z])+)?(\/(\d|[A-Z])+)?))"};
|
QString orig_compound_callsign_pattern = {R"((?<callsign>(\d|[A-Z])+\/?((\d|[A-Z]){2,})(\/(\d|[A-Z])+)?(\/(\d|[A-Z])+)?))"};
|
||||||
QString base_callsign_pattern = {R"((?<callsign>\b(?<base>([0-9A-Z])?([0-9A-Z])([0-9])([A-Z])?([A-Z])?([A-Z])?)\b))"};
|
QString base_callsign_pattern = {R"((?<callsign>\b(?<base>([0-9A-Z])?([0-9A-Z])([0-9])([A-Z])?([A-Z])?([A-Z])?)(?<portable>[/][P])?\b))"};
|
||||||
//QString compound_callsign_pattern = {R"((?<callsign>\b(?<prefix>[A-Z0-9]{1,4}\/)?(?<base>([0-9A-Z])?([0-9A-Z])([0-9])([A-Z])?([A-Z])?([A-Z])?)(?<suffix>\/[A-Z0-9]{1,4})?)\b)"};
|
//QString compound_callsign_pattern = {R"((?<callsign>\b(?<prefix>[A-Z0-9]{1,4}\/)?(?<base>([0-9A-Z])?([0-9A-Z])([0-9])([A-Z])?([A-Z])?([A-Z])?)(?<suffix>\/[A-Z0-9]{1,4})?)\b)"};
|
||||||
QString compound_callsign_pattern = {R"((?<callsign>(?:[@]?|\b)(?<extended>[A-Z0-9\/@][A-Z0-9\/]{0,2}[\/]?[A-Z0-9\/]{0,3}[\/]?[A-Z0-9\/]{0,3})\b))"};
|
QString compound_callsign_pattern = {R"((?<callsign>(?:[@]?|\b)(?<extended>[A-Z0-9\/@][A-Z0-9\/]{0,2}[\/]?[A-Z0-9\/]{0,3}[\/]?[A-Z0-9\/]{0,3})\b))"};
|
||||||
QString pack_callsign_pattern = {R"(([0-9A-Z ])([0-9A-Z])([0-9])([A-Z ])([A-Z ])([A-Z ]))"};
|
QString pack_callsign_pattern = {R"(([0-9A-Z ])([0-9A-Z])([0-9])([A-Z ])([A-Z ])([A-Z ]))"};
|
||||||
@@ -50,8 +50,9 @@ QMap<QString, int> directed_cmds = {
|
|||||||
{" SNR?", 0 }, // query snr
|
{" SNR?", 0 }, // query snr
|
||||||
{"?", 0 }, // compat
|
{"?", 0 }, // compat
|
||||||
|
|
||||||
//{" ", 1 }, // unused
|
{" DIT DIT", 1 }, // unused
|
||||||
//{" ", 2 }, // unused
|
|
||||||
|
{" NACK", 2 }, // negative acknowledge
|
||||||
|
|
||||||
{" HEARING?", 3 }, // query station calls heard
|
{" HEARING?", 3 }, // query station calls heard
|
||||||
|
|
||||||
@@ -72,6 +73,7 @@ QMap<QString, int> directed_cmds = {
|
|||||||
{" QUERY", 11 }, // generic query
|
{" QUERY", 11 }, // generic query
|
||||||
|
|
||||||
{" QUERY MSGS", 12 }, // do you have any stored messages?
|
{" QUERY MSGS", 12 }, // do you have any stored messages?
|
||||||
|
{" QUERY MSGS?", 12 }, // do you have any stored messages?
|
||||||
|
|
||||||
{" QUERY CALL", 13 }, // can you transmit a ping to callsign?
|
{" QUERY CALL", 13 }, // can you transmit a ping to callsign?
|
||||||
|
|
||||||
@@ -79,8 +81,8 @@ QMap<QString, int> directed_cmds = {
|
|||||||
|
|
||||||
{" GRID", 15 }, // this is my current grid locator
|
{" GRID", 15 }, // this is my current grid locator
|
||||||
|
|
||||||
{" QTH?", 16 }, // what is your qth message?
|
{" INFO?", 16 }, // what is your info message?
|
||||||
{" QTH", 17 }, // this is my qth message
|
{" INFO", 17 }, // this is my info message
|
||||||
|
|
||||||
{" FB", 18 }, // fine business
|
{" FB", 18 }, // fine business
|
||||||
{" HW CPY?", 19 }, // how do you copy?
|
{" HW CPY?", 19 }, // how do you copy?
|
||||||
@@ -103,7 +105,7 @@ QMap<QString, int> directed_cmds = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// commands allowed to be processed
|
// commands allowed to be processed
|
||||||
QSet<int> allowed_cmds = {-1, 0, /*1,*/ /*2,*/ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
|
QSet<int> allowed_cmds = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
|
||||||
|
|
||||||
// commands that result in an autoreply (which can be relayed)
|
// commands that result in an autoreply (which can be relayed)
|
||||||
QSet<int> autoreply_cmds = {0, 3, 4, 6, 9, 10, 11, 12, 13, 16, 30};
|
QSet<int> autoreply_cmds = {0, 3, 4, 6, 9, 10, 11, 12, 13, 16, 30};
|
||||||
@@ -128,10 +130,10 @@ QMap<int, int> checksum_cmds = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
QString callsign_pattern = QString("(?<callsign>[@]?[A-Z0-9/]+)");
|
QString callsign_pattern = QString("(?<callsign>[@]?[A-Z0-9/]+)");
|
||||||
QString optional_cmd_pattern = QString("(?<cmd>\\s?(?:AGN[?]|QSL[?]|HW CPY[?]|APRS[:]|MSG TO[:]|SNR[?]|QTH[?]|GRID[?]|STATUS[?]|HEARING[?]|(?:(?:STATUS|HEARING|QUERY CALL|QUERY MSGS|QUERY|CMD|MSG|ACK|73|YES|NO|SNR|QSL|RR|SK|FB|QTH|GRID)(?=[ ]|$))|[?> ]))?");
|
QString optional_cmd_pattern = QString("(?<cmd>\\s?(?:AGN[?]|QSL[?]|HW CPY[?]|APRS[:]|MSG TO[:]|SNR[?]|INFO[?]|GRID[?]|STATUS[?]|QUERY MSGS[?]|HEARING[?]|(?:(?:STATUS|HEARING|QUERY CALL|QUERY MSGS|QUERY|CMD|MSG|NACK|ACK|73|YES|NO|SNR|QSL|RR|SK|FB|INFO|GRID|DIT DIT)(?=[ ]|$))|[?> ]))?");
|
||||||
QString optional_grid_pattern = QString("(?<grid>\\s?[A-R]{2}[0-9]{2})?");
|
QString optional_grid_pattern = QString("(?<grid>\\s?[A-R]{2}[0-9]{2})?");
|
||||||
QString optional_extended_grid_pattern = QString("^(?<grid>\\s?(?:[A-R]{2}[0-9]{2}(?:[A-X]{2}(?:[0-9]{2})?)*))?");
|
QString optional_extended_grid_pattern = QString("^(?<grid>\\s?(?:[A-R]{2}[0-9]{2}(?:[A-X]{2}(?:[0-9]{2})?)*))?");
|
||||||
QString optional_num_pattern = QString("(?<num>(?<=SNR|ACK)\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?");
|
QString optional_num_pattern = QString("(?<num>(?<=SNR|\\bACK)\\s?[-+]?(?:3[01]|[0-2]?[0-9]))?");
|
||||||
|
|
||||||
QRegularExpression directed_re("^" +
|
QRegularExpression directed_re("^" +
|
||||||
callsign_pattern +
|
callsign_pattern +
|
||||||
@@ -205,9 +207,41 @@ quint16 nusergrid = nbasegrid + 10;
|
|||||||
quint16 nmaxgrid = (1<<15)-1;
|
quint16 nmaxgrid = (1<<15)-1;
|
||||||
|
|
||||||
QMap<QString, quint32> basecalls = {
|
QMap<QString, quint32> basecalls = {
|
||||||
{ "<....>", nbasecall + 1 }, // incomplete callsign
|
{ "<....>", nbasecall + 1 }, // incomplete callsign
|
||||||
{ "@ALLCALL", nbasecall + 2 }, // ALLCALL group
|
{ "@ALLCALL", nbasecall + 2 }, // ALLCALL group
|
||||||
{ "@JS8NET", nbasecall + 3 }, // JS8NET group
|
{ "@JS8NET", nbasecall + 3 }, // JS8NET group
|
||||||
|
|
||||||
|
// continental dx
|
||||||
|
{ "@DX/NA", nbasecall + 4 }, // North America DX group
|
||||||
|
{ "@DX/SA", nbasecall + 5 }, // South America DX group
|
||||||
|
{ "@DX/EU", nbasecall + 6 }, // Europe DX group
|
||||||
|
{ "@DX/AS", nbasecall + 7 }, // Asia DX group
|
||||||
|
{ "@DX/AF", nbasecall + 8 }, // Africa DX group
|
||||||
|
{ "@DX/OC", nbasecall + 9 }, // Oceania DX group
|
||||||
|
{ "@DX/AN", nbasecall + 10 }, // Antarctica DX group
|
||||||
|
|
||||||
|
// itu regions
|
||||||
|
{ "@REGION/1", nbasecall + 11 }, // ITU Region 1
|
||||||
|
{ "@REGION/2", nbasecall + 12 }, // ITU Region 2
|
||||||
|
{ "@REGION/3", nbasecall + 13 }, // ITU Region 3
|
||||||
|
|
||||||
|
// generic
|
||||||
|
{ "@GROUP/0", nbasecall + 14 }, // Generic group
|
||||||
|
{ "@GROUP/1", nbasecall + 15 }, // Generic group
|
||||||
|
{ "@GROUP/2", nbasecall + 16 }, // Generic group
|
||||||
|
{ "@GROUP/3", nbasecall + 17 }, // Generic group
|
||||||
|
{ "@GROUP/4", nbasecall + 18 }, // Generic group
|
||||||
|
{ "@GROUP/5", nbasecall + 19 }, // Generic group
|
||||||
|
{ "@GROUP/6", nbasecall + 20 }, // Generic group
|
||||||
|
{ "@GROUP/7", nbasecall + 21 }, // Generic group
|
||||||
|
{ "@GROUP/8", nbasecall + 22 }, // Generic group
|
||||||
|
{ "@GROUP/9", nbasecall + 23 }, // Generic group
|
||||||
|
|
||||||
|
// ops
|
||||||
|
{ "@COMMAND", nbasecall + 24 }, // Command group
|
||||||
|
{ "@CONTROL", nbasecall + 25 }, // Control group
|
||||||
|
{ "@NET", nbasecall + 26 }, // Net group
|
||||||
|
{ "@NTS", nbasecall + 27 }, // NTS group
|
||||||
};
|
};
|
||||||
|
|
||||||
QMap<quint32, QString> cqs = {
|
QMap<quint32, QString> cqs = {
|
||||||
@@ -226,6 +260,7 @@ QMap<quint32, QString> hbs = {
|
|||||||
{ 1, "HB AUTO" }, // HB AUTO
|
{ 1, "HB AUTO" }, // HB AUTO
|
||||||
{ 2, "HB AUTO RELAY" }, // HB AUTO RELAY
|
{ 2, "HB AUTO RELAY" }, // HB AUTO RELAY
|
||||||
{ 3, "HB AUTO RELAY SPOT" }, // HB AUTO RELAY SPOT
|
{ 3, "HB AUTO RELAY SPOT" }, // HB AUTO RELAY SPOT
|
||||||
|
{ 7, "HB AUTO SPOT"}, // HB AUTO SPOT
|
||||||
{ 4, "HB RELAY" }, // HB RELAY
|
{ 4, "HB RELAY" }, // HB RELAY
|
||||||
{ 5, "HB RELAY SPOT" }, // HB RELAY SPOT
|
{ 5, "HB RELAY SPOT" }, // HB RELAY SPOT
|
||||||
{ 6, "HB SPOT" }, // HB SPOT
|
{ 6, "HB SPOT" }, // HB SPOT
|
||||||
@@ -815,8 +850,8 @@ QString Varicode::unpackAlphaNumeric50(quint64 packed){
|
|||||||
return value.replace(" ", "");
|
return value.replace(" ", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
// pack a callsign into a 28-bit value
|
// pack a callsign into a 28-bit value and a boolean portable flag
|
||||||
quint32 Varicode::packCallsign(QString const& value){
|
quint32 Varicode::packCallsign(QString const& value, bool *pPortable){
|
||||||
quint32 packed = 0;
|
quint32 packed = 0;
|
||||||
|
|
||||||
QString callsign = value.toUpper().trimmed();
|
QString callsign = value.toUpper().trimmed();
|
||||||
@@ -825,6 +860,13 @@ quint32 Varicode::packCallsign(QString const& value){
|
|||||||
return basecalls[callsign];
|
return basecalls[callsign];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// strip /P
|
||||||
|
if(callsign.endsWith("/P")){
|
||||||
|
callsign = callsign.left(callsign.length()-2);
|
||||||
|
|
||||||
|
if(pPortable) *pPortable = true;
|
||||||
|
}
|
||||||
|
|
||||||
// workaround for swaziland
|
// workaround for swaziland
|
||||||
if(callsign.startsWith("3DA0")){
|
if(callsign.startsWith("3DA0")){
|
||||||
callsign = "3D0" + callsign.mid(4);
|
callsign = "3D0" + callsign.mid(4);
|
||||||
@@ -886,7 +928,7 @@ quint32 Varicode::packCallsign(QString const& value){
|
|||||||
return packed;
|
return packed;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Varicode::unpackCallsign(quint32 value){
|
QString Varicode::unpackCallsign(quint32 value, bool portable){
|
||||||
foreach(auto key, basecalls.keys()){
|
foreach(auto key, basecalls.keys()){
|
||||||
if(basecalls[key] == value){
|
if(basecalls[key] == value){
|
||||||
return key;
|
return key;
|
||||||
@@ -926,7 +968,11 @@ QString Varicode::unpackCallsign(quint32 value){
|
|||||||
callsign = "3X" + callsign.mid(1);
|
callsign = "3X" + callsign.mid(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return callsign;
|
if(portable){
|
||||||
|
callsign = callsign.trimmed() + "/P";
|
||||||
|
}
|
||||||
|
|
||||||
|
return callsign.trimmed();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Varicode::deg2grid(float dlong, float dlat){
|
QString Varicode::deg2grid(float dlong, float dlat){
|
||||||
@@ -1132,8 +1178,6 @@ bool Varicode::isValidCallsign(const QString &callsign, bool *pIsCompound){
|
|||||||
if(match.hasMatch() && (match.capturedLength() == callsign.length())){
|
if(match.hasMatch() && (match.capturedLength() == callsign.length())){
|
||||||
bool isValid = isValidCompoundCallsign(match.capturedRef(0));
|
bool isValid = isValidCompoundCallsign(match.capturedRef(0));
|
||||||
|
|
||||||
qDebug() << "is valid compound??" << match.capturedRef(0) << isValid;
|
|
||||||
|
|
||||||
if(pIsCompound) *pIsCompound = isValid;
|
if(pIsCompound) *pIsCompound = isValid;
|
||||||
return isValid;
|
return isValid;
|
||||||
}
|
}
|
||||||
@@ -1143,7 +1187,7 @@ bool Varicode::isValidCallsign(const QString &callsign, bool *pIsCompound){
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Varicode::isCompoundCallsign(const QString &callsign){
|
bool Varicode::isCompoundCallsign(const QString &callsign){
|
||||||
if(basecalls.contains(callsign)){
|
if(basecalls.contains(callsign) && !callsign.startsWith("@")){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1441,8 +1485,11 @@ QString Varicode::packDirectedMessage(const QString &text, const QString &mycall
|
|||||||
if(pNum) *pNum = num;
|
if(pNum) *pNum = num;
|
||||||
}
|
}
|
||||||
|
|
||||||
quint32 packed_from = Varicode::packCallsign(from);
|
bool portable_from = false;
|
||||||
quint32 packed_to = Varicode::packCallsign(to);
|
quint32 packed_from = Varicode::packCallsign(from, &portable_from);
|
||||||
|
|
||||||
|
bool portable_to = false;
|
||||||
|
quint32 packed_to = Varicode::packCallsign(to, &portable_to);
|
||||||
|
|
||||||
if(packed_from == 0 || packed_to == 0){
|
if(packed_from == 0 || packed_to == 0){
|
||||||
if(n) *n = 0;
|
if(n) *n = 0;
|
||||||
@@ -1460,7 +1507,11 @@ QString Varicode::packDirectedMessage(const QString &text, const QString &mycall
|
|||||||
packed_cmd = directed_cmds[cmdOut];
|
packed_cmd = directed_cmds[cmdOut];
|
||||||
}
|
}
|
||||||
quint8 packed_flag = Varicode::FrameDirected;
|
quint8 packed_flag = Varicode::FrameDirected;
|
||||||
quint8 packed_extra = inum;
|
quint8 packed_extra = (
|
||||||
|
(((int)portable_from) << 7) +
|
||||||
|
(((int)portable_to) << 6) +
|
||||||
|
inum
|
||||||
|
);
|
||||||
|
|
||||||
// [3][28][28][5],[2][6] = 72
|
// [3][28][28][5],[2][6] = 72
|
||||||
auto bits = (
|
auto bits = (
|
||||||
@@ -1472,7 +1523,7 @@ QString Varicode::packDirectedMessage(const QString &text, const QString &mycall
|
|||||||
|
|
||||||
if(pCmd) *pCmd = cmdOut;
|
if(pCmd) *pCmd = cmdOut;
|
||||||
if(n) *n = match.captured(0).length();
|
if(n) *n = match.captured(0).length();
|
||||||
return Varicode::pack72bits(Varicode::bitsToInt(bits), packed_extra % 64);
|
return Varicode::pack72bits(Varicode::bitsToInt(bits), packed_extra);
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList Varicode::unpackDirectedMessage(const QString &text, quint8 *pType){
|
QStringList Varicode::unpackDirectedMessage(const QString &text, quint8 *pType){
|
||||||
@@ -1495,8 +1546,12 @@ QStringList Varicode::unpackDirectedMessage(const QString &text, quint8 *pType){
|
|||||||
quint32 packed_to = Varicode::bitsToInt(bits.mid(31, 28));
|
quint32 packed_to = Varicode::bitsToInt(bits.mid(31, 28));
|
||||||
quint8 packed_cmd = Varicode::bitsToInt(bits.mid(59, 5));
|
quint8 packed_cmd = Varicode::bitsToInt(bits.mid(59, 5));
|
||||||
|
|
||||||
QString from = Varicode::unpackCallsign(packed_from).trimmed();
|
bool portable_from = ((extra >> 7) & 1) == 1;
|
||||||
QString to = Varicode::unpackCallsign(packed_to).trimmed();
|
bool portable_to = ((extra >> 6) & 1) == 1;
|
||||||
|
extra = extra % 64;
|
||||||
|
|
||||||
|
QString from = Varicode::unpackCallsign(packed_from, portable_from);
|
||||||
|
QString to = Varicode::unpackCallsign(packed_to, portable_to);
|
||||||
QString cmd = directed_cmds.key(packed_cmd % 32);
|
QString cmd = directed_cmds.key(packed_cmd % 32);
|
||||||
|
|
||||||
unpacked.append(from);
|
unpacked.append(from);
|
||||||
|
|||||||
+2
-2
@@ -120,8 +120,8 @@ public:
|
|||||||
static quint64 packAlphaNumeric50(QString const& value);
|
static quint64 packAlphaNumeric50(QString const& value);
|
||||||
static QString unpackAlphaNumeric50(quint64 packed);
|
static QString unpackAlphaNumeric50(quint64 packed);
|
||||||
|
|
||||||
static quint32 packCallsign(QString const& value);
|
static quint32 packCallsign(QString const& value, bool *pPortable);
|
||||||
static QString unpackCallsign(quint32 value);
|
static QString unpackCallsign(quint32 value, bool portable);
|
||||||
|
|
||||||
static QString deg2grid(float dlong, float dlat);
|
static QString deg2grid(float dlong, float dlat);
|
||||||
static QPair<float, float> grid2deg(QString const &grid);
|
static QPair<float, float> grid2deg(QString const &grid);
|
||||||
|
|||||||
Reference in New Issue
Block a user