Compare commits

..

85 Commits

Author SHA1 Message Date
Jordan Sherer 9423640e52 Bump v1.0.0-devel 2019-03-31 17:56:13 -04:00
Jordan Sherer 952cc0b844 About URL change 2019-03-31 15:45:09 -04:00
Jordan Sherer 0bd7a74103 Implemented version checking on files.js8call.com, a configuration option for doing that on startup, and a menu item in the Help menu for checking it at will. 2019-03-31 14:36:40 -04:00
Jordan Sherer 82a0cdd0cf Added basic version check stub 2019-03-31 13:39:10 -04:00
Jordan Sherer 7f187f4cf8 Bump to v1.0.0 release 2019-03-31 10:47:14 -04:00
Jordan Sherer f2ba541f09 Bump to v1.0.0 2019-03-30 20:12:03 -04:00
Jordan Sherer e9d2d59842 Label should be JS8NET 2019-03-30 20:11:25 -04:00
Jordan Sherer bda9a5202e Updated icon tooltip in Call Activity 2019-03-30 20:10:16 -04:00
Jordan Sherer 40e1bfab0e Fixed defaults for HB and CQ repeat menus 2019-03-30 20:03:24 -04:00
Jordan Sherer b031a2cdbe Updated copyright 2019-03-30 09:50:11 -04:00
Jordan Sherer a2c6451b47 Added more clear labeling for disabled HB ack 2019-03-30 09:21:30 -04:00
Jordan Sherer 3f6c87b200 Removed expiration and warnings 2019-03-30 08:57:55 -04:00
Jordan Sherer fa4c39495d Fixed #163: Removed DATA from logging 2019-03-29 22:26:23 -04:00
Jordan Sherer 5f3b74338c Fixed QSO start time when you selected a station callsign 2019-03-28 16:37:33 -04:00
Jordan Sherer d1ccbc599b Fixed #160: HB ACKs not stopped during QSO with the new checkmark setting 2019-03-27 11:42:43 -04:00
Jordan Sherer 6e036b7d58 Updated to spot local only once every 15 minutes 2019-03-26 22:55:28 -04:00
Jordan Sherer 1629415dc1 Added spotting of messages directed to @JS8NET 2019-03-25 15:05:13 -04:00
Jordan Sherer 08cf869125 Added by.grid to SpotClient spots 2019-03-25 11:58:23 -04:00
Jordan Sherer 03bd44ae39 Updated SpotClient to send local data at least once every 5 minutes 2019-03-25 09:52:35 -04:00
Jordan Sherer 14626978c0 Updated heartbeat ack labeling 2019-03-24 22:37:18 -04:00
Jordan Sherer dd43f0db84 Changed my mind. HB ACKs should include SNR 2019-03-24 22:25:36 -04:00
Jordan Sherer 5646268faf Updated configuration reporting labeling to include JS8 Network 2019-03-24 22:19:24 -04:00
Jordan Sherer 5d21fdf1dc Added spotting to spot.js8call.com for future network data 2019-03-24 21:01:03 -04:00
Jordan Sherer 5d2ba76c17 Added explicit setting for automatically acknowledging heartbeat messages 2019-03-24 13:41:35 -04:00
Jordan Sherer 7bd86ca177 Fixed #94: swap heard graph on band change 2019-03-24 09:59:24 -04:00
Jordan Sherer 59b1a3b011 A few better tooltips 2019-03-24 09:26:22 -04:00
Jordan Sherer ce2c045458 Added click of callsign to open profile 2019-03-23 22:16:01 -04:00
Jordan Sherer 218c5b3d47 Fixed #142: callsign selected is an indicator for qso start time 2019-03-23 22:03:28 -04:00
Jordan Sherer 27ae28a889 Fixed #148: configuration tab ordering 2019-03-23 21:58:30 -04:00
Jordan Sherer 1a2596224a Bump to RC3 2019-03-23 21:48:15 -04:00
Jordan Sherer 82915540b4 Change SNR for HB ACK. Default to HB hidden 2019-03-23 21:42:51 -04:00
Jordan Sherer 73c6dd50fb Only show CQ icon for 5 minutes 2019-03-23 21:29:26 -04:00
Jordan Sherer ee48d8fd86 Added telephone icon for CQs. Added tooltip for last logged date 2019-03-23 21:19:24 -04:00
Jordan Sherer d8a16f4a42 Removed extraneous logbook debug statements 2019-03-23 11:42:31 -04:00
Jordan Sherer 5ef440faf6 Merged patch to fix #97 2019-03-21 21:14:23 -04:00
Jordan Sherer 9d9ae62526 Moved wsjtx qt creator to js8call 2019-03-21 21:01:58 -04:00
Jordan Sherer 6b9c9b4ceb Bump eol 2019-03-11 19:06:38 -04:00
Jordan Sherer 1febb18495 Added log details to the call activity menu 2019-03-10 23:48:56 -04:00
Jordan Sherer 43401c3c26 Added DIT DIT short message 2019-03-04 23:25:17 -05:00
Jordan Sherer 55928be661 Added log details column to call activity. TODO: add log details :P 2019-03-03 23:43:39 -05:00
Jordan Sherer a5f8593b3d Added NACK command for future implementation 2019-03-03 23:33:30 -05:00
Jordan Sherer 07f1594d0a Fixed #129: relays now use 'VIA' as the intermediate text for relay path computation. Fixed also relays still being ACKed while relay messaging was disabled. 2019-02-25 22:25:04 -05:00
Jordan Sherer b6dd6aadc8 Added a dummy data for testing newlines 2019-02-25 10:31:11 -05:00
Jordan Sherer b9b334c6cf Added tooltip with absolute date for age columns 2019-02-25 09:57:01 -05:00
Jordan Sherer fec45aa0ad Bump to RC2 2019-02-23 22:53:39 -05:00
Jordan Sherer 2ef4e90710 Fixed #135: query commands through relay. Changed the QUERY CALL reply format so as to not fconfuse folks with random ACKs. Cleaned up empty dB formatting in the call and band activity tables. 2019-02-23 22:49:02 -05:00
Jordan Sherer a0dc7bc013 Fixed #76: added tone output to API 2019-02-23 09:50:02 -05:00
Jordan Sherer 84a3ef6046 Fixed #110: duplicate acks weren't being displayed even if they came in minutes apart 2019-02-21 13:11:30 -05:00
Jordan Sherer 5565a7731e Added /P support to single-frame transmissions, ala KN4CRD/P: JY1/P SNR?. Boom 2019-02-21 12:42:46 -05:00
Jordan Sherer 1c1c5bf50a Bump eol date for 1.0 release 2019-02-20 23:09:54 -05:00
Jordan Sherer b34c0fd2e4 Bump to v1.0.0-rc1 2019-02-20 23:04:07 -05:00
Jordan Sherer fddb618fa2 Fixed #126: hearing should be parsed for every frame received not just dircted to me 2019-02-18 14:20:25 -05:00
Jordan Sherer 7101aec331 Expand macros for PSKReporter station info 2019-02-17 20:29:52 -05:00
Jordan Sherer 7b3bc259c6 Small UI tweak to macro buttons 2019-02-17 20:28:02 -05:00
Jordan Sherer f7ebd8d783 Fixed message history for stored messages 2019-02-16 23:20:28 -05:00
Jordan Sherer 8b3b34d876 Able to delete message from message inbox 2019-02-16 23:07:27 -05:00
Jordan Sherer 538c70d158 Remove valid compound check 2019-02-16 17:47:07 -05:00
Jordan Sherer 35be0fcc29 Fixed #122: frequencies should be sorted 2019-02-16 16:09:44 -05:00
Jordan Sherer ee339431c7 Added separator to menu 2019-02-16 16:01:23 -05:00
Jordan Sherer 8186348abe Added TO column to message inbox 2019-02-16 16:00:13 -05:00
Jordan Sherer f0ceb0f7f4 Added a global message inbox for when there's no callsign selected 2019-02-16 15:56:18 -05:00
Jordan Sherer bb4b79d797 Fixed #124: similar callsigns shouldn't hightlight 2019-02-16 11:47:54 -05:00
Jordan Sherer f1ed44f9e9 Fixed #123: add/remove allcall group like other groups 2019-02-16 10:40:44 -05:00
Jordan Sherer 0b9f75a9c8 Fixed HB starting after app start and deselect 2019-02-12 20:28:49 -05:00
Jordan Sherer c011b80a5a Added some pre-configured group names that can be transmitted in a single directed frame 2019-02-12 19:51:21 -05:00
Jordan Sherer 5446c979e9 Fixed issue with group callsigns not being able to be added 2019-02-12 19:37:41 -05:00
Jordan Sherer eca6813d8f Added optional question mark to 'QUERY MSGS?' 2019-02-11 18:44:35 -05:00
Jordan Sherer ea718b0fc1 Added start/stop menu item for hb and cq repeat timers 2019-02-11 11:04:05 -05:00
Jordan Sherer 4f243b1e1a Fixed issue with double printing of ACKS that have MSG IDs 2019-02-10 10:59:50 -05:00
Jordan Sherer ee350524fa Removed tx power from the log window. It's not valid ADIF without a dropdown 2019-02-10 09:37:26 -05:00
Jordan Sherer c4656fcada All caps for info 2019-02-09 17:08:06 -05:00
Jordan Sherer ce66e86b48 Fixed #73: disable HB and CQ while in QSO 2019-02-09 16:26:24 -05:00
Jordan Sherer 0664704eaf Store MSG with spaces surrounding cmd 2019-02-09 11:37:21 -05:00
Jordan Sherer a95bc26e3e Update tooltip for SNR button 2019-02-08 22:40:04 -05:00
Jordan Sherer 8da2f9f8d7 Repeat custom interval now displayed in the menu 2019-02-08 22:33:33 -05:00
Jordan Sherer dd78a9fe70 Added custom repeat interval to CQ and HB messages 2019-02-08 20:53:48 -05:00
Jordan Sherer 81af627836 Cleanup of ellipsis and added custom HB/CQ repeat intervals 2019-02-08 20:45:50 -05:00
Jordan Sherer 35cfbbc2e5 Added feature to store a message locally for another station to retrieve from you later 2019-02-08 19:41:07 -05:00
Jordan Sherer bb348763fb Bump to v0.14.2 2019-02-08 19:40:51 -05:00
Jordan Sherer 4e666fed67 Renamed QTH to INFO to be more generic 2019-02-08 16:57:42 -05:00
Jordan Sherer c8739a1fd6 Bump to v0.14.1 2019-02-08 10:19:46 -05:00
Jordan Sherer 0b2107402e Fixed #116: HB AUTO SPOT was not correctly encoded 2019-02-08 10:03:41 -05:00
Jordan Sherer c31ea332d9 Added 2m to frequency list 2019-02-08 10:00:12 -05:00
Jordan Sherer 4c0c932238 Fixed #117: PTT configuration issue 2019-02-08 09:58:17 -05:00
Jordan Sherer 3584fa4b5e Added QUERY MSG to menu 2019-02-07 22:20:14 -05:00
32 changed files with 1526 additions and 579 deletions
+1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Station location message that is transmitted in response to &amp;quot;@&amp;quot; directed queries.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Station location message that is transmitted in response to &amp;quot;@&amp;quot; directed queries.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
@@ -228,7 +228,7 @@
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Station location message&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Station location message&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="text"> <property name="text">
<string>Station Message (QTH &amp; 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 &amp;&amp; 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
View File
@@ -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
View File
@@ -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);
}
}
+41
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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 "
+4 -2
View File
@@ -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
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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();
} }
+2 -3
View File
@@ -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;
+24 -21
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+24 -8
View File
@@ -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> &params); void sendNetworkMessage(QString const &type, QString const &message, const QMap<QString, QVariant> &params);
@@ -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
View File
@@ -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=&quot;true&quot;] {
<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=&quot;true&quot;] {
<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=&quot;true&quot;] {
<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=&quot;true&quot;] {
<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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Send a saved message&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Reply to a CQ&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Send an SNR message&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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=&quot;true&quot;] {
</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=&quot;true&quot;] {
</size> </size>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Send your station location message&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Send a CQ message&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;justify&quot;&gt;Send a Heartbeat message&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="autoFillBackground"> <property name="autoFillBackground">
<bool>true</bool> <bool>true</bool>
@@ -1432,14 +1368,33 @@ QTextEdit[transmitting=&quot;true&quot;] {
}</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Send a directed message to another station&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Send your station information&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Send a saved message&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Reply to a CQ&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;justify&quot;&gt;Send a Heartbeat message&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Send an signal report&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Send a directed message to another station&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Send a CQ message&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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
View File
@@ -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);
+1
View File
@@ -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:
+5
View File
@@ -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
View File
@@ -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
View File
@@ -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);